番外-bind+qmail+spf(SPAM拒否)

関連サイト:http://www.qmail.org/

openblocksではpostfixで色々遊んでいるけど、実は実際ビジネス等で使っているのはqmailだったりする。
理由=昔から使っているから運用方法が確立している。
   =昔から使っているから移行が面倒。

そしてSPAMフィルターにはbsfilterを使っている。
理由=qmailをリビルドしなくてよかったから、開発者のnabekenさんが優しいw

まぁこれで、後はフィルタリングできなかったスパムとうまく付き合えばいいかなと思っていたのですが
極悪なSPAMが登場しました。

あまりにもひどいので、番外として対応を載せます。
この方法は、 自分でアレンジしている部分もあるので、初心者には向きませんことを承知してください。

それは、なりすましによる、メール不達通知アタックです。

1.送信者Aは ***@hogehoge.com に送信元・返信アドレスを詐称してランダム送信

2.受信したサーバBはランダムに送信されているので、ほとんどあて先不明として
  詐称されたメールドメインC hogehoge.com にエラー通知メールを送る

3.hogehoge.com はBから大量のエラーメールを送りつけられる。

メールの流れ )A−>B−>C

これにより、BにSPAM、CにはDoSアタックの2重攻撃を受けることになります。

【対処1:ファイヤーウォール(以下FW)による送信元IPブロック】
  メールが時々エラーを出すことに気づき、メールサーバにログインすると
  なんだかターミナルが重い。
  
  管理者宛にエラーメールが大量に届いている。

  FWにてIPをブロック。

  で落ち着いたところでIPを調べてみると、AUのezwebサーバだった。
  AUに連絡しても取り合ってくれない(インターネット事業の管理者としてこの対応はまずいね)ので
  上位プロバイダに事情を説明してもらう。

  返ってきた答えは、そのIPは返信専用のezwebサーバです。
  「あて先不明のメールが来て、そのエラーメールを返すのは当然の行為なので
  ezwebサーバに遅延が発生するまで対応はできません」

  仕方なく、1週間ほどFWでブロックし続けているとSPAMはおさまった。

  それから1年ほどして・・・・またきました。

  その間にAUではSPAM対策が進み(まぁこの対策のせいでezweb宛てに35通以上メールを送ると
  接続がきられるのが厄介だが) 今度はVodafoneから同じ方法で大量のエラーメールが送られてきました。

  Vodafoneは受信メールサーバと返信メールサーバが同一のようで、FWでIPを制限すると
  通常のメールが届かないユーザが出てきてしまいました。

  これは問題です。
  しかしこの1年の間にCのメールサーバもスペックアップしていたので
  メールでのDoSアタックは「捨てる」と言う方法で遅延は発生しなくなったのでFWのブロックを解除します。
  でもログが醜いし、 サーバのリソースを消費されるのがいやだったので、次の対策を考えます。   

【対処2:DNSにSPF(Sender Policy Framework)登録】

  携帯電話ユーザによるSPAM被害が社会問題化されてきたため
  携帯電話各社は送信ドメイン認証に対応なんて記事をちらほら見かけるようになり
  「よかった、うちもDNSにSPFを登録すれば送信元詐称防げるわ」と思い設定してみる。

  調べてみると結構簡単で

  @ IN TXT "v=spf1 ip4:***.***.***.*** -all"

  と書くだけで、「v=spf1 -> 認証方法はspf1ですよ」「ip4:***.***.***.*** -> このドメインからは
  このIPからしか送信されませんよ」 「-all -> そのほかは捨てちゃってください」ということになるようです。

  うまくできたのかどうかわからないので、テストとしてHotmailにおくってみた。
  う〜ん、普通にメールが届いているから、成功しているのかわかりにくいが「?all」ではなく
  「-all」と厳しくしているのでOKでしょう。

  DNSが世界に反映されるまで1週間待ってみます。

  残念orz。未だにSPAM継続中です。
  上のニュースサイトの記事をよく見てみると
  「受信側でどういった認証技術を採用するかは未定。トレンドを見て検討していく」 だって。
  早く導入してほしいものです。

