スキップしてメイン コンテンツに移動

[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へのブルートフォースアタックを阻止する


コメント

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

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

      削除

コメントを投稿

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。