ban4ipインストールしてみました

オープンソースアンカンファレンス金沢2016でT.Kabuさんからのご紹介のあった
fail2banをやめてBan4ipにしませんか?
を早速試してみました。
ApacheやSSH、postfix、dovecot等のログを解析して失敗を検知した接続元のIPアドレスをiptablesに書き込みしてフィルタリングするデーモンになります。
IPv6にも対応しているところが優れています。
CentOS7の環境でしたが、問題なく導入でき1日間で17回BANできています。
インターネット環境にサーバを公開するということは常に攻撃にさらされていると感じました。
自動BANツールを導入していない方はぜひ導入してみるとよいと思います。
なお、サーバを再起動する際には、banした設定が消えてしまうので /sbin/service iptables save を忘れずに!

Postfix + POP before SMTP

SMTPの認証にPOP before SMTPを利用する機会は減ってきていると思うが、過去の互換性から利用を継続しなければならない場合も多い。
Cent OSにて導入をするためには、
pop-before-smtp-1.41-2.el5
compat-db-4.2.52-5.1
のRPMパッケージを導入したうえで、
pop-before-smtp-conf.pl, Postfix の main.cf を設定することとなる。
設定方法は、Fedora CoreでPostfixとDovecotでPOP before SMTPが参考になる。

HELOホスト名を変更する方法

Helo command rejected: Host not found;とmessageログに記録されている場合には、送信先SMTPサーバーにおいてHELOホストがDNSに登録されていないためにおこる。
通常は、HELOホスト名はhostnameに記述されたホスト名が使われるがこのホスト名をHELOコマンドで使用したくない場合には、Postfix のセキュリティ対策に記載があるようにmain.cf に「smtp_helo_name」のパラメータを付加してpostfixサービスを再起動することで変更ができる。

SpamAssassinのメモリ使用量が異常

今日突如SpamAssassinのメモリ使用量が1GBを超えてスワップをしてしまい、サーバーがダウンしてしまった。
最近はメールの受信件数がかなり多くなっていたことが気になっていたが、さすがにここまでになるとは思わなかった。
いろんなサイトを参照させていただき、有用となる情報をまとめて対応してみた。
メーリングリストより・・・
/etc/mail/spamassassin/local.cf にて
bayes_expiry_max_db_size 1000000
bayes_auto_expire 0
を追加してspamassasinを再起動する。
SpamAssassin によるスパムメール対策より・・・
/etc/procmailrc にて
:0fw
*!^X-Spam.*
|spamassassin
となっている場合には
:0fw
*!^X-Spam.*
| /usr/bin/spamc
として起動するプログラムをspamcに変更する。

postfixでバーチャルドメイン運用

/etc/postfix/main.cf のmydomainにabc.comが定義されており、hogehoge@def.com でもhogehoge@abc.com と同じように abcユーザーのメールボックスに入ってよい場合
⇒/etc/postfix/main.cf のmydestination に def.com を追加する
ユーザーアカウントならびにドメインごとに異なる メールボックスに配送する必要がある場合。ももしくは、/etc/postfix/main.cf のmydomainにドメインが定義されて場合
⇒/etc/postfix/main.cf に
virtual_alias_maps = hash:/etc/postfix/virutal
と定義した上で、
/etc/postfix/virtual に
ドメイン名 anything
メールアドレス 配送先アカウント
という記述を行う。
なお、
@ドメイン名 配送先アカウント
と記述すると該当ドメインにおいてメールアドレスが定義されていないものは指定されたアカウントへ配送できる。

メールが送信できない

