あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

postfix が spam 送信踏み台にされてげきおこ

作業費半人日以下だったか、そもそも無料だったか忘れたけど、メールサーバを立てろとか言われて作業したら ftp 鯖もとか web 鯖も!とか ftp はアクセスしたルートディレクトリが document_root になってない!とか文句いわれまくって相当ビキビキしながら作業したの鯖が spam の踏み台にされてました。なお初期構築作業だけで、保守とかいらねえよ黙れみたいな感じだった。

お金ないから postfix には SSL 証明書いれないもん!とかむちゃくちゃ言ってたはずなので、正直聞いた時はざまあwwwwwwみたいな感想しか出ませんでした、なんで皆月額保守費ケチって信用を失うんだろう?5万10万出せって言ってるわけじゃねーのになあ。安くしたいなら gmail でも使えばいいじゃない。

愚痴ここまで。

postfix 乗られた!どうする?

まずサービスを止めましょう。

[root@localhost ~]# /etc/init.d/postfix stop

次にメールログを確認しましょう。

[root@localhost ~]# less /var/log/maillog

saslauth failure とかなんかもう明らかにヤバい感じですか?ヤバい感じですね悲しいですが乗られてますね、じゃあ次のステップです。

メールキューを削除する

御存知の通り、メールサービスは

  1. メールを作成する
  2. ユーザが送信する
  3. smtpサーバのキューに格納されて順番を待つ
  4. 自分の番になったら送信される

こんな感じです。spamなんかに利用されると、このキューの部分に大量に spam メッセージが滞留する事がありますので、以下のコマンドでキューの残弾を確認しましょう。

[root@localhost ~]# mailq
(ry
 Total requests: 残り件数
( mailq | wc とかで件数拾えると思うよ)

今回トラブルを起こしたサーバは一万件以上ありました、しね。じゃあ残弾を削除します。

[root@localhost ~]# postsuper -d ALL

これで問答無用で全て消えます。一応作業前に mailq > queue.txt とかでファイルに内容出力して、明らかに spam じゃないメールがあったら、サービス再開後に再度送信してもらうしかないでしょーな、postqueue に特定のキューだけ再送を試みるオプションとかいまあんの?
あと ALL って明示的に大文字で書かないとダメらしいよ、これは誤作動防止ってドキュメントに書いてあったはず。

対策

このままサービス再開しても再度蹂躙されるだけなので、main.cf にでも対策を、と思ったけど、利用元が static な IP 採用してない場合(モバイルルータとか普通の ISP 使ってる場合)大量に書かないと行けないので、それなら tcpwrraper に書こう。

[root@localhost ~]# vi /etc/hosts.deny
postfix : all
[root@localhost ~]# vi /etc/hosts.allow
postfix : 127.0.0.1
postfix : 日本国内のIP/netmask

postfix : 日本国内のIP/netmask」については、http://www.hayate.mobi/?p=11:こちらの記事から SSH の国内限定アクセスのサンプル流用させて頂きました。「SSH_CountryIP.txt」を grepsshd -> postfix と書き換えて、行末の 「 : allow」を削除したけど、期待した動作はしているようだったので多分大丈夫です。全部で1939行!うん、hosts.allow が大変なことになったな!(しろめ

サービスの再開と動作確認

サービスを再開します。

[root@localhost ~]# /etc/init.d/postfix start

サービス再開後は、/var/log/maillog あたりをしばらく tail -f しながら、動作確認をします。適当に動作確認に利用可能なユーザを追加するか、元々あるユーザを追加して、

  1. IMAP なり POP なりでメールボックスが確認できること
  2. まったく関係ない外部のアドレスから受信できること
  3. まったく関係ない外部のアドレスへ送信できること

このへんを確認しておけばいいでしょう。あとは受けてしまった Spam の烙印を消す方法はわからん、陳情しろ。

maillog に failure が一杯でてうざい

iptables かなんかで防いでやれば多分メールサービスに到達する前にアクセスを阻止できるはずだから、そっちで制御すれ。

postfix : .jp じゃだめなん?

「/etc/hosts.allow に postfix : .jp とか書いてあるのをみたけどどうなん?」みたいな疑問もあると思いますが、逆引きできる所からアクセスしてれば、それでも構わないと思います。逆引きできても Yahoo!BB みたいに .net だからだめー、みたいなとこもあって一長一短だけど。あと普通に使う人以外をターゲットにしてるなら、逆引きできなかった時アクセス元が IP アドレスになるので、サービス使えませんね?なので利用するユーザに合わせて設定、しよう!
まー postfix : .jp とかするとローカルユーザからメール送れなくなるから素直にやめとけ。

参考(thx!!):
http://www.hayate.mobi/?p=11
Postfixで未配信メールの確認 | OpenGroove
Wietse's Postfix Project (xD)でも EUC JP なページで最初焦った

追記:アクセス拒否しても、これだとログファイルが延々と続く試行で汚染されちゃうよ〜

なんとかしろよオラァン!ということで、もうそもそも iptables でアクセスを拒否しましょう。しぬがよい。

[root@localhost ~]# vi /etc/sysconfig/iptables
  -A INPUT -s 80.28.16.250 -j DROP
[root@localhost ~]# /etc/init.d/iptables restart
[root@localhost ~]# /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  250.red-80-28-16.adsl.static.ccgg.telefonica.net  anywhere
(ry

糞は滅びた。一応 /var/log/maillog でアクセスが来なくなったこととか、/var/log/messages で、smtp ログイン試行が繰り返されてない事を確認してください。ちなみに、iptables のアクセス制御でぐぐるCLI から直接 iptables なんとか〜って記述してから、 /etc/init.d/iptables save してる記事が殆どですが、僕は上記のように、iptables の定義ファイルを直接編集する人なので、save を利用せずにサービスのリスタートだけしてます。

ちなみにめんどくせえので書いてますが「80.28.16.250」とかいう IP から spam 飛んできてました。スペインの Telefonica が保有する IP ですね、日本の企業でいうと USEN みたいなとこです(やってるブラックな手口も似たようなもん、こういうのは世界共通なんすねえ)。
Contact Us から spam 報告しようかと思ったらクッソやる気うせる連絡先しかなくてどうすんのこれ、みたいな気分になった。あえてshareholders 向けの窓口に連絡してやろうか。