[Freebsd14 + Postfix +Postscreen+ fail2ban + pf]
Postfix:MTA
Postscreen:Postfixに付属しているトリアージ的spam分類機能モジュール
fail2ban:設定に基づきpostfixなどのログファイルから不正の検出とIP抽出を行う。
pf:fail2banの抽出したIPアドレステーブル情報によりIP遮断を行う。
辞書方式によるメールアカウントへのアタックは毎日行われている。
以下はその攻撃元のIPアドレスのごく一部である。
公開ブラックリストを適用するのも良い方法だが、F&Fサーバに限って言えば公開リスト以外のIPが多かった。
ルータへの攻撃も増えていて、警視庁では以下注意を呼びかけている。
平均的な一日辺りの攻撃IP数は1万前後だそうだ。

ある日の攻撃元IPアドレス(抜粋)で、まとまっているもの。
1 193.239.151.12
1 193.239.151.17
1 193.239.151.22
—-中略—-
1 193.239.151.218
1 193.239.151.243
1 193.239.151.244
1 193.239.151.245
1 193.239.151.251
1 193.239.151.254
193.239.151.0/24や193.239.154.0/24を攻撃用に確保したと言うことか。
IDを探し出そうとするものは正しい設定のメールサーバが使われていて、昔ながらの送りっぱなしのspam用としては逆引きが出来ない事やHELOを適当に設定しているものもある。
こうした適当な設定のメールサーバからのメールは、例えIDがマッチしたとしてもリジェクトされる。
: connect from unknown[193.239.151.78]
: NOQUEUE: reject: RCPT from unknown[193.239.151.78]: 450 4.7.1 : Helo command rejected: Host not found; from=mw6I.applestore.updateservice.mailIKI1@bushiroad-store.com
: disconnect from unknown[193.239.151.78] ehlo=1 mail=1 rcpt=0/1 data=0/1 rset=1 quit=1 commands=4/6
: statistics: max message rate 1/60s for (smtpd:193.239.151.78)
: statistics: max recipient rate 1/60s for (smtpd:193.239.151.78)
FQDNが設定されていないし、HELOは適当なドメインが設定されている。
送信元のメールアドレスはmw6I.applestore.updateservice.mailIKI1@bushiroad-store.comとなっている。
設定が適当すぎるのでメールのやりとりまでは行かないのだが、メールサーバとしては律儀に応答するので負荷が増える。

