snbhsmt_log

ネットワークとコンピュータ、その他いろいろ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Dovecot の login_dir の値を変更

起動時に、rm コマンドが /var/run/dovecot/login はディレクトリだと コンソールにエラー出力していたので対処した。 原因は rc.sysinit が /var/run 以下をファイルとして削除するため。

/var/run/dovecot/login ディレクトリは Dovecot が認証プロセス用に UNIX ドメイン・ソケットを作成する場所。

$ ls -F /var/run/dovecot
auth-worker.1790=  dict-server=  login/  master.pid
エラーメッセージが quota の処理の後に出ているのと、消そうとしているのが /var/run の中だという事から /etc/rc.d/rc.sysinit の中を探すと以下が見つかった。 これだと rm -f /var/run/dovecot/login しようとして確かにエラーになる。
# Clean up /var.  I'd use find, but /usr may not be mounted.
for afile in /var/lock/* /var/run/* ; do
        if [ -d "$afile" ]; then
           case "$afile" in
                */news|*/mon)   ;;
                */sudo)         rm -f $afile/*/* ;;
                */vmware)       rm -rf $afile/*/* ;;
                */samba)        rm -rf $afile/*/* ;;
                *)              rm -f $afile/* ;;
           esac
        else
           rm -f $afile
        fi
done

認証プロセス用の UNIX ドメイン・ソケットを /var/run/dovecot/login ディレクトリに 作成する事は、Dovecot の設定ファイル dovecot.conf の login_dir で指定されている。

login_dir = /var/run/dovecot/login
なのでこれを以下の様に変更する。
login_dir = /var/run/dovecot-login
こうすると、認証プロセス用 UNIX ドメイン・ソケットは /var/run/dovecot-login ディレクトリ中に作成されるようになり、/etc/rc.d/rc.sysinit での処理は rm -f /var/run/dovecot-login/* となるのでエラーが出なくなる。

  • CentOS 4.3
  • dovecot-1.0.rc1.tar.gz
スポンサーサイト

Dovecot が保存する CRAM-MD5 認証用パスワード

チャレンジ・レスポンス型の認証 (CRAM-MD5, APOP など) では、 その認証方式の性質上、サーバに保存するパスワードは平文のままで なければならないと思っていた。 しかし、Dovecot が CRAM-MD5 認証用に保存するパスワードは平文ではない。

$ dovecotpw -s HMAC-MD5
Enter new password: secret
Retype new password: secret
{HMAC-MD5}cd3ba7deaad6e5ca23448ba42e379747a9e0f7f1fbc00c8a81bbaac395731b56
この HMAC-MD5 という物はハッシュ値のようだが、 この文字列は HMAC-MD5 値では無く、HMAC-MD5 算出途中の値らしい。

この値は以下の様に求められている。

HMAC-MD5 とは MD5 の HMAC なので、まず MD5 について言うと、 MD5 の多くの実装は MD5Init, MD5Update, MD5Final の 3 つの処理からなる。 MD5Init と MD5Final は最初と最後に 1 度だけ実行され、 MD5Update は MD5 値を求めようとするデータの 64 バイト毎に繰り返し実行される。 MD5 のアルゴリズムを以下とすると、

MD5(X, Y)
データが 64 バイト以下の場合、その処理は以下の様になる。
1: MD5Init()
2: MD5Update(X)
3: MD5Update(Y)
4: MD5Final()

一方 HMAC のアルゴリズムは以下で、

H(K XOR opad, H(K XOR ipad, text))
HMAC-MD5 の場合、上記の H が MD5 になる。 そして CRAM-MD5 では上記の K がパスワード、text がチャレンジ文字列なので 結果以下となる。
MD5(password XOR opad, MD5(password XOR ipad, challenge))
するとこちらの処理は以下となる。
1: MD5Init()
2: MD5Update(password XOR ipad)
3: MD5Update(challenge)
4: MD5Final()              <--- この結果が MD5(X, Y) の Y
5: MD5Init()
6: MD5Update(password XOR opad)
7: MD5Update(Y)
8: MD5Final()              <--- これで HMAC-MD5 値が完成

この手順を考えてみると、challenge は認証が開始されるまで不明だが password はサーバ側に保存する物なので、 2 と 6 は予め計算しておくことが可能だと解る。 そしてこの 2 と 6 の結果を連結したものが Dovecot が CRAM-MD5 認証用に 保存しているパスワードだ。

MD5 のアルゴリズムについて詳しく無いので、 この MD5Final する前の状態でも一方向ハッシュとしての性質を 備えているのかどうか判らないが、もしそうなら、この値から元のパスワードを 知る事はできない。 ただし、パスワードファイルの内容とチャレンジ文字列から HMAC の計算を続行し、CRAM-MD5 における authenticate コマンドの レスポンスを返す事が出来そうなので、わざわざ計算途中の値を保存しても 意味無いと思うのだけど。

ちなみに APOP は MD5(challenge, password) なので同じ事はできない。

参考:
HMAC: メッセージ認証のための鍵付ハッシング
MD5 メッセージダイジェストアルゴリズム
IMAP4 and CRAM-MD5 Authentication

Top

HOME

Author:snbhsmt
Google Profiles

http://www.ksky.ne.jp/~snbhsmt/

全ての記事を表示する

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。