2011/11/30

[qmail]メールサーバーがスパムの踏み台になった時にハッピーになれるツールを紹介します

メールサーバーの踏み台にされてどこから手をつけたものか途方に暮れていた時に僕の道しるべになってくれたツール達を紹介します。
メールサーバーはqmailだったのであと何年共有できるか分からない話ですが、対処の方法は変わらないと思いますので流れだけでも掴んでいると安心なのではないでしょうか。




・なぜ踏み台にされたとわかったか。
このメールサーバーは普段僕が利用しているものではなかったので、利用者から連絡がありました。内容は「メールが相手に届かない」というもの。サーバー内からmailコマンドで送信を試みたものの受信できなかったので、調査をしました。

・キューに溜まっていたメールの量に失神・・・
とりあえずqmailのプロセスがご存命なのかをpsコマンドで確認・・・。
ps -ef

qmail-remote というプロセスが大量発生している様子。
こんな状況でも、一応qmailは動作を続けている(メールキューを溜めたりはできてる)ようなのですが、qmail-remoteを見るかぎり、糞詰まり状態になっている。
maillogを確認すれば一目瞭然。bounceされているメールがグルグルと輪廻転生を繰り返している様子。すごい勢いでログのサイズが増えていきます。こりゃだめだ。

見たくないけどメールキューが何件溜まっているかを確認するため、qmail-qstatというqmailのツールを利用しました。
/var/qmail/bin/qmail-qstat
Total messages: 18578
Messages with local recipients: 0
Messages with remote recipients: 18578
Messages with bounces: 16447
Messages in Preprecess: 20

なんじゃこりゃあああwwww ということで、見た瞬間に誰かメールアドレスのパスを抜かれた事に気付きました。高々200か300アドレスをさばくメールサーバーの抱えているリモートキューの量ではない・・・。

先ほどのpsコマンドの結果を見た時に分かったのですが、攻撃は1箇所からしか行われていないようだったので送信元がスパムのアドレスになっているキューを全て削除し、このアドレス(とドメインとIPアドレス)からの送信はできないようにすると、とりあえず攻撃は止むんじゃないかと。とりあえずゴールはそこに設定します。

・さて、メールキューを削除するぞ
第一弾の対処として、溜まったメールキューを何とかする必要があります。ばっさり行くなら、rmコマンドだけで対処できるようですが、今回は全削除とか大胆な対処は行えないので、仕方なくスパムで利用されているメールアドレスのキューのみを削除することにします。
そこでまず利用したのは、queue-fast.plというツール。
このツールでキューの閲覧から削除まで行えるようですが、今回は後述するqmHandleよりいじりやすいメールキューの全件リストを表示するので利用しました。
perl queue-fast.pl

とすると、メールキューの全件リストが表示されますので、lessかmoreしないとえらい事になります・・・。
リストをgrepして欲しいメールアドレスだけを抜き出せたら、qmHandleで使うためのMessageIdをcutで抜き出してMesssageIdのリストを作ります。
MessageIdのリストが出来れば、あとはqmHandleでガツガツ削除していくだけです。
実は、この部分はシェルスクリプトを書いたので掲載しておきます。bashです。
vi delete_queue.sh

#! /bin/bash
while read LN; do
  ID=`echo ${LN} | cut -d" " -f1 | cut -d"/" -f2`
  perl qmHandle -d${ID}
done < delete_queue.txt

リストを手動で作ったあと、一度目視でざっくり確認を入れてからシェルを回す、という想定でツールを書きました。
リスト作成からシェルを組むと、取り返しの付かないgrepを組んでしまった時、泣くしかありませんので。リストを作る際のコマンドはだいたいこんな感じ。
perl queue-fast.pl | grep "スパムのメールアドレス" > delete_queue.txt

シェルを起動したあとは、qmHandleの実行結果が流れ続けます。私の場合は、実行結果はファイルへリダイレクトし、別のSSHターミナルを立ち上げて、tail -fで確認していました。
シェルを回す前は、必ずqmail-sendプロセスを停止させてください! これは絶対!

・いよいよ最終局面へ。
この作業は、人によってしなくてもいいかも知れません。スパムの入り口になっているメールアドレスのパスワードを変更できれば、一旦は収束するはずですので。ただ今回は、まったく面識のない不特定多数の方たちに提供しているメールサーバーですので、強引にメールアドレスのパスワードを変更するわけにも行きませんでした。
そこで、badmailfromを利用した送信元制御。
badmailfromは超単純なメールアドレスフィルタです。/var/qmail/control/badmailfrom に送信禁止にしたいメールアドレスを列挙していくだけです。なので、
echo "aaa@example.com" >> /var/qmail/control/badmailfrom

これだけでaaa@example.comがfromになっているメールを送信できないようにできます。@example.comだけを書きこむと、ドメイン単位で禁止にできます。対応に時間がかかってイライラしていたのでIPアドレスも記載してやりましたが、効果のほどは不明です:-P
実はこれだけでは飽きたらず、tcpwrapperでもIPアドレスをアク禁にしたのは内緒です。海外IPなのでいいや・・・(ホントは良くないよ!)。

以上が今回のスパムメールの件で対応した内容です。良いツールがすぐに見つかったお陰で割と早い対応ができましたが、なかったらと考えると・・・。あ、qmailには、標準でも普通に管理ツールとして使えるものが同梱されているので利用してもいいかと思いますが、qmHandleが良い感じなので、このツールのオプションを解説して今日は締めましょう。 qmHandleのオプション
-a
キューイングされたメールの送信を試みます。
-s
キューイングされたメールの件数を詳細に表示します。
-R
キューイングされたリモートキューのヘッダ情報を列挙します。
-L
キューイングされたローカルキューのヘッダ情報を列挙します。
-l
キューイングされたリモートキュー、ローカルキュー全部のヘッダ情報を列挙します。
-m
指定したMessageIdのメールを閲覧します。 ex) perl qmHandle -m12345
-d
指定したMessageIdのメールを削除します。 ex) perl qmHandle -d12345
-D
キューイングされたリモートキュー、ローカルキューを全て削除します。これは禁断のコマンド的な。
-N
-l、-R、-Lと組み合わせて使う。ヘッダ情報を表示しなくなる。-sとの違いが分からない。

皆さんもスパムに負けず、健全健康なサーバー管理ライフを!

see also:
[qmail]スパムは続くよどこまでも - qmail vs spam 全面戦争編 -
[Linux]fail2banを使ってqmailへのブルートフォースアタックを阻止する


2 件のコメント:

  1. 正直助かりました。
    関連リンクのスパムは続くよどこまでものページがなくなっていたのですが、気になります。
    私のサーバーもまだ戦いは続いていますが頑張ります。
    PYTHONのバージョンを上げて、ブルートフォースに備えます。

    返信削除
    返信
    1. >匿名さん
      お役に立てて何よりです!
      関連リンクの件ですが、書いてから数年経って見た結果、内容があまりに稚拙だったので
      一度取り下げて内容を再構築しようと思っている状態でした。
      おそらく再公開する頃には、匿名さんの戦いは終わっていると思いますが
      目にする機会がありましたら、ぜひ読んでまた感想でも聞かせていただければと思う次第です。

      削除