2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

Postfix + SMTP-AUTH2(SASL2)のセットアップ!

従来より、メールサーバのセキュリティには話題が事欠かない。ウィルスしたり、SPAMしたり・・・・。
最近は、SPAMメールに困ってる方は多いだろう。オープンリレーといって、元々メールサーバの構築時点でのユーザによる設定ミスが原因で、他のホストからそのメールサーバの適当なアカウントのユーザになりすまして第三者へメールを送信することだ。最近は、サーバ用のMTAモジュールもさすがにデフォルトでオープンリレー禁止の設定になっているので従来よりは問題は無くなった。しかし、こういう問題が起こるのもSMTPが持つ欠点に起因する。
ご存じのように、SMTPは認証プロトコルで無いため、単独では誰でも送信できてしまう。では、なぜSMTPは認証をつけてないかというと、SMTPはPOPのように受信機能だけではない、送信と受信の両方の機能を持っている。しかも、その受信側は認証を付けてしまうと別途サーバ間で認証アルゴリズムを構築しなければならなくなり、自由度が無くなる。つまり、極論を言えばメールサーバ間でそのサーバ内のユーザにとって必要なメールかメールでないかの判断は出来ないだろう。SMTPに認証が必要なのは、あくまでも送信側であって、送信側にのみ認証が必要なので有れば個別にプラグイン認証を付ければ良いという判断である。
したがって、SMTPには以下のようなセキュアーな対策が取られている。
■ 自ドメインのみからの配送を制限するアクセス制御を掛ける
これは、簡単でなんとなく良さそうだが、ドメインユーザが自ドメイン以外の場所から自ドメインのアカウントを使ってメールを配送したい場合は非常に不便である。

■ POP before SMTP
反対にPOPは認証プロトコルなので、これをSMTPにも利用できないかということで考案された技術。つまり、SMTPの認証をPOP認証で代用しようと言う訳だ。この方法の詳細は、送信するときに予めPOP受信を行ってからユーザのホストIPアドレスをゲットし、POP受信時点からタイマーをスタートさせ、そのタイマーの設定時間の間、POP受信時に許可されたIPアドレスのユーザの送信が許可される。この、POP before SMTPの欠点は、メールを送信する前にPOPを通すため、その分送信が遅れる、さらに、自動POP before SMTPに対応してないメールソフトを使う場合、送信操作が面倒になる(手動でメール送信前に受信動作をしなければならない)。また、メールサーバにMailBoxを持ってない人はメールの送信ができない、そんでもって、ダイヤルアップ回線やIPマスカレードを使っている場合、認証した直後ならIPアドレスでタイマーを掛けるので同じLAN内の他の人がメールを送信できてしまう。

■ SMTP-AUTH
さて、ここまで話せばこの技術の内容は解ると思う。これは、SMTP単独でユーザ個別認証が掛けられる技術である。 しかも、そのパスワードもPLAINなパスワードだけではなく、スクランブルに対応したMUAからはCRAM-MD5等が掛けられる。古いsasl1のネタは [Postfix + SMTP-AUTH (SASL)のセットアップ!]を参照。

このような、SMTPを安全な物にするための手段があり、SMTP-AUTHはある意味、前述の3つの対策の中では一番優れていると考える。以降、Postfix+SASL2のセットアップについて説明する。テスト環境は以下である。

OS : DebianLinux5.0.4 Lenny


1. インストール作業

インストール作業は定番の apt-get で楽ちんインストールで行う。

1) Postfixのインストール
Postfixは、SASLに対応させるためTLS版をインストールしなければならない。Postfixの設定は、 [Postfixの導入!]を参照すること。さらに細かい設定は、 [Postfixのセキュリティパラメータ(2013年04月改訂版)!]を参照すること。

ns:/# apt-get install postfix-tls

2) SASL2のインストール
SASL2は、モジュールが分かれているので注意が必要だ。

ns:/# apt-get install sasl2-bin libsasl2-modules libsasl2-2 libsasl2-dev

念のためセットアップモジュールの確認おばいたしましょう。
ns:/# dpkg -l | grep sasl2


2.設定作業

1) アカウントの作成と削除
■ アカウント作成
ns:/# saslpasswd2 -c -u `postconf -h myhostname` username
Password: ******
Again (for verification): ******