【対処3:qmailでspf受信認証】

  対処2で「Vodafoneさん頼むよぉ〜」 的な事を言っているのに自分のサーバが対応していないのはまずいので
  対応させてみます。

  現稼動サーバは、SMTP-AUTHや送信受付を587にしていたりするので、このビルドのqmailに影響を与えずに
  spf受信したい。

   関連サイト:http://www.qmail.org/
          http://www.saout.de/misc/spf/
          http://www.openspf.org/

  う〜ん qmail-1.03 が見当たらないです(見つけられない)。
  netqmailの中に入っているようなので、netqmailの中から取り出します。

  最終必要部分のみしかインストールしたくないので、必ずユーザで行う。   
  
  ###ソースをダウンロード###
  wget http://www9.jp.qmail.org/netqmail-1.05.tar.gz

  ###パッチをダウンロード###
  ###SPFはDNSを参照するので必ずdnsのパッチもあててください。
  ##spf 今回これがメイン
  wget http://www.saout.de/misc/spf/qmail-spf-rc5.patch
  ##dns 512 over spfをするのでDNS処理修正
  wget http://www.ckdhr.com/ckd/qmail-103.patch
  ##local-time 時刻をローカルタイムに変更
  wget http://cyberam.dip.jp/linux_server/mail/qmail-date-localtime.patch
  ##glibcが2.31以降の場合
  wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch
  ##条件分岐が間違えているのを修正
  wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.qmail_local.patch


  ###その他必要に応じて
  ##RFC2821準拠(AUでは拒否されるかもしれないので
  wget http://www.qmail.org/accept-5xx.patch
  ##qmail-realrcptto .qmailファイルが存在しない=ユーザがいないときは捨てる
  wget http://code.dogmap.org./qmail/qmail-1.03-realrcptto-2004.09.14.patch
  ##relay-reject リレーサーバではないので@や%を拒否
  wget http://www.qmail.org/qmail-smtpd-relay-reject
  ##big-concurrency 同時起動可能プロセス最大65000にアップ
  wget http://www.qmail.org/big-concurrency.patch
  ##localhost 0.0.0.0 自ホストを0.0.0.0とするRFCかなんかの関係上
  wget http://www.suspectclass.com/~sgifford/qmail/qmail-0.0.0.0.patch
  ##sendmail compatible sendmail互換を修正
  wget http://david.acz.org/software/sendmail-flagf.patch
  ##qmail-queue to look for an environment variable 受け取ったメールを別プログラムで処理できるように
  wget http://www.qmail.org/qmailqueue-patch
  ##tls TLSに対応
  wget http://inoa.net/qmail-tls/qmail-1.03-tls-20021228.patch
  ##SMTP-AUTHとSPFの共存
  wget http://www.saout.de/misc/spf/other/qmail-1.03-spf-smtpd-auth.diff.gz

  ###展開###
  tar zxfv netqmail-1.05.tar.gz
  cp netqmail-1.05/qmail-1.03.tar.gz ./

  tar zxfv qmail-1.03.tar.gz

  ###パッチ適用###
  cd qmail-1.03
  patch -p1 < ../qmail-spf-rc5.patch
  patch -p1 < ../qmail-103.patch
  patch -p1 < ../qmail-date-localtime.patch
  patch -p1 < ../qmail-1.03.errno.patch
  patch -p1 < ../qmail-1.03.qmail_local.patch


  ###コンパイル###
  make

  ###必要部分だけをインストール###
  su
  cp qmail-smtpd /var/qmail/bin/qmail-smtpd-spf    ←ここで既存のサーバとかぶらないように名前変更
  cp spfquery /var/qmail/bin/

  ###まず認証が通っても通らなくても、ヘッダに書き込みするだけのモード1で動かしてみる###
  vi /var/qmail/control/spfbehavior
  1


  ###起動###
  /usr/local/bin/tcpserver -HRx /etc/tcp.smtp.cdb -v -u 502 -g 501 0 25 /var/qmail/bin/qmail-smtpd-spf 2>&1 | /var/qmail/bin/splogger smtpd 3 &


  ###受信してヘッダをチェックしてみる###
  Received-SPF pass (hoge.hogehoge.com: SPF record at docomo.ne.jp designates 203.138.203.5 as permitted sender)
  Received-SPF pass (hoge.hogehoge.com: SPF record at spf-b.hotmail.com designates 64.4.61.45 as permitted sender)


  ドコモとHotmailからの受信OKです。
  (余談ですが、携帯電話やフリーメールは他のネットワークからのテストとして便利です。と言うか必ずやりましょう。)

  ###fail(deny)が帰ってきたら拒否するモード3に###
  vi /var/qmail/control/spfbehavior
  3


  この対策により、送信元詐称攻撃による二次被害を防ぐことができます。
  おまけとして、受信するSPAMの量が大幅に減ります。

  SPFを登録していないメールサーバからのメールを待ちます・・・・。(なかなかこなかったのであせりましたw)

  ###SPF未登録メールサーバからのメールヘッダをチェックしてみる###
  Received-SPF none (hoge@example.com: domain at verisign.co.jp does not designate permitted sender hosts)
  Received-SPF none (hoge@example.com: domain at mpb3.plala.or.jp does not designate permitted sender hosts)
  Received-SPF none (hoge@example.com: domain at rsmtp1.dion.ne.jp does not designate permitted sender hosts)
  Received-SPF none (hoge@example.com: domain at asahi-net.or.jp does not designate permitted sender hosts)
  Received-SPF none (hoge@example.com: domain at bm.postblitz.net does not designate permitted sender hosts)   


  「none」なので無事メールが届いています。

  さてここから問題なのですが、「-all」 とした「-」部分、これをクオリファイァと呼び
  + = Pass
  - = Fail
  ~ = SoftFail
  ? = Neutral

  となっている。
  したがって「-all」は「指定したサーバ以外は「Fail」 を返す。
  メールを受け取ったサーバはその結果を見て行動がきまる。

  今回導入した「SPF implementation for qmail 」の場合
    0: Never do SPF lookups, don't create Received-SPF headers
    1: Only create Received-SPF headers, never block
    2: Use temporary errors when you have DNS lookup problems
    3: Reject mails when SPF resolves to fail (deny)
    4: Reject mails when SPF resolves to softfail
    5: Reject mails when SPF resolves to neutral
    6: Reject mails when SPF does not resolve to pass
  となっているため設定した3では「fail」時にしかメールを捨ててくれない。

  しかし色々なサイトで紹介されている設定例は「SoftFail」や「Neutral」が多い。
  これはおそらく免責のためだろうが、標準は「Fail」で事情があるときは「SoftFail」や「Neutral」に誘導してほしいもんである。

  という訳で、「Softfail」や「Neutral」を拒否するか決めるためには最低でも大手プロバイダの状態を
  調査しなければなりません。

  ニフティ   SoftFail
  So-net    SoftFail
  Dion     SoftFail
  excite(日本) 未発見
  Biglobe    SoftFail
  ヤフー    DomainKeys採用のため未対応
  USEN     未発見
  DTI      SoftFail
  IIJ      SoftFail
  DoCoMo   SoftFail
  KDDI     SoftFail
  Vodafone  SoftFail
   (※未発見はプロバイダにより、サブドメインにのみ定義している場合があるので)

  現実問題、これだけのプロバイダが「SoftFail」だとスパマーは転々とプロバイダを変えながら
  スパムを送り続けることが可能である。
  なんせほとんどのSPF受信設定ではSoftFailのRejectは推奨してませんから。
  
  う〜ん、ここは結論を急がずに、SoftFailのスパムが増えてからSoftFailを拒否するか
  決めることにします。

  心配していたとおり、まだまだスパムはやってきます。
  noneは仕方なしにしろ(Microsoftは2004年頃にSPF&SenderIDを登録しろと警告していた気が!!今2006年ですw)
  yahooはDomainKeysを採用しているので、スパムの温床になりそうな予感。

  ###上記の対応以降届いたスパムヘッダ###
  Received-SPF: none (hoge.hogehoge.com: domain at mail.goo.ne.jp does not designate permitted sender hosts)
  Received-SPF: none (hoge.hogehoge.com: domain at hotmail.co.jp does not designate permitted sender hosts)
  Received-SPF: none (hoge.hogehoge.com: domain at yahoo.co.jp does not designate permitted sender hosts)
  Received-SPF: none (hoge.hogehoge.com: domain at yahoo.co.jp does not designate permitted sender hosts)
  Received-SPF: softfail (hoge.hogehoge.com: transitioning SPF record at spf-04.nifty.com does not designate
         202.239.124.17 as permitted sender)
  Received-SPF: neutral (hoge.hogehoge.com: 202.239.124.18 is neither permitted nor denied by SPF record at aol.com)

  Received-SPF softfail (hoge.hogehoge.com: transitioning SPF record at spf-d.hotmail.com does not designate 71.133.219.180 as permitted sender)
  Received-SPF none hoge.hogehoge.com: domain at mail.goo.ne.jp does not designate permitted sender hosts)
  Received-SPF none (hoge.hogehoge.com: domain at yahoo.co.jp does not designate permitted sender hosts)
  Received-SPF none (hoge.hogehoge.com: domain at ezweb.ncz.jp does not designate permitted sender hosts)


