今日は電車に閉じ込められてしまったので、電車の中でセットアップを続行します。。。
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に続きます。