Redhat9.0 : Postfix2.0でのSMTP AUTH(SASL)の設定

2003.08.02


上へ
qmailって良いの?
Postfixのインストール
SMTP AUTHの設定
PostfixでMaildir
SMTP AUTH(PAM)
Postfix2.0
Postfix2.x SMTP AUTHの設定
Postfix2.x  SASL2の設定
 

Index

bullet手順
bulletSASLの設定を行う
bulletpostfixにSASLの設定を加える
bullet確認方法
bullet参考

horizontal rule

 

手順

 

SASLの設定を行う(Postfix2.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の設定(Postfix2.0)

コマンド

説明
# vi /etc/postfix/main.cf
(以下の内容を追加する)
 
main.cfの変更箇所
smtpd_sasl_auth_enable = yes SASL認証できるようにする
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    permit_auth_destination,
    reject
smtpd_recipient_restrictions メールの送信できるユーザの範囲を指定する。

permit_mynetworks 自分のマシンと同じネットワークからのメール送信は,全て認める
bullet$mynetworksに記述されているネットワークなら認める。

permit_sasl_authenticated SASL認証できたユーザからのメールの送信を認める

permit_auth_destination 次の送信先を認める。このパラメータを指定する場合,同じパラメータを
bullet以下のアドレスにマッチするものは,認める
bullet$inet_interfaces
bullet$mydestination
bullet$virtual_alias_domains
bullet$virtual_mailbox_domains
bullet以下のドメイン,または,サブドメインなら,認める
bullet$relay_domains
bullet送信者がルーティングを指定している場合は,このパラメータの制御範囲外です。

reject 上記以外のケースの場合,拒絶する。

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

 

参考

テストスイート

テスト用のシェルを以下に置いておきます。ユーザを作成し,最後に削除します。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を使った方がよいでしょう。

 

攻撃ログ

こんなのでアタックされました。(Username/Password部分は,デコートしています)

こういうy簡単なパスワードは駄目だよ,という例。

Out: 220 mail.example.org ESMTP Postfix (2.0.13)
In:  EHLO laptop
Out: 250-mail.exaple.org
Out: 250-PIPELINING
Out: 250-SIZE 10240000
Out: 250-VRFY
Out: 250-ETRN
Out: 250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
Out: 250 8BITMIME
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      webmaster
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      webmaster12
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      webmaster123
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      "
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      1
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      111
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      123
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      1234
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      12345
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      123456
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      1234567
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      12345678
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      654321
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      54321
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      00000000
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      88888888
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      admin
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      root
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      pass
Out: 535 Error: authentication failed
In:  AUTH LOGIN
OUT 334 Username:
In      webmaster
OUT 334 Password:
In      passwd
Out: 535 Error: authentication failed
Out: 421 Error: too many errors
             

 

horizontal rule

改正歴

2003.05.19 Postfix2.0.9用に記述した
2003.05.25 少しパラメータを変えた。この方が,たいていの場合,良いであろう。
2003.08.02 アタックの例追加

 

horizontal rule