【対処3:qmailでDomainKeys】

  YahooはどうやらSPFに対応する気は無いらしく、このまま意地を張り続けるのは必至。
  仕事をしていると、こう言った意地の張り合いにはしょっちゅうぶつかり、その度に苦労させられるもんです。

  その辺に柔軟なIIJはすでにSPFとDomainKeysの両対応をしてきています。
  NTT-COMに資本握られてから、ちょっと融通が利かなくなったものの、まだまだ技術や思考は健在です。

  qmailのDomainKeys対応パッチとしてqmail-dk patchがあります(これしかない?)

  このパッチはSourceforgeで開発されているlibdomainkeysを使うようですので、まず入手

  wget http://ftp.tu-clausthal.de/ftp/FreeBSD/distfiles/libdomainkeys-0.68.tar.gz
  (通常はhttp://domainkeys.sourceforge.net/を参照してください。落ちてたので↑で入手)
  tar zxfv libdomainkeys-0.68.tar.gz
  cd libdomainkeys-0.68
  make

  
  cd ..
  wget http://www.qmail.org/qmail-1.03-dk-0.54.patch
  cd .
  cd qmail-1.03


  前回はとりあえず運用ベースに乗せたかったので、ポート25受信のみのデーモン適用のため
  qmail-smtp-spfとかしていたが、qmail-smtp自体をちゃんと対応させて見ます。
  パッチを適用するときに色々注文がつきます。おそらくこれを解消しているのがnetqmailですが
  自分で当てたいパッチだけ適用できるように、練習がてらパッチ修正しつつやってみます。

  patch -p1 < ../qmail-1.03-spf-smtpd-auth.diff

  ###spf-smtpd-auth適用後qmail-dkが挿入したい行がずれる
  ###さらにqmail-dkが置き換えたい箇所もspf-smtpd-authが変更しているのでそれもあわす。
  ###もうひとつqmail-dkのHow to 通りにやると構築中のディレクトリ構成が荒れるので
  ###libdomainkeysの指定先も変更
  ###../libdomainkeys.a −> ../libdomainkeys-0.68/libdomainkeys.a
  ###../domainkeys.h −> ../libdomainkeys-0.68/domainkeys.h

  vi ../qmail-1.03-dk-0.54.patch

   ##行指定を変えつつsqfqueryもつける
   diff -u orig/Makefile ./Makefile
   --- orig/Makefile 1998-06-15 06:53:16.000000000 -0400
   +++ ./Makefile 2004-08-22 23:40:19.000000000 -0400
   @@ -832,6 +832,7 @@
   forward preline condredirect bouncesaying except maildirmake \
   maildir2mbox maildirwatch qail elq pinq idedit install-big install \
   instcheck home home+df proc proc+df binm1 binm1+df binm2 binm2+df \
   +qmail-dk \
   binm3 binm3+df spfquery

   load: \

   ##行指定を変更
   @@ -1107,6 +1108,30 @@
   ↓
   @@ -1131,6 +1132,30 @@

  patch -p1 < ../qmail-1.03-dk-0.54.patch
  patch -p1 < ../qmail-103.patch
  patch -p1 < ../accept-5xx.patch
  patch -p1 < ../qmail-0.0.0.0.patch
  vi ../qmailqueue-patch

   ##行指定を変更
   @@ -1483,12 +1483,12 @@
   ↓
   @@ -1532,12 +1532,12 @@
  patch -p1 < ../qmailqueue-patch
  patch -p1 < ../qmail-date-localtime.patch
  vi ../qmail-1.03.errno.patch

   ##dns.cで2行削除したいができないのでばっさりと、その部分を削除し
  vi dns.c
   ##↓の2行を削除
   extern int errno;
   extern int h_errno;
  patch -p1 < ../qmail-1.03.errno.patch
  patch -p1 < ../qmail-1.03.qmail_local.patch
  make
  su
  make setup check
  cp qmail-dk /var/qmail/bin/
  chown root:qmail /var/qmail/bin/qmail-dk
  cp qmail-dk.8 /var/qmail/man/man8/
  chown root:qmail /var/qmail/man/man8/qmail-dk.8


  ###キーを作成###
  mkdir -p /etc/domainkeys/hogehoge.com
  cd /etc/domainkeys/hogehoge.com
  openssl genrsa -out rsa.private 1024
  openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
  mv rsa.private default
  chown -R qmaild .
  chmod 0600 default


  ###DNSに登録するキーを出力###
  grep -v ^- rsa.public | perl -e 'while(<>){chop;$l.=$_;}print "t=y; p=$l;\n";'
  t=y; p=MIGfMA0・・・・・・;     ←ここを登録

  まだ成功しているかわからないのにDNSに登録してしまったら、はじかれると怖いので
  まず使ってみる。

  ###qmail-dkに処理が移るようにQMAILQUEUE環境変数に値を渡す、キーの場所も教える###
  vi /etc/tcp.smtp
  :allow,RELAYCLIENT="",DKSIGN="/etc/domainkeys/hogehoge.com/default",QMAILQUEUE="bin/qmail-dk"
  /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp


  ###起動###
  /usr/local/bin/tcpserver -HRx /etc/tcp.smtp.cdb -v -u 502 -g 501 0 587 /var/qmail/bin/qmail-smtpd \
      hoge.hogehoge.com/bin/checkpassword /bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &


  ###メール送信テスト###
  DomainKey-Status: no signature

  ヘッダにこんなものがついてました。
  DNSに登録しないとだめなのかもしれないと思い登録してみる。
  _domainkey IN TXT "t=y; o=-;"
  default._domainkey IN TXT "t=y; g=1024; k=rsa; n=test; p=MIGfMA0・・・・・・;"


  ###メール送信テスト###
  DomainKey-Status: no signature

  やっぱりだめ。
  このままほったらかすと、はじかれる対象になるのでDNSを元に戻します。

  案の定yahooからのSPAM比率が飛びぬけてきました。
  何とか受信だけでも拒否できないものかと試してみます。

  ###qmail-smtpdだけ作り直す###
  make qmail-smtpd
  cp qmail-smtpd qmail-smtpd-spf-dk
  su
  cp qmail-smtpd-spf-dk /var/qmail/bin
  chown root:qmail /var/qmail/bin/qmail-smtpd-spf-dk


  ###smtpルールに追加###
  vi /etc/tcp.smtp.dk
  :allow,DKVERIFY="DEGIJKfh",QMAILQUEUE="bin/qmail-dk"

  /usr/local/bin/tcprules /etc/tcp.smtp.dk.cdb /etc/tcp.smtp.dk.tmp < /etc/tcp.smtp.dk

  ###起動###
  /usr/local/bin/tcpserver -HRx /etc/tcp.smtp.dk.cdb -v -u 502 -g 501 0 25 /var/qmail/bin/qmail-smtpd-spf-dk 2>&1 \
                        | /var/qmail/bin/splogger smtpd-spf-dk 3 &



  ###yahooのメールを受信してみる###
  Received-SPF none (hogehoge.com: domain at yahoo.co.jp does not designate permitted sender hosts)
  Received (qmail 52259 invoked by uid 60001); 21 May 2006 02:59:03 -0000
  DomainKey-Signature a=rsa-sha1; q=dns; c=nofws; s=yj20050223; d=yahoo.co.jp;
       h=Message-ID:Received:Date:From:Subject:To:MIME-Version:Content-Type;
       b=kVej+4SKo/pe2Hb/qogK+pp5rCP+doBrAbo0zJfXAf0euLVa1qUpnzSM1L+Pwn0JSZht1QcLdARz/LsyGM2a
       gKTznFU8L/qFEE3eOVyeJvaUhCbuc80TCPg6VCzvc+cV ;


  ドメイン認証系のヘッダ情報は上記のみ
  「DomainKey-Status: pass」とか「「DomainKey-Status: ok」とかを期待していたのですが見当たりません。
  しばらくこれで様子を見てみます。



便利:http://www.wikiroom.com/qmail/?qmail-manage#content_1_8



【ここまでのまとめ、メール受信用SMTP作成】

DomainKeysの効果は良くわかりませんが、SPFを設定しているプロバイダからのメールはほとんど
passかnone(サブドメイン単位で設定の為)になっており、SPAMはSoftFailでやってきます。
したがってspfbehaviorを4にアップさせます。

echo "4" > vi /var/qmail/control/spfbehavior

まだまだ、vodafoneからエラーメールが送りつけられてくるので、.qmailが存在しない(=存在しないユーザ)
へのメールを拒否するrealrcpttoパッチとログを見て、fromとtoをわかりやすくしてくれるパッチを追加し
RBLも参照してみます。

###必要なもの###
wget http://www.qmail.org/qmail-1.03.tar.gz
wget http://ftp.tu-clausthal.de/ftp/FreeBSD/distfiles/libdomainkeys-0.68.tar.gz
wget http://www.qmail.org/qmail-1.03-dk-0.54.patch
wget http://www.saout.de/misc/spf/qmail-spf-rc5.patch
wget http://www.ckdhr.com/ckd/qmail-103.patch
wget http://cyberam.dip.jp/linux_server/mail/qmail-date-localtime.patch
wget http://k2net.hakuba.jp/pub/qmail-syslog.patch
wget http://code.dogmap.org/qmail/qmail-1.03-realrcptto-2004.09.14.patch
wget http://www.qmail.org/accept-5xx.patch
wget http://www.suspectclass.com/~sgifford/qmail/qmail-0.0.0.0.patch
wget http://www.qmail.org/qmailqueue-patch
wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch
wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.qmail_local.patch

###改造して全てのパッチがあたるようにした物(公開して良いものかわからないので拡張子は秘密)###
###↓こういうものを作っておけば、再構築も楽だし、自分好みのqmailに出来る###
wget http://machtype.com/~flesh_gogo/machqmail-port25receive

###Domainkeysのライブラリをメイク###
tar zxfv libdomainkeys-0.68.tar.gz
cd libdomainkeys-0.68
make
cd ..

###qmailを構築###
rm -Rf qmail-1.03
tar zxfv qmail-1.03.tar.gz
cd qmail-1.03
patch -p1 < ../machqmail/qmail-1.03-dk-0.54.patch
patch -p1 < ../qmail-dk-0.54-auth.patch
patch -p1 < ../machqmail/qmail-spf-rc5.patch
patch -p1 < ../machqmail/qmail-103.patch
patch -p1 < ../machqmail/accept-5xx.patch
patch -p1 < ../machqmail/qmail-0.0.0.0.patch
patch -p1 < ../machqmail/qmailqueue-patch
patch -p1 < ../machqmail/qmail-date-localtime.patch
patch -p1 < ../machqmail/qmail-1.03.errno.patch
patch -p1 < ../machqmail/qmail-1.03.qmail_local.patch
patch -p1 < ../machqmail/qmail-syslog.patch
patch -p1 < ../machqmail/qmail-1.03-realrcptto-2004.09.14.patch

make
su
###インストール(上書きされるので注意)###
make setup check
###qmail-smtpdをqmail-smtpd-dk-spfという名前で受信専用SMTPにする###
cp -p /var/qmail/bin/qmail-smtpd /var/qmail/bin/qmail-smtpd-dk-spf
cp qmail-smtpd /var/qmail/bin/qmail-smtpd-dk-spf
###受信ルールを作成(リレーはさせない)###
vi /etc/tcp.smtp.dk
:allow,DKVERIFY="BDEGIJKfh",QMAILQUEUE="bin/qmail-dk"
/usr/local/bin/tcprules /etc/tcp.smtp.dk.cdb /etc/tcp.smtp.dk.tmp < /etc/tcp.smtp.dk
###tcpserverにRBLを読ませるように起動###
/usr/local/bin/tcpserver -HRx /etc/tcp.smtp.dk.cdb -v -u 502 -g 501 0 25 \
  
/usr/local/bin/rblsmtpd -r all.rbl.jp -r bl.spamcop.net -r list.dsbl.org -r sbl-xbl.spamhaus.org \
   /var/qmail/bin/qmail-smtpd-dk-spf 2>&1 | /var/qmail/bin/splogger smtpd-dk-spf 3 &

【対処4:他人にSPAMを送信しない】

  いったい何をどうしたらそうなるのかわからないが、ウイルス対策ソフトを入れていてもウイルスに感染する人がいる
  ここで、人としたのは必ず決まった人が感染するからである。

     特徴:仕事がめいっぱい詰まっていないー>暇である。
        :PCに対する知識が少ない
        :目を離すと仕事をさぼる

  このような人は、仕事中に目を盗んではあらゆるサイトを巡回するのである。

  こうした人はボット型のウイルスに感染しSPAMを他人に送りつけてしまう。
  やはりport25はブロードバンドルータ等の社内ゲートウェイの段階で止めましょう。

  INからOUTへの25ポートを使用した転送は全て止めます。
  ただし、例外的にLinux系やEmbed機器が送る為の25番ポートは穴を開けてやります。

【対処5:Domainkeysが行き詰ったのでbsfilterを紹介】

  bsfilterはメールの内容により、cleanメールとspamメールを学習して行き
  確率により、SPAM判定を行ってくれるフィルターでありqmailにも使えます。

  Ruby言語で動いているので、実行環境をインストール
  ###ダウンロード###
  wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.4.tar.gz
  ###展開###
  tar zxfv ruby-1.8.4.tar.gz
  ###移動###
  cd ruby-1.8.4
  ###環境設定###
  ./configure
  ###コンパイル###
  make
  ###インストール###
  su
  make install
  ###確認###
  /usr/local/bin/ruby --version
  ruby 1.8.4 (2005-12-24) [x86_64-linux]

  ###Rubyのインストール完了###
  exit
  cd..

  ###ダウンロード###
  wget http://prdownloads.sourceforge.jp/bsfilter/20232/bsfilter-1.0.14.tgz
  ###展開###
  tar zxfv bsfilter-1.0.14.tgz
  ###コピー###
  cp bsfilter-1.0.14/bsfilter/bsfilter ./
  ###確認###
  ./bsfilter --revision
  bsfilter release 1.0.14 revision 1.79
  ###bsfilterのインストール完了###

  ###スパムの学習###
  #まずspamメールの集合体をダウンロードし基本となるDBを構築しておく###
  #これでウイルス入りのメールは大体はじいてくれます###

  ###スパムをダウンロード###
  mkdir spambox
  wget ftp://daemon.jp.freebsd.org/pub/FreeBSD-jp/mail-archives/ports-jp/ports-jp-17201-17300.tar.gz
  wget ftp://daemon.jp.freebsd.org/pub/FreeBSD-jp/mail-archives/ports-jp/ports-jp-17301-17400.tar.gz
  wget ftp://daemon.jp.freebsd.org/pub/FreeBSD-jp/mail-archives/ports-jp/ports-jp-17401-17500.tar.gz
  ###展開###
  tar zxfv ports-jp-17201-17300.tar.gz
  tar zxfv ports-jp-17301-17400.tar.gz
  tar zxfv ports-jp-17401-17500.tar.gz

  ###spamメール学習###
  ./bsfilter --add-spam spambox/*
  ###確率データベースを更新###
  ./bsfilter --update

  ###確認###
  ./bsfilter --show-db-status
  db C 7721 913 41367 9300 47990
  db ja 17160 9528 28867 8754 40390
  #※今まで自分で貯めた分もあるので、上記どおり学習したスパムすうよりも大きくなってます。

  # --show-db-status
  #データベースの状況を表示して終了する。左のカラムから"db"(固定)、言語、clean tokenの数、clean mailの数、
  #spam tokenの数、spam mailの数、確率データベース内のtoken数を意味する。

  ###設定###
  #確率が0〜1までの間で計算されます。
  #なるべくcleanメールをspamと誤認識しないようにspam-cutoff値を0.90に設定します。
  #これで9割がたスパムでない限り、スパム扱いされません。
  echo "spam-cutoff 0.90" >> .bsfilter/bsfilter.conf

  #↑で書いたようにcleanメールをspamと判定されると厄介なので、あらかじめ手元に持っている
  #cleanメール、特に自分で購読希望したメルマガ等を学習させておくと良いでしょう

  ###cleanメール学習###
  ./bsfilter --add-spam cleanbox/*
  ###確率データベースを更新###
  ./bsfilter --update

  準備は整いました、後はSPAMをどう扱うかですが、判定して別のアドレスに転送すると
  言う方法で簡単にフィルタリングできます。

  アカウント名:hoge

  vi .qmail
  | /var/qmail/bin/condredirect hoge-spam ./bsfilter
  ./Maildir/

  これでbsfilterがspamと判断したら0で終了し、hoge-spamに転送され、cleanなら下の行に移りMaildirに配送される
  .qmail-spamで好きな処理を書く

  vi .qmail-spam
  ./spambox/       #スパム収集ディレクトリに配送
  | cat > /dev/null    #捨てる
  &spamcheck      #スパムチェック用アカウントに転送

  これでとりあえずフィルタリングできます。

  ここにPerlで書いた自己流のフィルタをかませてみようと思います。

  まず、メールの内容をPerlで受け取り、そのままbsfilterに受け渡してみます。
  (ここからは、あてずっぽうでやってますのであしからず・・;)

  vi bsplus.pl
   #!/usr/bin/perl

 
  while(<STDIN>)
  {
    push @mail, $_;
  }

  open txtOUT,"|./bsfilter";
    print txtOUT @mail;
  close txtOUT;

   $status = `echo $?`;
  if($status == 0)
  {
    exit 0;
   }
  else
  {
    exit 1;
  }

  chmod 755 bsplus.pl

  vi .qmail
  | /var/qmail/bin/condredirect hogehoge-spam ./bsplus.pl
  ./Maildir/

  何とか動いているようです。

  Domainkeysがなんだか失敗しているので、簡単なyahooチェックをします。
  yahooなら必ず「DomainKey-Signature」がヘッダについているので
  yahooなのにDomainKey-Signatureが無いものがきたときにはexit 0を返すようにします。
  ついでにspamの特徴Dateヘッダがない件も対応。

  vi bsplus.pl
  #!/usr/bin/perl

  $status = 1;
  $yahoo = 0;
  $dt = 0;

  while(<STDIN>)
  {
    push @mail, $_;
  }

  foreach(@mail)
  {
    if($_ =~ /\@yahoo.co.jp/)
    {
      $yahoo = 1;
    }
    if($_ =~ /\@yahoo.com/)
    {
      $yahoo = 1;
    }
    if($_ =~ /Date: /)
    {
      $dt = 1;
    }
  }

  if($dt == 0)
  {
    $status = 0;
  }

  if($yahoo == 1)
  {
    foreach(@mail)
    {
      if($_ =~ /DomainKey-Signature/)
      {
        $yahoo = 2;
      }
    }
  }

  #print "yahoo=" + $yahoo;
  if($yahoo == 1)
  {
    $status = 0;
  }

  if($status != 0)
  {
    open txtOUT,"|./bsfilter";
      print txtOUT @mail;
    close txtOUT;

    $status = `echo $?`;
  }

  if($status == 0)
  {
    exit 0;
  }
  else
  {
    exit 1;
  }

  実は本当にしたいことはこれからで、フィルターで誤認識されたもののチェックのため結局
  スパム収集アカウントに集めて、定期的にスパムを監視してるのですがその量の多いこと多いこと・・・。
  現在確率0.9以上のときはスパム扱いにしてるのですが、実際のところ0.9以上1.0以下を
  チェックして、1.0の時はそのままゴミ箱に突っ込みたいのです。

  そこで、bsfilterでspamと判断されたものから、さらにDateヘッダなし、yahooでDomainKey-Signatureなし
  bsfilterでの判定が1.0の時には捨てるようにします。

  vi spamcut.pl
  #!/usr/bin/perl
  
  $status = 1;
  $yahoo = 0;
  $dt = 0;
  
  while(<STDIN>)
  {
    push @mail, $_;
  }
  
  open txtOUT,"> spam.tmp";
    print txtOUT @mail;
  close txtOUT;
  
  `./bsfilter spam.tmp > spam.rate`;
  
  open txtIN, "spam.rate";
    if(<txtIN> =~ /1.000000/)
    {
      $status = 0;
    }
  close txtIN;
  
  #`rm spam.tmp`;
  #`rm spam.rate`;
  
  if($status == 1)
  {
    foreach(@mail)
    {
      if($_ =~ /\@yahoo.co.jp/)
      {
        $yahoo = 1;
      }
      if($_ =~ /\@yahoo.com/)
      {
        $yahoo = 1;
      }
      if($_ =~ /Date: /)
      {
        $dt = 1;
      }
    }

    if($dt == 0)
    {
      $status = 0;
    }

    if($yahoo == 1)
    {
      foreach(@mail)
      {
        if($_ =~ /DomainKey-Signature/)
        {
          $yahoo = 2;
        }
      }
    }

    if($yahoo == 1)
    {
      $status = 0;
    }
  }
  
  if($status == 0)
  {
    exit 0;
  }
  else
  {
     exit 1;
  }

  ##まずここに配送されbsfilterで確率0.9以上を.qmail-spamに任せ、以下を通常配送
  vi .qmail
  | /var/qmail/bin/condredirect hoge-spam ./bsfilter
  ./Maildir/

  ##スパムのときここに配送されspamcut.plでDateヘッダなし、yahooでDomainKey-Signatureなし
  ##bsfilterでの判定が1.0の時には.qmail-garbageに任せ、それ以外をspamcheckアカウントへ配送

  vi .qmail-spam
  | /var/qmail/bin/condredirect system-garbage ./spamcut.pl
  &spamcheck

  ##捨てる。
  vi .qmail-garbage
  | cat > /dev/null

  これで何とか、うまく動いているようです。
  しかしこれは検証用だから良いですが、一度メールを書き出し、判定結果を書き出し、読み込む
  なんて事をしているので、サーバの負荷やファイルロックや整合性関係の処理を追加しないと
  本番導入できません。

  ファイルを書き出さずに、spamcutをかませて見ましょう。

  #まずbsfilterをパイプモードで動かしprobabilityをつけて標準出力したものをspamcut2.plで受け取ります。
  vi .qmail
  | ./bsfilter --pipe --insert-probability | ./spamcut2.pl
  | /var/qmail/bin/condredirect hoge-spam ./bsfilter
  ./Maildir/


  #qmailのexitコードを利用し、捨てたいメールが来たときは99を返すとそれより下のコードは実行されない。
  vi spamcut2.pl
  #!/usr/bin/perl

  $status = 1;
  $bsflg = 0;
  $yahoo = 0;
  $domainkeys = 0;
  $dt = 1;
  
  while(<STDIN>)
  {
    if($_ =~ /X-Spam-Probability: 1.000000/)
    {
      $bsflg = 1;
    }
    if($_ =~ /\@yahoo.co.jp/)
    {
      $yahoo = 1;
    }
    if($_ =~ /\@yahoo.com/)
     {
      $yahoo = 1;
    }
    if($_ =~ /Date: /)
    {
      $dt = 0;
    }
    if($_ =~ /DomainKey-Signature/)
    {
      $domainkeys = 1;
    }
  }
  
  if($bsflg == 1 || ($yahoo == 1 && $domainkeys == 0) || $dt == 1)
  {
    exit 99;
  }
  else
  {
    exit;
  }

  #.qmail-spamを元のシンプルな状態にもどす。
  vi .qmail-spam
  &spamcheck      #スパムチェック用アカウントに転送

  #こうすれば元の状態からの変更点は、spamcut2.plの設置と
  # .qmailに1行追加するだけで良くなりました。
  
                                                                                                                                                           bs q




上へ
 トップページへ