僕のサーバーは、mydnsを利用してダイナミックDNSによって公開しているが、プロバイダがOP25B対策をしているため、外部にメールを送信するためにはSubmission Portを利用しなければならない。
mydnsではIPアドレスを定期的に更新している送信元からSubmission Portによるメールリレーサービスがあるので、これを利用させてもらっている。
今日メールを送ろうとしたところ、なぜかメールが送れなかったため、/var/log/maillogを確認して原因を調査したところ
Dec 24 04:28:53 (ホスト名) postfix/qmgr[2240]: 17F8AFC03: to=<(送信元)>, relay=none, delay=16802, delays=16802/0.21/0/0, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to auth.gate-on.net[210.197.72.170]: Connection timed out)
というログが出ていることが確認できた。auth.gate-on.netはpingが通ることから、どうやらメールリレーサーバーから接続を拒否されているようだ。
もっと前のログを確認したところ
Dec 23 04:02:39 (ホスト名) postfix/smtp[29536]: 03866F775: to=<(送信元)>, relay=auth.gate-on.net[210.197.72.170]:587, delay=25031, delays=24999/28/0.09/5, dsn=4.0.0, status=deferred (host auth.gate-on.net[210.197.72.170] said: 450 Error: too much mail from 122.20.52.249 (in reply to MAIL FROM command))
というエラーログが確認できた。どうやらメールを送りすぎているらしい。
たしかにmaillogを確認したところログサイズがかなり大きい状態であったため、もしかして不正中継しているのかと思い、RBL.JPによる不正中継テストを実施したところ特に不正中継はできない状態を確認した。
となるとなぜそんな大量のメールを送る必要があるのか・・・・詳しく調べてみたところ管理ドメインではあるが受信を予期していないサブドメインあてのメール(xxx@yyy.development-network.net)が大量に送られており、それが原因でエラーメッセージを大量に送信元に返しているためということがわかった。
確かにダイナミックDNSを利用していると、 development-network.net のMXレコードも yyy.development-network.net のMXレコードも存在するように見えてしまう。実際には、yyy.development-network.netドメインはメール受信できるような設定になっていないので、こんなことが起こってしまうのだ。
これを回避するためには、自サーバーにDNSを立てて、/etc/resolv.confに nameserver 127.0.0.1 を設定する。その上で、development-network.netドメインのみMXレコードを設定し、メールサーバーあてに来たメールの宛先がMXレコードに存在しなければメールを拒否するようにすればよい。また、合わせて送信元のメールアドレスが正しくない(MXレコードが引けない)場合も合わせて拒否するようにした。
そこで、postfixに以下の設定をした。
smtpd_sender_restrictions=
smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination

smtpd_sender_restrictions=reject_unknown_sender_domain
smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,reject_unknown_recipient_domain
ここで設定パラメータの意味をおさらいしてみたい。

reject_unknown_sender_domain MAIL FROM アドレスに DNS A または MX レコードがなく、Postfix がその送信者アドレスの最終配送先ではない場合に、要求を拒否します。
reject_unknown_recipient_domain RCPT TO アドレスに DNS A または MX レコードがなく、Postfix がその受信者アドレスの最終配送先ではない場合に、要求を拒否します。

この設定をすることによって
Dec 31 22:16:05 (サーバー名) postfix/smtpd[24930]: NOQUEUE: reject: RCPT from adsl-ull-139-91.47-151.net24.it[151.47.91.139]: 450 4.1.2 <(送信先)>: Recipient address rejected: Domain not found; from=<(送信元)> to=<(送信先)> proto=ESMTP helo=
というログが記録されるようになり、正しく拒否することによって不用意にリレーさせないようになっていることを確認できた。
この設定の後、Bフレッツを再接続してWAN側のIPアドレスを変更し、mydnsに新しいIPアドレスを通知することで正しく通信できるようになった。
最後になりましたが、mydnsさんへはこの件で大変ご迷惑をおかけしました。この場を借りてお詫びいたします。

Postfixにスパムメールフィルターを入れる

Webサイトを公開していると公開ドメインの特定のアカウントに対してスパムメールが送られてくることも珍しくなく、僕の場合には、1日当たり200通くらいスパムメールが来る。そこで、spamassasinというソフトウエアを組み込むことで簡単にスパムメールフィルターを実装することができたので紹介する。
ちなみにインストールにあたってLinuxで自宅サーバーさんのサイトが役に立った。動作する概要を知るにはとても役に立つのでご一読いただきたい。また以下のインストール手順も多くは参考に記載しているものであることをお断りしておく。
Fedora Core 6上にPostfixが稼働している環境にspamassasinを以下の手順でインストールした。
1.yum install spamassasin コマンドを実行するとspamassasin以外にperlモジュールをたくさん入れる必要があることが分かるので、yを押す。
2.rpm -qi procmail を実行し、procmailコマンドがあることを確認する。ただし、設定ファイルである/etc/procmailrc がないため、 vi /etc/procmailrc として以下を記述する。

# パスを設定
PATH=/bin:/usr/bin:/usr/local/bin
# メールボックスの設定
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
# Procmailのログファイル出力先を指定
LOGFILE=$MAILDIR/procmaillog
# ロックファイルのパスを指定
LOCKFILE=$HOME/.lockmail
# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動します
:0fw
*!^X-Spam.*
|spamassassin
# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納します(ただし、POPサーバーで受信しているケースがある場合には、この設定をするとスパム扱いされたメールが確認メールソフトからできないので注意)
:0
* ^X-Spam-Status: Yes
$MAILDIR/.Spam/

