2009年11月6日金曜日

PostfixによるtaRgrey その1

自前のメールサーバが負荷に耐え切れなくなり?頻繁にカーネルパニックを起こすようになってしまった。スペックの低いこともあり新たにDell R610を購入して再構築しました。

スパム対策として今まで特定の国からのパケット破棄・Rgrey(S25R + greylisting)でしたが、今回はtaRgrey(S25R + tarpitting + greylisting)でスパム対策することにしました。
※RgreyやtaRgreyについての説明は省きます。詳しくはこちらを参照してください。
アンチウイルス等ファイアウォールについてはFortiGateで行うためここでは考慮しません。

ハードウェア
  • 本体:Dell PowerEdge R610
  • CPU:Intel(R) Xeon E5502(1.86GHz)
  • メモリ:4GB(DDR3 2GB×2)
  • HDD:146GB×2 RAID1構成(2.5インチSAS 10000RPM) ※ホットプラグ対応
  • 電源:717W
ソフトウェア
  • OS:CentOS-5 (5.4)
  • SMTP:Postfix(2.3.3)
  • POP:Dovecot(1.0.7) ※IMAP対応
  • その他:Postgrey(1.32)
メール使用ユーザには/home/UserName/の下にMaildirディレクトリが必要となります。メールユーザ追加するたびMaildirを手動で作成するのは面倒なので、ユーザが追加されたと同時にメールディレクトリを作成するようにしておきます。
# mkdir /etc/skel/Maildir
# chmod 700 /etc/skel/Maildir
初回送受信時にMaildirの配下にNew(新着メール)、Cur(既読メール)、Tmp(配送中メール)が作られます。

Postfixのインストール
# yum install postfix

設定ファイル編集(変更や追記部分のみ表記)
# vi /etc/postfix/main.cf

FQDN形式でのホスト名(DNSで名前解決できるもの)
myhostname = mail.exsmple.com

自身のドメイン名
mydomain = exsmple.com

ローカルから発せられるメールのUserName@以降に付与
myorigin = $myhostname

待ち受けるネットワーク(ローカル、LANなど全て)
inet_interfaces = all

ローカルで受信するドメイン名およびそのサブドメイン(必要に応じてカンマ区切りで追記)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, www.$mydomain

ローカルで受信するユーザの存在マッピング
local_recipient_maps = unix:passwd.byname $alias_maps

ローカルのユーザが存在しないときのエラー
※安定するまで450(再送信依頼)で対応、その後は550(存在しません)で拒否するのがよい。
450で返すと正常なMTAは30分後ぐらいに送信してくる。
unknown_local_recipient_reject_code = 450

権限の与えられるクライアントネットワーク定義(接続や中継を許可するなどに利用)
mynetworks = 10.1.0.0/16, 127.0.0.0/8

メールのリレーを許可するドメインおよびそのサブドメイン
relay_domains = $mydestination

メールボックスの形式
home_mailbox = Maildir/  ※スラッシュを付け忘れないこと

ヘッダチェックなどの制限等をする定義ファイル(後でheader_checksファイルを編集)
header_checks = regexp:/etc/postfix/header_checks

メールサーバソフトの隠蔽化
smtpd_banner = ESMTP unknown

ここまでが基本設定となります。
このままでも稼動させることができますが、セキュリティ強化の設定を追記していきます。

vrfyコマンドを無効(ユーザが存在するかどうか問い合わせをさせない)
disable_vrfy_command = yes

HELO(EHLO)コマンドで自己紹介を要求(ホスト名を通知しない接続を拒否する)
smtpd_helo_required = yes

RFC821の形式に合わないアドレスは拒否
strict_rfc821_envelopes = yes

HELOコマンドの場面で適用される制限
smtpd_client_restrictions =
permit_mynetworks           mynetworksで定義したネットワークは許可
reject_rbl_client bl.spamcop.net    外部ブラックリストに登録されている接続先は拒否
permit                  それ以外は許可

SMTP HELO(EHLO)コマンドの場面で適用される制限
smtpd_helo_restrictions =
permit_mynetworks           mynetworksで定義したネットワークは許可
reject_unknown_hostname       ホスト名のDNSでAまたはMXレコードない場合は拒否
reject_invalid_hostname         ホスト名の文法が不正の場合は拒否
reject_non_fqdn_hostname       ホスト名がFQDN形式ではない場合に拒否

  ※reject_unknown_hostname、reject_invalid_hostname、reject_non_fqdn_hostnameについては正常なホストでも"DNSで解決できない" "FQDN形式ではない"場合が多いため適用しないほうがよいと思われます。

SMTP Mail Fromコマンドの場面で適用される制限
smtpd_sender_restriction =
reject_non_fqdn_sender      送信者メールアドレスがFQDN形式でない場合は拒否           
reject_unknown_sender_domain 送信者メールアドレスのドメインが存在しない場合は拒否
permit                それ以外は許可

RCPT TOコマンドの場面で適用される制限
smtpd_recipient_restrictions =
permit_mynetworks        mynetworksで定義したネットワークは許可
reject_non_fqdn_recipient    受信者メールアドレスがFQDN形式でない場合は拒否
reject_unauth_destination     受信者メールアドレスがmydestinationに属さない宛先は拒否

main.cfの入力を終了します。

header_checksファイルの編集(追記)
# vi /etc/postfix/header_checks

ヘッダのReceived部分を非表示
/^Received:/ IGNORE

大量送信用特殊メーラーからのメールを拒否(他にも色々あります)
/^X-Mailer:.*PostMaster General/ REJECT

GMTを利用して特定地域からのメールを拒否
例)ブラジル(フェルナンド ノローニャ諸島)地域
/^Date:.*-1100/ REJECT

header_checksの入力を終了します。

CentOSではMTAのデフォルトがsendmailのためデフォルトMTAをPostfixへ切り替えます。
まずsendmailを止めて自動起動しないようにします。
# /etc/init.d/sendmail stop
# chkconfig sendmail off
# alternatives --config mta
There are 2 programs which provide 'mta'.

Selection Command
-----------------------------------------------
* + 1 /usr/sbin/sendmail.sendmail ← 現在sendmailがMTAとなっている
2 /usr/sbin/sendmail.postfix ← postfixもあり
Enter to keep the current selection[+], or type selection number:2 ←2を入力

Postfixの起動
#/etc/init.d/postfix start

Postfixの自動起動を有効にする
# chkconfig postfix on
# chkconfig --list postfix
postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off ※2,3,4,5がONになっていれば問題なし

Postfixの基本環境は完了です。
その2でPostgrey等のインストール・設定を行います。

その2へ

0 件のコメント:

Google検索