Redhat7.3/8.0 : PostfixでのSMTP AUTH(SASL)の設定(sasldbを使う)

2007.08.25


上へ
qmailって良いの?
Postfixのインストール
SMTP AUTHの設定
PostfixでMaildir
SMTP AUTH(PAM)
Postfix2.0
Postfix2.x SMTP AUTHの設定
Postfix2.x  SASL2の設定
  このドキュメントのいくつかは,現バージョンでも使えます。SASL設定確認用のツールも,大体使えます。

ftpサイトにRPMを置いていましたが,削除しました。

手順

何故か,RedHat7.3デフォルトで添付のPostfixは,SMTP AUTH(SASL)のサポートをしていないようです。SRPMのspecファイルでは,そのオプションを指定できるようになっているので,再構築を行います。

  1. Postfixを再構築する(RedHat7.3のみ,8.0では不要)
  2. SASLの設定を行う
  3. postfixにSASLの設定を加える
  4. 確認を行う

 

SASLの設定を行う(RedHat7.3/8.0)

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を実行するたびに,コピーする必要があります。

 

PostfixでのSASLの設定(RedHat7.3/8.0)

コマンド

説明
# 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入れたけど,私的に使う分には何も言えません。商売で使うようなら,クレームするかもしれないけど。(商売って何だろう?)

 

 

Postfixを再構築する(RedHat7.3の場合)

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のパッチを当てたものもあります。これは,以下のソースを組み合わせたモノです。

bulletPostfix 1.1.11ソース + TLS + RedHat 7.3のSRPM(SPECファイルを書き換え)

 

参考

テスト用のシェルを以下に置いておきます。ユーザを作成し,最後に削除します。PerlとMIME::Base64のライブラリが必要です。

bullet LOGIN認証のテストシェル sasldb用
bullet PLAIN認証のテストシェル sasldb用
bullet LOGIN認証のテストシェル PAM用
bulletPLAIN認 証のテストシ%'%k PAM用

PERLでサポートしている認証全てを行うスクリプトです。RedHat8.0 では,全てのPerlライブラリがインストールされていますが,他のプラットホームでは,いくつかのライブラリが必要となります。

bulletSASL認証テスト Perlスクリプト (LOGIN , PLAIN, CRAM-MD5, DIGEST-MD5 全ての認証テスト用)
bulletこのスクリプトは,ユーザを作成しません。スクリプトの中で,以下の変数を設定する必要があります。
bullet$USER - ユーザ名 (事前に作成する)
bullet$PASS - パスワード(事前に設定しておく)
bullet(必要に応じて) $SMTPSERVER - Postfix(またはSMTPサーバ)が動作しているサーバ (スクリプトを実行するサーバと同じ場合,変更する必要はない。)
bulletあとは,適当に変更してください。
bullet非常に適当なコードです。エラー処理も入れていませんし,自分でも理解できていない部分もあります。
bullet以下のライブラリが必要です。
bulletMIME::Base64
bulletDigest::HMAC_MD5
bulletDigest::MD5

SASL認証テスト Perlスクリプトを使ってわかったのですが,PAM認証としていても,CRAM-M5認証とDIGEST-MD5認証は,sasldbを参照しにいくようです。まあ,そういう仕様だから便利かというと,運用を混乱させるだけなので,sasldbを使った方がよいでしょう。

horizontal rule