※.Spamディレクトリは/home/XXX/Maildir以下に作成しなければならないようだが、みている限りでは、上記設定をすることでメールの受信が始まると勝手に作ってくれるようだ。
4.Postfixでメールを受信をした際にprocmailで処理させるために以下の記述を/etc/postfix/main.cf に記述する

mailbox_command = /usr/bin/procmail

5.spamassasinサービスを自動起動させるために以下のコマンドを実行する。
/sbin/chkconfig –level 35 spamassassin on
6.spamassasinサービスの起動&postfixの再起動を行う
/etc/init.d/spamassasin start
/etc/init.d/postfix restart
7.postfixで配送を管理しているドメインあてにメールを送ってヘッダーに以下の情報があることを確認する。

X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on
(サーバー名)
X-Spam-Level:
X-Spam-Status: No, score=0.5 required=5.0 tests=NO_REAL_NAME,NO_RELAYS
autolearn=no version=3.1.9

もしスパムメールを受け取った場合には、.Spamというフォルダに移動され、以下のようなヘッダーが付け加えられる。

X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on
(サーバー名)
X-Spam-Level: ******************
X-Spam-Status: Yes, score=18.2 required=5.0 tests=ALL_TRUSTED,
FORGED_MUA_OUTLOOK,INVALID_MSGID,REPLICA_WATCH,URIBL_JP_SURBL,URIBL_OB_SURBL,
URIBL_SBL,URIBL_SC_SURBL,URIBL_WS_SURBL autolearn=no version=3.1.9
X-Spam-Report:
* -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP
* 2.3 REPLICA_WATCH BODY: Message talks about a replica watch
* 1.1 URIBL_SBL Contains an URL listed in the SBL blocklist
* [URIs: prnewperiod.net]
* 3.4 URIBL_JP_SURBL Contains an URL listed in the JP SURBL blocklist
* [URIs: prnewperiod.net]
* 1.5 URIBL_WS_SURBL Contains an URL listed in the WS SURBL blocklist
* [URIs: prnewperiod.net]
* 2.6 URIBL_OB_SURBL Contains an URL listed in the OB SURBL blocklist
* [URIs: prnewperiod.net]
* 3.6 URIBL_SC_SURBL Contains an URL listed in the SC SURBL blocklist
* [URIs: prnewperiod.net]
* 1.7 INVALID_MSGID Message-Id is not valid, according to RFC 2822
* 3.4 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook

8.定期的に学習させるためにcronへ登録する。vi /etc/cron.d/spamassasin を実行し、以下のを記述する。

0 1 * * * /usr/bin/sa-learn –spam /home/*/Maildir/.Spam/cur > /dev/null
0 1 * * * /usr/bin/sa-learn –ham /home/*/Maildir/cur > /dev/null

以上で設定完了だ。
なお、.Spamに移動したファイルは通常は読み取りできないので、もしsquirrelmailを使っているようであれば、フォルダメニューで.spamを登録すれば読み取りできるようになる。

PostfixでSubmissionポートをあける

最近のOP25Bの影響によって、プロバイダによってはレンタルサーバーあるサーバーなどのSMTPサーバーに接続できないケースが出てきました。OP25Bの回避策である567番ポート(Submissionポート)をLISTENさせることでこの問題は回避でき、Postfixでは非常に簡単に出来ます。
/etc/postfix/master.cfにある以下のコメントを外すだけでOKです。
submission inet n – n – – smtpd

Postfixの配送エラー

Postfixをマルチドメインで運用している場合には、配送エラーに悩まされることが多い。
エラーメッセージとともに対応方法をリスト化しておきたい。
554 5.7.1 <(あて先アドレス)>: Relay access denied; from=<(送信元アドレス)> to=<(あて先アドレス)> proto=ESMTP helo=<(接続元サーバー)>
あて先アドレスが自ドメインでなければ、不正中継しようとしているわけなので拒否して問題ないが、これが自ドメインなのにもかかわらず不正中継扱いされるケースだとメールが届かない。これは
main.cfのmydestinationが正しく設定されているかどうかチェックする。
たとえばこのような形にすると改善されるかもしれない。
domain = (自ドメイン)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

vodafoneへメールが送信できない

postfix/smtp[26573]: connect to mx.t.vodafone.ne.jp[210.169.176.59]: Connection timed out (port 25)
SMTP中継しようとするとOCN網からだと拒否されてしまう。
他のドメインでは発生しない症状なので、おそらくOCN側で携帯ドメインの転送をしないように設定していることが予想される。
mydnsのOPB25対策のサービスを利用することこの問題は回避できるが、本来であればOCNのSMTPサーバーをリレーしたいところ。そこで利用するのがSASL(SMTP-AUTH)になる。
SASLについては今後書いていきたいと思う。