PostfixでSMTP-AUTHを実装する方法(PAM編)

Debian/LennyでPostfixの設定を行っています。セキュリティ上、SMTP認証を実装するのですが認証するときにPAM認証を利用してOSユーザで認証することにしました。PAM認証を使用するには、「saslauthd」認証デーモンを設定する必要があるのでこの設定とPostfixの設定をまとめておきます。

スポンサーリンク




必要なパッケージのインストール

Debian/Lennyでは、普通にpostfixをインストールすれば、「saslauthd」に対応しているようです。なので、「saslauthd」認証デーモンを含んだ「sasl2-bin」「libsasl2-modules」パッケージをインストールします。その時に、必要なパッケージは、すべて引きずられてインストールされます。

「saslauthd」とPAM認証の連携確認方法

「saslauthd」認証デーモンがPAM認証を使ってOSユーザで認証できているかを確認します。まずは、「saslauthd」認証デーモンの設定ファイルを変更します。設定ファイルは、「/etc/default/saslauthd」です。この設定ファイル内の「START」パラメータと「MECHANISMS」パラメータを以下のように設定します。

START=yes
MECHANISMS="pam"

次に、認証デーモンを再起動します。

root@debian:~# /etc/init.d/saslauthd restart
Stopping SASL Authentication Daemon: saslauthd.
Starting SASL Authentication Daemon: saslauthd.

最後に、OSユーザで認証できるかを確認します。

root@debian:~# /usr/sbin/testsaslauthd -u user001 -p *******
0: OK "Success."

「-u」オプションの後には、OSユーザを「-p」オプションの後には、パスワードを入力します。認証OKの場合には、上記のようなメッセージが表示されます。エラーの場合には、「0: NO “authentication failed”」と表示されます。以上でPAM認証との連携が確認できます。

postfixの設定

postfixの設定ファイルにauth認証の設定を追加します。対象の設定ファイルは、「/etc/postfix/main.cf」です。追加する内容は以下の内容です。

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_application_name = smtpd
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

Postfixとの連携に必要な設定

まずは、OSユーザ:postfixにグループ:saslを追加します。

root@debian:~# adduser postfix sasl
Adding user `postfix' to group `sasl' ...
Adding user postfix to group sasl
Done.

追加されたことを確認します。

root@debian:~# id postfix
uid=107(postfix) gid=108(postfix) groups=108(postfix),45(sasl)

次に、「saslauthd」認証デーモンの設定ファイルを変更します。変更する設定ファイルは、「/etc/default/saslauthd」で変更するパラメータは、「START」「MECHANISMS」「OPTIONS」です。最後の「OPTIONS」については、Postfixがchroot環境で起動している場合に変更が必要です。あとの2つのパラメータは、前述のPAM認証との確認時に設定した内容と同じです。chroot環境かどうかの確認は、Postfixの設定ファイル「 /etc/postfix/master.cf」を確認し、「smtp」で始まる行のchrootの位置に「n」がなければ、chroot環境下で動いています。パラメータに設定する値は、次のとおりです。

START=yes
MECHANISMS="pam"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

「OPTIONS」パラメータで指定したディレクトリを作成します。

root@debian:~# mkdir -p /var/spool/postfix/var/run/saslauthd

Postfixの設定ファイルを作成します。作成するファイルは「/etc/postfix/sasl/smtpd.conf」で設定する内容は、次のとおりです。 PAM認証を利用する場合は、「DIGEST-MD5」や「CRAM-MD5」は、使えないので「PLAIN」と「LOGIN」のみを使用できるように設定します。

pwcheck_method: saslauthd
mech_list: plain login

最後に、それぞれを再起動します。

root@debian:~# /etc/init.d/saslauthd restart
Stopping SASL Authentication Daemon: saslauthd.
Starting SASL Authentication Daemon: saslauthd.

root@debian:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.

設定の確認

telnetコマンドで、SMTP-AUTHが機能していることを確かめます。まずは、「telnet localhost 25」を実行します。

root@debian:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mail.local-debian.jp ESMTP Postfix (Debian/GNU)

次に「EHLO local」を入力します。認証にLOGINやPLAINを許す場合は、以下のように表示されます。「250-AUTH・・・」の行が出力されていれば成功です。

EHLO local
250-mail.local-debian.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

LOGINやPLAINの場合には、Base64のエンコードで認証まで確認できるのでやってみます。まずは、PLAINの場合です。認証に使用するユーザを「user001」、パスワードを「hoge」とすると認証に必要な情報は、以下のコマンドで変換できます。

root@debian:~# perl -MMIME::Base64 -e 'print encode_base64("user001\0user001\0hoge");'
dXNlcjAwMQB1c2VyMDAxAGhvZ2U=

この、「dXNlcjAwMQB1c2VyMDAxAGhvZ2U=」使ってログインします。

root@debian:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mail.local-debian.jp ESMTP Postfix (Debian/GNU)
EHLO local
250-mail.local-debian.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN dXNlcjAwMQB1c2VyMDAxAGhvZ2U=
235 2.7.0 Authentication successful
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

太字の部分が入力する内容です。「AUTH PLAIN」の後ろにエンコードした情報を付けて入力します。

LOGINの場合には、ユーザとパスワードが別々に必要なのでエンコードします。

root@debian:~# perl -MMIME::Base64 -e 'print encode_base64("user001");'
dXNlcjAwMQ==

root@debian:~# perl -MMIME::Base64 -e 'print encode_base64("hoge");'
aG9nZQ==

これらの情報を使ってログインします。

root@debian:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mail.local-debian.jp ESMTP Postfix (Debian/GNU)
EHLO local
250-mail.local-debian.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN
334 VXNlcm5hbWU6
ZS11ZWRh
334 UGFzc3dvcmQ6
dWVkYXB1dXRh
235 2.7.0 Authentication successful
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

太字の部分が入力する内容です。「334 VXNlcm5hbWU6」と「334 UGFzc3dvcmQ6」は、Base64エンコードされているのでデコードしてみると次のようになります。

root@debian:~# perl -MMIME::Base64 -e 'print decode_base64("VXNlcm5hbWU6");'
Username:
root@debian:~# perl -MMIME::Base64 -e 'print decode_base64("UGFzc3dvcmQ6");'
Password:

なので「334 VXNlcm5hbWU6」は、「334 Username:」、「334 UGFzc3dvcmQ6」は、「334 Password:」のことなので、そのとおりに入力すれば、ログインできます。

スポンサーリンク







シェアする

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

フォローする