最近この手の攻撃が凄く増えていて、1つのIPアドレスからは数日に1回しかアクセスしてこない。
数日に1回だと攻撃ではなく、単なる間違いだと認識するのでフィルタには引っかからない。
フィルタには引っかからないのだがクラスCのIP全てを使って攻撃して来るし、それが別のIPアドレスブロックでも行われているので総数としては凄い数になる。
攻撃な日本時間の昼間に多く、夜間は減少傾向だ。
こうした攻撃に対応するため、1回でもuser unknownを引っかけたら、1回でもおかしな設定でアクセスしてきたら、即座にIPを遮断するようにした。
一定の期間内に複数回のアクセスが来ると、それに応じて遮断期間を長くする。
一度の過ち?でBANする設定だと、本当に間違えた、つまりメールアドレスの入力ミスなどでもBANが起きる。
従って様々なメールを受け取らなければならないサーバでは、余り極端な設定が出来ない。
悪い奴らもそこを突く形で攻撃してくる。
なおgmailなど主要なメールサービスのIPはignoreip(ホワイトリスト)として設定している。
日本に割り当てられているIPアドレスをホワイトリストテーブルとして登録してしまう方法もある。
[Postfix]
Status for the jail: postfix
|- Filter
| |- Currently failed: 0
| |- Total failed: 767
|- File list: /var/log/maillog– Actions
|- Currently banned: 819
|- Total banned: 1618
`- Banned IP list:[Postfix-postscreen]
Status for the jail: postfix-postscreen
|- Filter
| |- Currently failed: 0
| |- Total failed: 1144
|- File list: /var/log/maillog– Actions
|- Currently banned: 2010
|- Total banned: 3010
`- Banned IP list:[Postfix-ddos]
Status for the jail: postfix-ddos
|- Filter
| |- Currently failed: 0
| |- Total failed: 1197
|- File list: /var/log/maillog– Actions
|- Currently banned: 2566
|- Total banned: 3491
`- Banned IP list:
設定を変更した3日後のレポートが上のものだ。
HELOやFQDN未設定・架空ドメインなどでのBANが819件、所定の手続きを踏まずにメールを送ろうとした事によるBANが2010件、いわゆるdos攻撃的なものによるBANが2566件となっている。
ではこれで攻撃を遮断出来るかと言えばそうではない。
毎日4千~5千のIPをブロックしていて、これ以上に増える事もないし極端に減る事もない。
IPアドレスを順番に使ってくるなと思ったら、そのIPアドレスブロックごとBANしてしまうのが良いようにも思えるが、巻き添え的弊害はあるかも。
上に書いた193.239.151.0などは、/24でブロックした。
fail2ban-client set postfix banip 193.239.151.0/24
F&Fでもこうして攻撃されるので大手企業のサーバなど大変だろうなと思う。
ちなみにこのIPアドレスで攻撃してくるのはメールサーバで、SSHへの攻撃は又違ったグループ?が行っているようだ。
IPアドレスの範囲が全く違う。
SSHもSFTPもFTPも、ホワイトリスト以外から怪しいアクセスがあれば、すぐにBANにしている。
PostscreenによるPregreet testも追加してみた。
PostscreenはPostfixの拡張的spamフィルタで、簡易的ながらSMTPサーバの負荷軽減に効果的だ。
Postscreen自体が軽く動作するので、大量のアクセスがあっても負荷が上昇しにくい。
Pregreet testはメールサーバが正当な手続きを踏んでいない事をチェックする。
こちらからの応答を待たずにメールを送って来ようとするものをRejectする。
: HANGUP after 5.3 from [119.192.210.110]:49772 in tests before SMTP handshake
: DISCONNECT [119.192.210.110]:49772
: CONNECT from [106.89.60.77]:58482 to [133.242.141.43]:25
: HANGUP after 5 from [106.89.60.77]:58482 in tests before SMTP handshake
: DISCONNECT [106.89.60.77]:58482
: CONNECT from [128.185.199.22]:46562 to [133.242.141.43]:25
: HANGUP after 5.3 from [128.185.199.22]:46562 in tests before SMTP handshake
: DISCONNECT [128.185.199.22]:46562
RejectされればLogにそれが残るので、fail2banで検出してBANする。
普通のメールサーバなら正しく応答するので、中華spamサーバやIDを検索してくる奴らは排除出来ない。
それでも毎日2000件以上はBANしているので、効果はある。
spamには大きく2種類がある。
一つは単に詐欺メールや宣伝メールを送りつけてくるもの。
中華spamの代表的なものは以下だ。
詐欺サイトはMicrosoft Azureに収容されているので、windows.netのURLとなっている。
これは2019年頃からあるので、マイクロソフト自身が詐欺に加担していると見られても仕方がない。
お客様へ ,
お使いのWindowsコンピュータで重大なウイルス感染が検出されました。
このまま放置すると、システムが完全にロックされ、個人情報(銀行のログイン詳細、写真、パスワードなど)が外部に流出する恐れがあります。
システムステータス:
脅威のレベル: 高(致命的)
感染したファイル: Trojan.Spyware.2026.JA
警告: 24時間以内に修復を行わない場合、Windowsライセンスが停止されます。
データの損失を防ぎ、システムを保護するために、以下のリンクから直ちにセキュリティスキャンと修復を実行してください。
[* 今すぐシステムを修復する * https://woyomateri.z20.web.core.windows.net/]
注意: このメッセージを閉じたり、PCを再起動したりしないでください。データの破損を招く可能性があります。マイクロソフト セキュリティチーム
©2024 Microsoft Corporation
お客様へ
マイクロソフトのセキュリティチームは、お客様のデバイスで異常なアクティビティを検出しました。お使いのWindowsシステムは現在、外部の脅威に対して脆弱な状態にあります。
データの盗難やシステムトラブルを防ぐために、直ちにセキュリティパッチを更新し、アカウントの認証を行う必要があります。
以下のリンクをクリックして、公式のサポートページからログインし、指示に従ってください:
[ サポートポータルにログインする ]
24時間以内に対応がない場合、セキュリティ保護のためにお客様のアカウントを一時的に停止させていただきます。
何卒ご理解とご協力をお願い申し上げます。
Microsoft カスタマーサポートセンター
メール攻撃のもう一つはIDの検索だ。
辞書攻撃で有効なIDを見つけようとする。
IDが分かればspamの送信が効率的になるし、パスワードの検索に移行出来る。
どのようなIDでアクセスしてくるか、以下はある日(24時間)のアタックの様子で、左側の数字はアタックされた回数である。
どうやら共通のID辞書を使っているらしく、(ブロックしても)毎日ほぼ同じIDを探りに来ている。
Recipient address rejected: User unknown in local recipient table (49)
6 deb.davidson@fnf.jp
5 kathie.plewniak@fnf.jp
4 chart@fnf.jp
4 jason.murphree@fnf.jp
3 kim.r.walker@fnf.jp
2 yamato.9912345@fnf.jp
2 mary.binicewicz@fnf.jp
2 hart@fnf.jp
2 jeff.hertel@fnf.jp
2 inf@fnf.jp
2 Mathew.Lewis@fnf.jp
1 beckham.allen@fnf.jp
1 calesq1@fnf.jp
1 dmarc-reports@fnf.jp
1 lynn.farmer@fnf.jp
1 brandon.gatke@fnf.jp
1 amy.hill@fnf.jp
1 hogehoge@fnf.jp
1 carole.hunsperger@fnf.jp
1 iidake@fnf.jp
1 info@fnf.jp
1 jackie.jalley@fnf.jp
1 julia.jenkins@fnf.jp
1 ssanders@fnf.jp
1 support@fnf.jp
1 xmpxbfouf@fnf.jp
以下は各設定ファイル
[usr/local/etc/fail2ban/filter.d/]
各フィルタは標準的にインストールされるものを使用。
postfix-postscreen.confは以下に示す。
jail.local
[/usr/local/etc/fail2ban/jail.local]
fail2banの動作の基本となる設定ファイル
banaction = pf[name=f2b-default]
#gmailサーバなどを除く
ignoreip = 133.242.141.43/32 14.11.164.64/32 64.233.160.0/19 66.102.0.0/20 66.249.80.0/20 72.14.192.0/18 74.125.0.0/16 108.177.8.0/21 173.194.0.0/16 209.85.128.0/17 216.58.192.0/19 216.239.32.0/19(他、略)
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
backend = auto
banaction = pf[name=f2b-sshd]
maxretry = 3
findtime = 60
bantime = 1d
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/httpd-error.log
banaction = pf[name=f2b-apache]
findtime = 600
maxretry = 3
bantime = 1h
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/httpd-error.log
banaction = pf[name=f2b-apache]
findtime = 600
maxretry = 3
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/httpd-error.log
banaction = pf[name=f2b-apache]
findtime = 600
maxretry = 5
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/httpd-access.log
banaction = pf[name=f2b-apache]
findtime = 660
maxretry = 5
[proftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = proftpd
logpath = /var/log/proftp.log
backend = auto
banaction = pf[name=f2b-proftpd]
maxretry = 3
findtime = 60
bantime = 3d
bantime.increment = true
bantime.factor = 2
bantime.max = 30d
[postfix-sasl]
enabled = true
port = smtp,submission,465
filter = postfix-sasl
logpath = /var/log/maillog
backend = auto
maxretry = 2
findtime = 60
bantime = 3d
bantime.increment = true
bantime.factor = 2
bantime.max = 30d
banaction = pf[name=f2b-postfix-sasl]
[postfix]
enabled = true
port = smtp,submission,465
filter = postfix[mode=more]
logpath = /var/log/maillog
backend = auto
maxretry = 1
findtime = 3600
bantime = 3d
bantime.increment = true
bantime.factor = 2
bantime.max = 30d
banaction = pf[name=f2b-postfix]
[postfix-ddos]
enabled = true
port = smtp,submission,465
filter = postfix[mode=ddos]
logpath = /var/log/maillog
backend = auto
maxretry = 1
findtime = 3600
bantime = 3d
bantime.increment = true
bantime.factor = 2
bantime.max = 30d
banaction = pf[name=f2b-postfix]
[postfix-postscreen]
enabled = true
port = smtp,submission,465
filter = postfix-postscreen
logpath = /var/log/maillog
backend = auto
maxretry = 1
findtime = 3600
bantime = 3d
bantime.increment = true
bantime.factor = 2
bantime.max = 30d
banaction = pf[name=f2b-postscreen]
[dovecot]
enabled = true
port = 110,143,995
filter = dovecot
logpath = /var/log/dovecot.log
backend = auto
banaction = pf[name=f2b-dovecot]
maxretry = 3
findtime = 120
bantime = 1d
postscreen.conf
[/usr/local/etc/fail2ban/filter.d/postfix-postscreen.conf]
postscreenの動作の基本となる設定ファイル
[INCLUDES]
# システム標準のログ読込
before = common.conf
[Definition]
_daemon = postfix/postscreen
# プレフィックス
failregex = ^%(__prefix_line)s(?:WHITELISTED|PASSED|PIPELINING|NON-SMTP COMMAND|BARE NEWLINE|COMMAND (?:TIME|COUNT|LENGTH) LIMIT|PREGREET \d+|HANGUP after \S+|DNSBL rank \d+ for \[\S+\]) from \[<HOST>\]:\d+.*$
^%(__prefix_line)sNOQUEUE: reject: RCPT from \[<HOST>\]:\d+: [45][50][04] [45]\.\d\.\d+ .+
ignoreregex =
[Init]
journalmatch =
master.cf
[/usr/local/etc/postfix/master.cf](抜粋)
postfixで設定済みのもので、postscreen部分を有効化する
#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: https://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
#smtp inet n - n - - smtpd
smtp inet n - n - 1 postscreen
smtpd pass - - n - - smtpd
#dnsblog unix - - n - 0 dnsblog
#tlsproxy unix - - n - 0 tlsproxy
# Choose one: enable submission for loopback clients only, or for any client.
#127.0.0.1:submission inet n - n - - smtpd
main.cf
[usr/local/etc/postfix/main.cf](postscreen設定部分)
postfixで設定済みのもので、postscreen部分を加える
#postscreen
postscreen_access_list = permit_mynetworks, cidr:/usr/local/etc/postfix/postscreen_access.cidr
postscreen_greet_wait = 15s
postscreen_greet_action = enforce
pf.conf
[/etc/pf.conf]
実際にIP遮断を行うpfの設定
# このIPからの通信はすべて許可
pass in quick on $ext_if from {自分の接続IPアドレスなど} to any keep state
# =========================================================================
# Fail2ban テーブル定義
# =========================================================================
table <f2b-sshd> persist
table <f2b-apache> persist
table <f2b-proftpd> persist
table <f2b-postfix> persist
table <f2b-postfix-sasl> persist
table <f2b-postscreen> persist
table <f2b-dovecot> persist
# =========================================================================
# Fail2ban ブロックルール (最優先で適用)
# =========================================================================
# to any :該当IPからのすべてのアクセスを遮断
block drop in quick on $ext_if from <f2b-sshd> to any
block drop in quick on $ext_if from <f2b-apache> to any
block drop in quick on $ext_if from <f2b-proftpd> to any
block drop in quick on $ext_if from <f2b-postfix> to any
block drop in quick on $ext_if from <f2b-postfix-sasl> to any
block drop in quick on $ext_if from <f2b-postscreen> to any
block drop in quick on $ext_if from <f2b-dovecot> to any
# =========================================================================
# 通常の通過ルール
# =========================================================================
pass out all
# SSH
pass in on $ext_if proto tcp to port 22 keep state
# HTTP / HTTPS
pass in on $ext_if proto tcp to port 80 keep state
pass in on $ext_if proto tcp to port 443 keep state
# Mail (Postfix / Dovecot)
pass in on $ext_if proto tcp to port { 25, 587, 465 } keep state
pass in on $ext_if proto tcp to port { 110, 143, 995 } keep state
# FTP
pass in on $ext_if proto tcp to port 21 keep state
pass in on $ext_if proto tcp to port 60000:60100 keep state
# ping許可
pass in inet proto icmp all icmp-type echoreq keep state

コメント