manekineko倉金家ホームページ

趣味の部屋/サーバー構築メモ その2/メールサーバー その2

Postfix送受信制限(認証とスパム対策)

2010年9月24日(金) 2011年1月6日(木) 修正
メール送信制限にSMTP-AUTHによる認証を設定します。
また併せて受信制限によるスパムメール対策を施します。
最終的に落ち着いたのはPostfix + DovecotでDovecot SASLを使う方法。
これがメールサーバーとして一番楽でいい組み合わせかもしれない。


 PostfixやSendmailなどのSMTPサーバーはそのままではだれでもメール送信が可能です。このままではスパムメールの発信基地として利用されてしまいますので、このサーバーのメールユーザーのみが送信可能なように認証設定を行います。
また何も設定しなければすべてのメールを受け取りますが、これも大量のスパムメールを受け取ることになりますので併せてメールの受信制限(スパムメールの受信拒否)も行います。
 ただしこれだけでは受信スパム対策としては甚だ不十分で、別途 再度のスパム対策 も併せてご覧ください。

送受信制限設定
/etc/postfix/main.cfに以下の設定を追加します。
基本設定とバーチャル配送定義の間にでも書き込みます。

まずはSMTP-AUTHにCyrus-SASLを使う場合。
......
# saslによるSMTP Authを有効にする
smtpd_sasl_auth_enable = yes
# anonymousは許可しない
smtpd_sasl_security_options = noanonymous
# OutlookなどのためにLOGIN認証を使用する
broken_sasl_auth_clients = yes
# SASLアプリケーションの指定(ただしpostfixバージョン>2.3の場合)
# ディフォルトでこれ(Cyrus SASL)になってはいる
smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd

# HELOコマンドでホスト名をチェック
smtpd_helo_required = yes
smtpd_helo_restrictions =
  permit_mynetworks,
  check_helo_access hash:/etc/postfix/access,
  permit

# RFCの定義に適合しないメールアドレスが通知された場合受信拒否
strict_rfc821_envelopes = yes

# 送信元ホストの接続許可制限
smtpd_client_restrictions =
  permit_mynetworks,
  check_client_access hash:/etc/postfix/access,
  reject_rbl_client all.rbl.jp,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client sbl-xbl.spamhaus.org, …2011.1.6 誤認が多いといううわさなのではずしてみる。
  reject_unauth_pipelining,
  reject_unknown_reverse_client_hostname, …2011.1.6 稀にスパム発信元でもないのにちゃんと設定していないサーバーがあり、やむなく削除。絶大な効果があったんだけど。
  permit

# メール送信の制限
smtpd_recipient_restrictions =
  permit_mynetworks,
  check_recipient_access hash:/etc/postfix/access,
  permit_sasl_authenticated,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unauth_destination,
  permit

# メール送信者のチェック
smtpd_sender_restrictions =
  check_sender_access hash:/etc/postfix/access,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  permit
......
このままではまだ送信はできません。
Cyrus-Saslを設定していないため認証できないからです。

Cyrus SASL
メール送信の認証にまずはもっとも一般的に使用されているCyrus-Saslをやってみます。これはすでにインストールされています。
前のサーバーではまだ理解不足もあってかMySQLにうまくつながらなかったり、ドメイン名込みのname@domain.tld形式のユーザ名がうまく認識されずソースを修正したりしましたが、今回はまずはそのままやってみます。

メールのユーザやパスワードなどはPostfixAdminによってMySQLデータベースに格納されています。
このデータを使ってCyrus-Saslで認証するには
1.直接MySQLデータを参照する方法
2.すでに動いているIMAPサーバー(Dovecot)を通して認証を確認する方法
の2つがあります。
Dovecotの認証にMySQLのデータベース以外の(PAMなどの)認証データがある場合は2がよさそう。(だぶって設定するのはたいへんそう。やる気なし。)
今回はMySQLだけなのでどちらでもかまいません。
ためしに両方やってみます。
その1:MySQL直接
/usr/lib/sasl2/smtpd.conf を作成して
pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
sql_database: postfix
sql_hostname: localhost
sql_user: postfix
sql_passwd: MySQLパスワード
sql_select: SELECT password FROM mailbox WHERE username='%u@%r' AND active='1'
mech_list: plain login
saslauthd_path: /var/run/saslauthd/mux
log_level: 3
を記載
パスワードが書いてあるのでいちおうchmod 0640しておきます。
ためしに登録されたメールアカウントから送信してみて...OKです。
その2:IMAPサーバー経由(RIMAP)
/usr/lib/sasl2/smtpd.conf には
pwcheck_method: saslauthd
mech_list: plain login
saslauthd_path: /var/run/saslauthd/mux
log_level: 3
を記載

さらに/etc/sysconfig/saslauthdに
SOCKETDIR=/var/run/saslauthd
MECH=rimap
FLAGS="-r -O localhost"
を記載

RIMAPの場合は先にCyrus-Sasl(saslauthd)を起動しておく必要がありますので、
# service saslauthd start
# chkconfig saslauthd on

同様にメール送信テストしてみて...これもOKです。

Dovecot SASL
PostfixくんとDovecotさんはなぜか仲良しです。
両者にDovecotの認証機構をそのまま共有するための機能が備わっています。
これも試してみます。

/etc/dovecot.confのauth defaultのsocket listenの最後の部分を書き換え。
auth default {
mechanisms = plain login
.........
socket listen {
client {
# デフォルトの Postfix の $queue_directory 設定を仮定
path = /var/spool/postfix/private/auth
mode = 0660
# デフォルトの Postfix のユーザとグループを仮定
user = postfix
group = postfix
}
}
}
/etc/postfix/main.cfの以下の項目を書き換え
# SASLアプリケーションの指定
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
dovecot, postfixを再起動してメール送信テスト。OK。
これがメールサーバーとしていちばん楽で確実な組み合わせかもしれない。

3つともどれでもOKということがわかりましたので、あとは好みの問題でどれかひとつを有効にしておきます。
今回はそのまま最後のDovecot SASLにしておきました。余計なプログラムを介さないだけ安定ではないだろうかと。(実はそのままの設定で楽をしたかっただけ?)
あと、/etc/postfix/のaccess, header_checks などにはスパム拒否の設定を随時書き込みますが、現行サーバーのファイルをそのまま移行しました。

2011.05.10 さらなるスパム対策
スパム対策としてはこれではまだ不十分であることがわかったので、このあとさらに強力なスパム対策を施しました。併せてご覧ください。
→再度のスパム対策(お薦め)
→再々度のスパム対策