もしくは、
ns:/# saslpasswd2 -c -u myhostname username

■ アカウント削除
ns:/# saslpasswd2 -d -u `postconf -h myhostname` username

もしくは、
ns:/# saslpasswd2 -d -u myhostname username

2) アカウントの登録確認
ns:/etc# sasldblistusers2
username@ns.xxxxxxx.net: userPassword

3) パスワードチェックメソッドの指定(利用したい方法にあわせてどれか1つを指定する)

ns:/# vi /usr/lib/sasl2/smtpd.conf

■ SASLチェック用デーモンを利用する場合
pwcheck_method: saslauthd
mech_list: plain login
(PAM,shadowではcram-md5等が使えないため、plainおよびlogin認証のみに限定する)

■ SASL用パスワードファイルを利用する場合
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: cram-md5 digest-md5 plain login
(これを指定しないと、CRAM-MD5が使えてもplainが優先されてしまうことがある)

■ Unixパスワードデータベースを利用する場合
pwcheck_method: pwcheck

saslauthdを使用すると、pamやLDAP、MySQLなどを利用した認証も使えるようになる (configure時に指定が必要)。saslauthdを利用する場合、 Postfixを起動する前に以下のようにデーモンを起動しておく必要がある。

ns:/# /usr/sbin/saslauthd -a pam (PAMを利用した認証を使う場合)
ns:/# /usr/sbin/saslauthd -a shadow (/etc/shadowファイルを使う場合)

auxprop (CyrusSASL 1.xではsasldbという名前だった) を使用する場合、
ns:/# chgrp postfix /etc/sasldb2
ns:/# chmod g+r /etc/sasldb2
ns:/# ln /etc/sasldb2 /var/spool/postfix/etc/
注:以降、ユーザ登録の度に上記のコピー作業を行うこと。

4) smtpd.confをコピーする(必ずしも必要ではない)
postfix-tlsをインストールすると/etc/postfix/sasl ディレクトリが自動的に出来る。そこへ編集したsmtpd.confをコピーしておく。
ns:/# cp /usr/lib/sasl2/smtpd.conf /etc/postfix/sasl/

5) Postfix側の設定
■ main.cfの設定
セキュリティの為に、セキュリティ設定に noplaintext を設定してPlainテキストでの認証を禁止にして、CRAM-MD5のみとします。

ns:/# vi /etc/postfix/main.cf

省略
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous, noplaintext
broken_sasl_auth_clients = yes

smtpd_recipient_restrictions = permit_mynetworks,
                     regexp:/etc/postfix/recipient_checks.reg,
                     check_sender_access hash:/etc/postfix/bad_sender,
                     reject_rbl_client relays.ordb.org,
                     reject_rbl_client spamcop.net,
                     reject_rbl_client dynablock.wirehub.net,
                     reject_rbl_client opm.blitzed.org,
                     reject_non_fqdn_recipient,
                      permit_auth_destination,
                   permit_sasl_authenticated,
                     reject_unauth_destination
省略

青字の部分がsasl2独自の設定。

■ master.cfの設定

ns:/# vi /etc/postfix/master.cf

省略
smtp-amavis unix – – n – 2 smtp
  -o smtp_data_done_timeout=1200
  -o disable_dns_lookups=yes
127.0.0.1:10025 inet n – n – – smtpd
  -o smtpd_sasl_auth_enable=yes
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtp_error_sleep_time=0
  -o smtp_soft_error_limit=1001
  -o smtp_hard_error_limit=1000

注:-oの前のスペースに意味があるので注意すること。


3.動作確認

ns:/# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 ns.xxxxxxx.net ESMTP Postfix
EHLO localhost
250-ns.xxxxxxx.net
250-PIPELINING
250-SIZE 51200000
250-ETRN
250-AUTH NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5

250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

赤字が入力文字で青字の表示が出たら成功。この状態で、CRAM-MD5スクランブル認証になっている。
お疲れさまでした!


4.MUAの設定

SMTP-AUTH用メールクライアントの設定は、

http://www.club.kyutech.ac.jp/support/manual/smtpauth.html

を参照するとよいだろう。MUAを設定したら、SMTP-AUTHの認証をしない場合、Rejectしてメール送信不可。認証をした場合、メール送信が正常に出来ることを確認すること。


5.ログの確認


