Gmailに嫌われた SPAMの踏み台になっているユーザの特定とか

お客様からの問い合わせで、Gmailにメールが届かなくなったとのこと。

1.お客様のメールサーバ入らせていただいてログを確認。

# tail -5000 /var/log/maillog | grep gmail.com
said: 550-5.7.1 [] Our system has detected an unusual rate of 550-5.7.1 unsolicited mail originating from your IP address. To protect our 550-5.7.1 users from spam, mail sent from your IP address has been blocked. 550-5.7.1 Please visit 550-5.7.1 https://support.google.com/mail/answer/81126 to review our Bulk Email 550 5.7.1 Senders Guidelines. – gsmtp (in reply to end of DATA command))

あなたのIPからSPAM来たからブロックしてる的なメッセージ。

こんなとき、どうすればいいか。
(Linuxの勉強を兼ねてる人向け)

 

2.そもそも、サーバの設定間違えていることでの
第三者リレーが可能な状態で踏み台になっていないか確認する。

http://www.rbl.jp/svcheck.php

サーバのホスト名を入れてCheckする。
今回は「全てのテストが行われました, no relays accepted.」と出ている前提。

 

3.まずは、SPAMのアテをつける

# ls -al /var/log/maillog*
-rw-r–r– 1 root root 4775343 Apr 19 00:00 /var/log/maillog
-rw-r–r– 1 root root 84843661 Mar 20 03:35 /var/log/maillog-20160320
-rw-r–r– 1 root root 3073820209 Mar 27 03:40 /var/log/maillog-20160327
-rw-r–r– 1 root root 135365788 Apr 4 03:36 /var/log/maillog-20160404
-rw-r–r– 1 root root 19435583 Apr 10 03:45 /var/log/maillog-20160410

*0327のファイルにログがありそうに見えるが、
20から始まっていると判断し、27はログ見るのと後回しにした方がいい。
・SPAMメールの再送でログが肥大化するので、
27は再送ばかりでSPAMの送信元IPなどが取れない可能性もある
・27のログが大きいのでgrepかけたりするサーバの負荷が高くなる

 

4.やられてるアカウント名を探る

# grep sasl_username /var/log/maillog-20160320 | cut -d ‘ ‘ -f9 | sort | uniq -c | sort -nr
881 sasl_username=test@********.com
155 sasl_username=office@********.jp
21 sasl_username=konishi@********.com
4 sasl_username=support@********.jp

postfixでSASL使っている環境だと、ログは
Mar 22 13:48:00 000-000-000-000 postfix/smtpd[00000]: 000000000000: client=unknown[000.000.000.000], sasl_method=LOGIN, sasl_username=test@*********.com
こんな感じなので、
・sasl_usernameが入っている行をgrepで抽出して
・スペース区切りで9個目だけをcutさせて(例だとsasl_username=test@*********.com)
・その結果を統計とる
(uniq -cで統計が取れるが、次の行と一致しているかどうかだけで統計取るため、
先にsortで同じ行を集める必要がある。)
・統計結果を多い順にする
(uniq -cの結果は「数字<スペース>行の内容」なのでsort -nrで大きい順に並び替える)

testアカウントが怪しい。
ヒアリングすると一週間ほど使っていたアカウントだがメール送信はそんなしていないとか。

5.どこからログインしてるねん

# grep sasl_username=test@********.com /var/log/maillog-20160320 | cut -d’ ‘ -f7 | sort | uniq -c | sort -nr
838 client=unknown[147.175.16.71],
40 client=unknown[89.248.162.178],
1 client=unknown[38.87.46.160],
1 client=unknown[211.151.131.74],
1 client=unknown[122.114.117.176],

GeoIPで国を調べる

# geoipupdate
# geoiplookup 147.175.16.71
GeoIP Country Edition: SK, Slovakia

結果が出ずにcommand not foundな場合は
「yum install GeoIP GeoIP-update」

*今回の5つは全部海外でした。

 

6.アカウントの利用を止める(お客様了承のもと)
userdelなど。省略
(もちろん、他のアカウントも大丈夫かmaillog全体的に負荷考えながら調べる必要あり)

 

7.まずはお客様サイドの再発防止連絡
「testアカウントのパスワードが緩くなかったか」
「使ってるPCにウイルスがいないか確認してほしい」
「他と同じパスワード使っていないか」
「1か月に1回パスワード変えてほしい」などなど
IPAの資料URL送るなどでいいかも。

 

8.postfix側の再発防止する
参考→http://www.postfix.org/TUNING_README.html#conn_limit

/etc/postfix/main.cfの設定で
smtpd_client_auth_rate_limitが良いのだけれどpostfix2.10だったので使えない。
smtpd_client_message_rate_limit = 10
smtpd_client_recipient_rate_limit = 10
の2つ追加した。この設定は外部からの受信にも適用されるのでちゃんと考えて設定する必要がある

9.そもそも気づく方法なども入れる
まずはmaillogが4週間分しかなかったので
/etc/logrotate.conf
rotate 4

rotate 16
にした。ここはサーバの容量と相談してできるだけ大きめにする。
(今回みたいなログ肥大も考慮する)

気づくべくいろいろ策はあるが、取り急ぎメール滞留あればアラートが来るようにするなら、

MAIL_COUNT=`find /var/spool/postfix/deferred/*/* | wc -l` ; if [ $MAIL_COUNT -gt 5 ] ; then echo mail count is $MAIL_COUNT; fi

(findの検索フィルタ何も入れないことで全ファイル一覧が出ることになるので、
キューが保存されているフォルダ内のファイル数をwc -lで行数カウントすることで出して、
結果が5以上なら表示する。cronは標準出力があるとその内容をメールしてくれるのでメールの宛先だけ確認する)
こんなのをcrontabに入れておく。

元の通り、メールのログ量で見たいなら

grep “`date +”%d %H:” | cut -c2-6`” /var/log/maillog | wc -l

現在の「時」のログ行数を出す(毎時59分あたり実行でいいと思う。丁寧に00分になってから1時間分をやってもいいが…)
cutしているのは1日をdateコマンドで1と出せず、01となるがmaillogでは1なので。
閾値制にするのは前述のとおり変数に代入してからifで比較する。

9.各方面にごめんなさいする

http://multirbl.valli.org/

メールサーバなどで利用されるブラックリストの横断検索。
登録(悪い意味で)されているところへ片っ端からごめんなさいする。

ここまで書いておいてだが、Gmailは
gmail_spamguide
謝らなくていいから廊下に立ってろだそうでしばし時間がかかりそう。