BLOGTIMES
2014/05/27

CentOS 6 + Postfix + MySQL + postfixadmin + Dovecot をインストール(その2)

  postfix  systemmanagemant  dovecot 
このエントリーをはてなブックマークに追加

今日は電車に閉じ込められてしまったので、電車の中でセットアップを続行します。。。

postfixadmin は便利なのですが、認証として CRAM-MD5 を有効にしようとすると原理上パスワードは平文保存が必須になります。そうすると、ちょっとしたデータベースメンテナンスの時に平文のパスワードが見えてしまうという問題があります。気にしなければよいという話もありますが、やはりパスワードが見えてしまうのはイヤなので気持ちの問題かもしれませんが、AES を使ってパスワードを暗号化することにしました。

AES は対称暗号なので、MD5 などのハッシュと違って平文に戻すことができます。しかも MySQL にはビルトインで AES_ENCRYPT() / AES_DECRYPT()*1 という関数があるので、DB のレイヤーで透過的に暗号化・復号化を行うことができます。

実際に MySQL のコンソールで試すとこんな感じになります。
TO_BASE64() / FROM_BASE64()*2を使っているのは、AES_ENCRYPT() の戻り値がバイナリなので、文字列としてパスワードをフィールドに格納できるようにするためです。

mysql> SELECT TO_BASE64(AES_ENCRYPT('clear_text','####AES_PASS####')); +---------------------------------------------------------+ | TO_BASE64(AES_ENCRYPT('clear_text','####AES_PASS####')) | +---------------------------------------------------------+ | o7qqc0S6WgIfxewcrjlKTA== | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT AES_DECRYPT(FROM_BASE64('o7qqc0S6WgIfxewcrjlKTA=='),'####AES_PASS####'); +-------------------------------------------------------------------------+ | AES_DECRYPT(FROM_BASE64('o7qqc0S6WgIfxewcrjlKTA=='),'####AES_PASS####') | +-------------------------------------------------------------------------+ | clear_text | +-------------------------------------------------------------------------+ 1 row in set (0.00 sec)

以下、作業メモ。

設定ファイルの書き換え

config.inc.php に mysql_aes という設定と、AES のパスワードの設定部分を追加します。
####AES_PASS#### の部分は使用時にランダムな文字列に書き換えてください。

--- config.inc.php.org 2013-12-26 23:35:02.000000000 +0900 +++ config.inc.php 2014-05-27 23:07:23.889109336 +0900 @@ -132,7 +132,9 @@ // authlib = support for courier-authlib style passwords // dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'. Example: dovecot:CRAM-MD5 // (WARNING: don't use dovecot:* methods that include the username in the hash - you won't be able to login to PostfixAdmin in this case) -$CONF['encrypt'] = 'md5crypt'; +$CONF['encrypt'] = 'mysql_aes'; +$CONF['encrypt_aes'] = '####AES_PASS####'; // In what flavor should courier-authlib style passwords be encrypted? // md5 = {md5} + base64 encoded md5 hash

暗号化部分の追加

postfixadmin は md5crypt などのハッシュ化パスワードでも同じアルゴリズムが使えるように、プログラム中には「平文→暗号文」という処理しかありません。このため、暗号化の部分に手を入れてやるだけでパスワードの AES 化を行うことができます。そんなわけで、下記のような簡単なパッチで対応させることができました。

--- functions.inc.php.org 2014-05-07 04:46:27.000000000 +0900 +++ functions.inc.php 2014-05-27 23:03:11.919101547 +0900 @@ -886,6 +886,13 @@ $l = db_row($res["result"]); $password = $l[0]; } + + elseif ($CONF['encrypt'] == 'mysql_aes') { + $pw = escape_string($pw); + $res=db_query("SELECT TO_BASE64(AES_ENCRYPT('".$pw."','".$CONF['encrypt_aes']."'));"); + $l = db_row($res["result"]); + $password = $l[0]; + } elseif ($CONF['encrypt'] == 'authlib') { $flavor = $CONF['authlib_default_flavor'];

後は Dovecot で認証するときに SQL でパスワードが平文で取り出されるようにしてあげれば OK なはずです。
その3に続きます。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6750
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン