注意
PostfixでSMTP AUTHを利用する場合,PAMは,推奨されていません。
/usr/share/doc/postfix-1.1.11/README-Postifx-SASL-RedHat.txt からの引用
Since most of Postfix runs as non-root and access to
authentication
via PAM routines or to /etc/shadow requires root, we'll only discuss
authentication using sasldb; |
訳
Postfixは,non-rootユーザで実行され,PAMの認証でもnon-rootでアクセスされる。
一方で,/etc/shadowへのアクセスではrootユーザが要求される。そのため
Redhatでは,sasldbを使う認証を検討した。 |
PAMの認証では,CRAM-MD5,DIGEST-MD5の認証は使われませんので,セキュリティの面からも,sasldbを使うことが推奨されます。
手順
PAMの認証で,何を使うかにもよりますが,シャドーパスワード(/etc/shadow)を使う場合の手順を示します。LDAPやMySQLを使う場合は,PAMの設定ファイルを変更すれば良いでしょう。
シャドーパスワードを使用する場合,/etc/shadowファイルを参照します。このファイルは,パスワードが変更されるたびに,削除と作成を行います。そのため,ハードリンクしてもパスワードが変更されるとリンクが切れていまいます。つまり,CHROOTして使用される/var/spool/postfix配下のファイルと同期が取れなくなります。
同期をとるための仕組みを考えるか,CHROOTしてPostfixを使わないかの選択ですが,ここではCHROOTしない手順を書きます。
- SASLの設定を行う。
- /etc/shadowを参照できるようにする
- postfixのsmtpdをCHROOTしない設定に変更する
- postfixの設定ファイル(main.cf)にSASLの設定を加える
RedHat 7.3での確認はしていませんが,同じような手順と思います。
SASLの設定を行う(RedHat8.0)
|
コマンド |
説明 |
# vi /usr/lib/sasl/smtpd.conf
(以下の内容)
pwcheck_method:pam |
PAMを使用する設定
これで,ユーザの認証は,Loginとかで使用されるパスワード認証になります。
ユーザを作成(useradd等)し,パスワードを設定しましょう(passwd) |
| # vi /etc/group
| 追加 |
srvadmin:x:201:root,postfix |
|
/etc/shadowを参照するため,グループの設定を行います。
ここでは,srvadminというグループを作成しました。rootとpostfixをグループに入れています。 |
# chgrp srvadmin /etc/shadow
# chmod g+r /etc/shadow |
postfixが,/etc/shadowを読み込めるようにする。
/etc/shadow の元のパーミッションは以下の通り。(B
-r-------- 1 root root /etc/shadow |
Postfixの設定を変える(RedHat8.0)
|
コマンド |
説明 |
| # vi /etc/postfix/master.cf
| 修正前 |
smtp inet n - y - - smtpd |
| 修正後 |
smtp inet n - n - - smtpd |
|
CHROOTしない設定にします。 CHROOTの項目を"y"から"n"に変更するだけです。 |
# vi /etc/postfix/main.cf
(以下の内容を追加する)
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_relay_domains
broken_sasl_auth_clients = yes |
これは,sasldbを使う場合と同じです。 |
# postfix reload
または,
# postfix stop ; postfix start # リスタート
|
SASLの設定を変更した場合は,リスタートしてください。 |
確認を行う
ユーザを作成し,次のテストシェル(tplogin_pam.sh.txt)を実行して,"Test
OK!"と出るなら,SASLが使える状態です。
CAM-MD5認証はうまくいきませんでした。やはり,sasldbを使う方がお奨めです。
#!/bin/sh
##########################################################################
# Postfix SASL Test Script
# Copyright (C) 2002, Hiroaki Izumi. All right reserved.
##########################################################################
debug="debug" # debug option
#debug="" # no debug
# ------------------------------------------------------------------------
PRE_SLEEP=2
POST_SLEEP=8
SMTPSERVER=localhost
MYDOMAIN=localhost.localdomain
USER=test
PASS=testpass
ENUSER=`perl -MMIME::Base64 -e "print encode_base64(\"$USER\");"`
ENPASS=`perl -MMIME::Base64 -e "print encode_base64(\"$PASS\");"`
CRYPT=`htpasswd -b -d -n test testpass | cut -d: -f2`
useradd -p $CRYPT $USER
(
echo "EHLO $MYDOMAIN"
echo "AUTH LOGIN"
echo $ENUSER
echo $ENPASS
echo "QUIT"
) | while read cmd ; do
sleep $PRE_SLEEP
echo $cmd 1>&2
echo $cmd
sleep $POST_SLEEP
done | telnet $SMTPSERVER smtp 2>&1 | tee result.$$
echo "#"
if grep "235 Authentication successful" result.$$ ; then
echo "Test Ok! Congratulations."
else
echo "Test NG. Check your setting."
fi
rm -f result.$$
userdel $USER
exit 1 |
実行例はこんな感じです。
|
コマンド |
説明 |
# sh tplogin_pam.sh.txt
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.aritia.org ESMTP Postfix (1.1.11)
EHLO localhost.localdomain
250-mail.aritia.org
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-XVERP
250 8BITMIME
AUTH LOGIN
334 VXNlcm5hbWU6
dGVzdA==
334 UGFzc3dvcmQ6
dGVzdHBhc3M=
235 Authentication successful
QUIT
221 Bye
Connection closed by foreign host.
#
235 Authentication successful
Test Ok! Congratulations. |
ユーザとパスワードは事前に設定してください。 サーバの性能にもよりますが,PRE_SLEEP, POSTSLEEPを調整して,SMTPサーバ(Postfix)のメッセージが表示されるようにしてください。
あと,テスト用のユーザとパスワードは,USERとPASS変数で設定します。シェルの中で作成し,最後に削除しますので,存在するユーザにしないでください。
あとは,シェルを読んでいろいろ試してください。
Copyright入れたけど,私的に使う分には何も言えません。商売で使うようなら,クレームするかもしれないけど。(商売って何だろう?) |
CHROOTして使う場合
以下のファイルを/var/spool/postfix配下に置けば,CHROOTしたsmtpdでも使えます。この場合,/etc/passwdと/etc/shadowをどう同期させるかが問題になります。
LDAP認証やMySQLを使う認証の場合,/etc/pam.d/smtpを書き換える必要があります。その認証の場合,/etc/shadowは参照しないので,PAMも
もっと使いやすいかもしれません。
 | /etc/pam.d/smtp |
 | /etc/pam.d/system-auth |
 | /etc/pam.d/other |
 | /lib/security/* |
 | /usr/lib/libcrack.so* |
 | /lib/libpam.so* |
 | /lib/libpam_mics.so* |
 | /lib/libpamc.so* |
 | /etc/security/* |
 | /etc/passwd |
 | /etc/shadow |
参考
ちなみに,PAMの代わりに,/etc/shadowを使う場合も同じ手順です。shadowパスワードでの認証では,"pwcheck_method:
shadow"と設定するだけです。PAMが使えるのではあまり意味がありません。たぶん,passwdも同じ手順でしょう。
テスト用のシェルを用意しました。sasldbを使う手順の方に,少し説明をしています。

|