メールサーバから受信するぞ~

VineLinux + postfix + postfixadmin + MySQL + Courier-IMAPでバーチャルユーザのメールサーバを構築中であるが、いよいよ接続試験。
クライアントのメールソフトから接続するとSMTP、POPともに認証でエラーになる。

postfixadminでユーザを登録するとサーバ上にはバーチャルユーザのフォルダが作成され、welcomeメールも作成されていた。

と、いうことは構築に大きな誤りはなさそう。(だと、いいんだけど)

ひとまず、POP(Courier-IMAP)の方から調べてみる。

【詳細なログを出力するようにauthdaemonrcの記述を変更する】

 # vi /etc/authlib/authdaemonrc

 DEBUG_LOGIN=0
 ↓
 DEBUG_LOGIN=1若しくはDEBUG_LOGIN=2に変更

【authdaemondを再起動し、設定を有効にする】
 # /etc/init.d/courier-authlib restart

【telnetで110番ポートにアクセスし、エラーを出す】
 # telnet 192.168.1.xx 110
 Trying 192.168.1.xx…
 Connected to 192.168.1.xx.
 Escape character is ‘^]’.
 user test
 +OK Password required.
 pass testpass
 -ERR Login failed.

【ログを見る(私の環境の場合、/var/log/maillog)】
 エラーになったSQL文が出力されている。(一部省略、ドメイン名等は変更してますが..こんな感じ)

 authdaemond: SQL query: SELECT username , password, “”, ‘10000’, ‘10000’, ‘/hogehoge/vuser’, maildir, “”, name, “” FROM mailbox WHERE username = “test”
 authdaemond: zero rows returned
 authdaemond: no password available to compare

ちゃんとSQLは発行されている。authdaemodはそれなりに動いているが、パスワードが拾えてきていないようだ。(というより、usernameがtestのものが無いって言ってるんだけど。)

【MySQL上のpostfixデータベースを確認してみる】

 # mysql -p -u postfix
 Enter password:
 mysql> use postfix

==mailboxテーブルのカラム名を調べる==

 mysql> DESC mailbox;
 +———-+————–+——+—–+———————+——-+
 | Field    | Type     | Null | Key | Default      | Extra |
 +———-+————–+——+—–+———————+——-+
 | username | varchar(255) |   | PRI |           |   |
 | password | varchar(255) |   |  |           |   |
 | name   | varchar(255) |   |  |           |   |
 | maildir  | varchar(255) |   |  |           |   |
 | quota  | int(10)    |   |  | 0          |   |
 | domain  | varchar(255) |   |  |           |   |
 | created | datetime   |   |  | 0000-00-00 00:00:00 |   |
 | modified | datetime  |   |  | 0000-00-00 00:00:00 |    |
 | active  | tinyint(1)  |   |  | 1          |    |
 +———-+————–+——+—–+———————+——-+

 9 rows in set (0.02 sec)

 usernameとname..
  usernameにプライマリキーがついているが、念のためpostfixadminでテストデータを登録して調べた。
  username:postfixadminの画面で「ユーザ名(アドレス)」となっているフィールド
 name:postfixadminの画面で「名前」となっているフィールド

==登録されているデータを調べる==

 mysql> select * from mailbox \G
 *************************** 1. row ***************************
 username: test@hogehoge.com
 password: $1$2ff96961$A/OHLQv.t5ahqcw1crTPM1
  name:
 maildir: test@hogehoge.com/
  quota: 0
  domain: hogehoge.com
 created: 2006-10-10 19:44:47
 modified: 2006-10-10 19:44:47
 active: 1
 1 row in set (0.00 sec)

 mysql>

ちゃんとパスワードも暗号化されてるみたいで一安心。

で、肝心のエラーの原因は、SQL文で「WHERE username = “test”」となっているにも関わらず、DBには「test@hogehoge.com」とドメイン名まで登録されていることのようだ。

じゃあ、これは登録する側のpostfixadminのconfig.inc.pnpか読み込む側のauthdaemondのauthmysqlrcの設定だろう。
でも、usernameはプライマリキーになっている以上一意にするためにドメイン名を含むことはしごく当然。

ということで、authmysqlrcを調べる。

# DEFAULT_DOMAIN example.com
とコメントになったままがまずいのか?

【authmysqlrcの修正】

 DEFAULT_DOMAIN hogohoge.comとコメントをはずして有効にする修正をしてみる。

【authdaemondを再起動し、設定を有効にする】
 # /etc/init.d/courier-authlib start

【telnetで110番ポートにアクセスして確認】
 # telnet 192.168.1.xx 110
 Trying 192.168.1.xx…
 Connected to 192.168.1.xx.
 Escape character is ‘^]’.
 user test
 +OK Password required.
 pass testpass
 +OK logged in.

 どうやら認証できたようだ

【ログを見る】
 (一部省略、ドメイン名等は変更してますが..こんな感じ)

 authdaemond: SQL query: SELECT username , password, “”, ‘10000’, ‘10000’, ‘/hogehoge/vuser’, maildir, “”, name, “” FROM mailbox WHERE username = “test@hogehoge.com”
 authdaemond: password matches successfully
 authdaemond: authmysql: sysusername=, sysuserid=10000, sysgroupid=10000, homedir=/hogehoge/vuser, address=test@hogehoge.com, fullname=, maildir=test@hogehoge.com/, quota=, options=

 どうやら大丈夫。

【クライアントのメールソフトで受信確認】
 postfixadminのwebcomeメッセージが届く

【ログの出力レベルを元に戻す(authdaemonrcの記述を変更する)】

 # vi /etc/authlib/authdaemonrc

 DEBUG_LOGIN=0

【authdaemondを再起動し、設定を有効にする】
 # /etc/init.d/courier-authlib start

で、受信の認証はOKと言いたいが。修正した内容は「DEFAULT_DOMAIN hogehoge.com」。

デフォルトはいいんだが、バャーチャルホストなんかにした時は誰がここを書き換えるんじゃ?

解決は一日1個。欲張ってはいけない。