ログの確認は正常動作の指標なので必ずチェックした方がいい。サーバ管理は、ログで始まりログで終わる。

ns:/# more /var/log/mail.log
省略May 26 08:58:00 ns postfix/smtpd[4112]: connect from unknown[xxx.xxx.xxx.xxx]
May 26 08:58:01 ns postfix/smtpd[4112]: NOQUEUE: reject: RCPT from unknown[xxx.xxx.xxx.xxx]: 554 <xxxx@xxxxxxx.com>: Relay access denied; from=<xxxx@xxxxxxx.net> to=<xxxx@xxxxxxx.com> proto=ESMTP helo=<[xxx.xxx.xxx.xxx]>
May 26 08:58:05 ns postfix/smtpd[4112]: disconnect from unknown[xxx.xxx.xxx.xxx]
May 26 08:58:45 ns postfix/smtpd[4112]: connect from unknown[xxx.xxx.xxx.xxx]
May 26 08:58:45 ns postfix/smtpd[4112]: 46A1A5BE80: client=unknown[xxx.xxx.xxx.xxx], sasl_method=CRAM-MD5, sasl_username=xxxx
May 26 08:58:45 ns postfix/cleanup[4116]: 46A1A5BE80: messageid=<20060526085807.86CF.xxxx@xxxxxxx.net>
May 26 08:58:45 ns postfix/qmgr[2998]: 46A1A5BE80: from=<xxxx@xxxxxxx.net>, size=741, nrcpt=1 (queue active)
May 26 08:58:45 ns postfix/smtpd[4112]: disconnect from unknown[xxx.xxx.xxx.xxx]
May 26 08:58:45 ns postfix/smtpd[4120]: connect from localhost[127.0.0.1]
May 26 08:58:45 ns postfix/smtpd[4120]: A37885BE81: client=localhost[127.0.0.1]
May 26 08:58:45 ns postfix/cleanup[4116]: A37885BE81: messageid=<20060526085807.86CF.xxxx@xxxxxxx.net>
May 26 08:58:45 ns postfix/qmgr[2998]: A37885BE81: from=<xxxx@xxxxxxx.net>, size=1172, nrcpt=1 (queueactive)
May 26 08:58:45 ns postfix/smtpd[4120]: disconnect from localhost[127.0.0.1]
May 26 08:58:45 ns amavis[3992]: (03992-04) Passed, <xxxx@xxxxxxx.net> -> <xxxx@xxxxxxx.com>, Message-ID: <20060526085807.86CF.xxxx@xxxxxxx.net>, Hits: –
May 26 08:58:45 ns postfix/smtp[4117]: 46A1A5BE80: to=<xxxx@xxxxxxx.com>, relay=127.0.0.1[127.0.0.1], delay=0, status=sent (250 2.6.0 Ok, id=03992-04, from MTA: 250 Ok: queued as A37885BE81)
May 26 08:58:45 ns postfix/qmgr[2998]: 46A1A5BE80: removed
May 26 08:58:48 ns postfix/smtp[4121]: A37885BE81: to=<xxxx@xxxxxxx.com>, relay=mail.xxxxxxx.com[xxx.xxx.xxx.xxx], delay=3, status=sent (250 Ok: queued as 9CCFD11C00B)
May 26 08:58:48 ns postfix/qmgr[2998]: A37885BE81: removed省略

上記の青字の部分を見ると解るが、CRAM-MD5スクランブル認証が有効になっている。


6.エラーについて


Debianの auth.log を見ていると以下のようなエラーが出ることがある。これは、openldapとsasl2を入れていると出るエラーのようだ。ldapでは、標準でMysqlもしくはPostgresqlを使うことになっている。したがって、いずれかのDBを使用する前提でsmtpd.confを設定していないと以下のようなエラーを吐くようである。これを消したければ、openldapを削除すればよいのだが、Debianではこれを削除してしまうと、sasl2-binモジュールも削除されてしまうので、エラーが吐かれて煩わしいが体制に影響ないのでそのままにしたほうがよさそうである。

Aug 17 14:54:37 ns postfix/smtpd[3819]: sql_select option missing
Aug 17 14:54:37 ns postfix/smtpd[3819]: auxpropfunc error no mechanism available
Aug 17 14:54:37 ns postfix/smtpd[3819]: _sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql

以上

コメント