| このドキュメントのいくつかは,現バージョンでも使えます。SASL設定確認用のツールも,大体使えます。
ftpサイトにRPMを置いていましたが,削除しました。
手順
何故か,RedHat7.3デフォルトで添付のPostfixは,SMTP AUTH(SASL)のサポートをしていないようです。SRPMのspecファイルでは,そのオプションを指定できるようになっているので,再構築を行います。
- Postfixを再構築する(RedHat7.3のみ,8.0では不要)
- SASLの設定を行う
- postfixにSASLの設定を加える
- 確認を行う
Postfix 2.xの場合,一部パラメータが異なってきます。
|
コマンド |
説明 |
# vi /usr/lib/sasl/smtpd.conf
(以下の内容)
pwcheck_method:sasldb |
sasldbを使用する設定 これを設定しなくても,デフォルトがsasldbなので,設定したくても動作します。
PAMを使う方法もありますが,sasldbの方がお奨めです。(PAMの設定) |
# saslpasswd -c -u `postconf -h myhostname`
{ユーザ名}
Password: {パスワード入力:これは表示されない}
Again (for verification): {パスワード入力:これは表示されない} |
/etc/sasldbが作成される |
# chgrp postfix /etc/sasldb
# chmod g+r /etc/sasldb |
postfixが,sasldbを読み込めるようにする。
(これは,最初にsasldbを作ったときのみで,通常は不要の処理) |
| (/と/var/spool/postfixが同じボリュームの場合)
# ln /etc/sasldb /var/spool/postfix/etc |
シンボリックリンクでは,駄目です。
ハードリンクを行います。
(これは,最初にsasldbを作ったときのみで,通常は不要の処理) |
| (/と/var/spool/postfixが違うボリュームの場合)
# cp -p /etc/sasldb /var/spool/postfix/etc |
別ボリュームでハードリンクが行えない場合,コピーします。
この場合,saslpasswdを実行するたびに,コピーする必要があります。 |
|
コマンド |
説明 |
# vi /etc/postfix/main.cf
(以下の内容を追加する) |
|
| main.cfの変更箇所 |
| smtpd_sasl_auth_enable = yes |
SASL認証できるようにする |
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_relay_domains |
smtpd_recipient_restrictions
メールの送信できるユーザの範囲を指定する。 permit_mynetworks
自分のマシンと同じネットワークからのメール送信は,全て認める
permit_sasl_authenticated SASL認証できたユーザからのメールの送信を認める
check_relay_domains 変なドメインからのメールの送信を認めない。 |
| broken_sasl_auth_clients = yes |
OUTLOOKのバグ対策用の設定を含める場合,設定知る。 |
|
| # postfix reload |
|
次のテストシェル(tpplain_sasldb.sh.txt)を実行して,"Test
OK!"と出るなら,SASLが使える状態です。
#!/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=3
SMTPSERVER=localhost
MYDOMAIN=localhost.localdomain
USER=test
PASS=testpass
ENPASS=`perl -MMIME::Base64 -e "print encode_base64(\"$USER\0$USER\0$PASS\");"`
echo $PASS | saslpasswd -p -c -u `postconf -h myhostname` $USER
if [ "x$debug" = "xdebug" ] ; then
sasldblistusers
fi
(
echo "EHLO $MYDOMAIN"
echo "AUTH PLAIN $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.$$
saslpasswd -d -u `postconf -h myhostname` $USER
if [ "x$debug" = "xdebug" ] ; then
sasldblistusers
fi
exit 1 |
実行例はこんな感じです。
|
コマンド |
説明 |
| # sh tpsasl.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 PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz
235 Authentication successful
QUIT
221 Bye
Connection closed by foreign host.
#
235 Authentication successful
Test Ok! Congratulations. |
サーバの性能にもよりますが,PRE_SLEEP, POSTSLEEPを調整して,SMTPサーバ(Postfix)のメッセージが表示されるようにしてください。
あと,テスト用のユーザとパスワードは,USERとPASS変数で設定します。これは最後に消されます。実在のユーザで有れば,SASL
DBからアカウントが消されるので注意しましょう。
あとは,シェルを読んでいろいろ試してください。
Copyright入れたけど,私的に使う分には何も言えません。商売で使うようなら,クレームするかもしれないけど。(商売って何だろう?) |
RedHat8.0 の場合は,リコンパイルは不要です。
|
コマンド |
説明 |
| # rpm -ivh postfix-1.1.7-2.src.rpm |
ソースをインストールします。 |
| # cd /usr/src/redhat/SPECS |
ここにSPECファイルが作成されます。 |
# vi postfix.spec
(以下のように修正する)
| オリジナル |
修正後 |
| %define SASL 0 |
%defile SASL 1 |
|
修正箇所は,SPECファイルの先頭の方にあります。
SASLの他に,MySQLとかLDAPを使う場合のフラグがあります。 |
| # rpm -ba postfix.spec |
SPECファイルから,コンパイルして,RPMを作成します。 |
| # cd /usr/src/redhat/RPMS/i386 |
|
| # rpm -ivh postfix-1.1.7-2.i386.rpm --force |
|
ついでに,postfix 1.1.11のソースにRedHatのパッチを当てたものもあります。これは,以下のソースを組み合わせたモノです。
テスト用のシェルを以下に置いておきます。ユーザを作成し,最後に削除します。PerlとMIME::Base64のライブラリが必要です。
PERLでサポートしている認証全てを行うスクリプトです。RedHat8.0 では,全てのPerlライブラリがインストールされていますが,他のプラットホームでは,いくつかのライブラリが必要となります。
 | SASL認証テスト
Perlスクリプト (LOGIN , PLAIN, CRAM-MD5, DIGEST-MD5 全ての認証テスト用)
 | このスクリプトは,ユーザを作成しません。スクリプトの中で,以下の変数を設定する必要があります。
 | $USER - ユーザ名 (事前に作成する) |
 | $PASS - パスワード(事前に設定しておく) |
 | (必要に応じて) $SMTPSERVER - Postfix(またはSMTPサーバ)が動作しているサーバ
(スクリプトを実行するサーバと同じ場合,変更する必要はない。) |
|
 | あとは,適当に変更してください。 |
 | 非常に適当なコードです。エラー処理も入れていませんし,自分でも理解できていない部分もあります。 |
 | 以下のライブラリが必要です。
 | MIME::Base64 |
 | Digest::HMAC_MD5 |
 | Digest::MD5 |
|
|
SASL認証テスト
Perlスクリプトを使ってわかったのですが,PAM認証としていても,CRAM-M5認証とDIGEST-MD5認証は,sasldbを参照しにいくようです。まあ,そういう仕様だから便利かというと,運用を混乱させるだけなので,sasldbを使った方がよいでしょう。

|