Linux
maillog
postfix,

Postfixでメールの踏み台対策を行う方法

メールサーバをWebサイトを参考にしつつPostfix(メール送信ソフト) Dovecot(メール受信ソフト)を用いて適当に立ててみたものの、踏み台にされているという連絡がさくらVPSのabuse対策チームというところから入ったため対応を入れてみた。

因みにサーバ環境はCentOS6.9であった。

$ cat /etc/redhat-release
CentOS release 6.9 (Final)

初期対策

何はともあれメールサーバを止める。

# /etc/init.d/postfix stop

また、迷惑メールの踏み台にされたときには、大量のメールがメールサーバに対して送り付けられており、送信予備軍としてキューに溜まっているはずである。mailqコマンドで確認できるが、ともあれこのキューを以下のコマンドで一括削除してやる。

# postsuper -d ALL

postsuperはpostfixが管理するキューに対してメンテナンスを行うコマンドであるが、superという名前から分かるようにsuperuserしか使えないようなのでroot権限で処理は行おう。
また、メールログにも大量に溜まっているはずなので/var/log/maillogあたりを確認して削除しておこう。

SMTP認証を設定する

Postfixはデフォルトの状態では認証の仕組みを持っておらず、誰でもメールの送信依頼を出せる状態になっている。(このことをオープンリレー状態と呼ぶらしい)

自分以外からしか送れないようにするにはIPで制限をかけても良いが、常に固定のIPからメールを送信しなければならないので、ID/Passwordで制限を掛けてやるのが一般的な方法である。
そこでSASL(Simple Authentication and Security Layer、サスルと読む)という仕組みを使ってこのセキュリティ施策を実現する。

smtpd_sasl_auth_enable = yes
#匿名認証を許可しない = id/passwordの入力を必須とする。 
smtpd_sasl_security_options = noanonymous
#SMTP認証したときのみメール送信の受付を行う。
smtpd_recipient_restrictions = permit_sasl_authenticated,reject_unauth_destination

saslの立ち上げ及び、Linuxの再起動時に自動で立ち上がるようにしておく。またpostfixを再起動する。

# /etc/rc.d/init.d/saslauthd start
# chkconfig saslauthd on
# /etc/rc.d/init.d/postfix reload

これでひとまずSASL対応は完了。

しつこいアクセスをiptablesで遮断

これで踏み台にされる事はなくなったものの、特定IPアドレスからしつこくSMTP認証の要求が飛んでくる事が/var/log/mailLogを見ると確認された。こんな感じである。

Oct 14 12:36:04 myhost postfix/smtpd[29066]: connect from unknown[191.96.249.61]
Oct 14 12:36:10 myhost postfix/smtpd[29066]: warning: unknown[191.96.249.61]: SASL LOGIN authentication failed: authentication failure
Oct 14 12:36:10 myhost postfix/smtpd[28874]: connect from unknown[191.96.249.13]
Oct 14 12:36:11 myhost postfix/smtpd[29066]: disconnect from unknown[191.96.249.61]
Oct 14 12:36:16 myhost postfix/smtpd[28874]: warning: unknown[191.96.249.13]: SASL LOGIN authentication failed: authentication failure

まあ遮断できているから良いかと思うかもしれないが、頻繁に来られてはメールログで容量を食われてしまうのでIP tablesでこれらのIPからのアクセスを遮断してやる。次のサイトを参考にして設定してみる。https://www.sakura-vps.net/access_denied_specific_ipaddress/

# iptables -I INPUT -s 191.96.249.13 -j DROP
# iptables -I INPUT -s 191.96.249.61 -j DROP

設定できているかをiptables -Lで確認

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  191.96.249.61        anywhere
DROP       all  --  191.96.249.13        anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

変更を保存してrestart

# /etc/init.d/iptables save
# /etc/init.d/iptables restart

saveすると/etc/sysconfig/以下にiptablesファイルが生成されるので、これを直接編集しても良いかも。

# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Oct 14 12:56:29 2018
*filter
:INPUT ACCEPT [1010:87284]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [573:1125512]
-A INPUT -s 191.96.249.61/32 -j DROP
-A INPUT -s 191.96.249.13/32 -j DROP
COMMIT
# Completed on Sun Oct 14 12:56:29 2018

IPフィルタだけではいたちごっこになってしまう可能性もあるが、ひとまずこれにて。何か良い方法はないものか。。