【spam対策】:さくらのレンタルサーバのfmlでスパム対策をする
うちの鯖ではメーリングリストを2件運用している。さくらのレンタルサーバがfmlをインストールしてくれてあるので、設置はとても簡単なのだが、今月に入ってそのうちの一つのMLでやたらスパムメールが飛び交うようになってしまった。
多分原因はメーリングリスト参加メンバの一人がウイルススパムに引っかかって、自分のアドレス帳に載っているメールアドレスを垂れ流してしまったこと。そのなかにメーリングリスト用のアドレスも入っていて、どこかで拾われたっぽい(ので僕のところには自分のアドレスとMLのアドレスと両方からスパムが増えてしまった)。
まあ、参加メンバがウイルスに引っかかったり、スパムをやらかしたりと言うのは責におえる話では無いし、そういう状況に対応してこそ自前で運用していることの最大のメリットであるべきだと考えているので、いろいろ設定を加えてみた。この記事はその備忘記事。
なお、この記事の内容はfml の SPAM 対策を大いに参考にしてもらった。と言うか、ほとんど抜粋でしかない。参考記事は決して新しい記事ではないようだが、参考元にもあるようにfml自体が相当に古いソフトでもあるので、参考記事の内容で充分であった。
スパムメールフィルタを通す設定にする
まずは必須の設定。さくらのレンタルサーバはspamassassinと言うベイジアンフィルタを標準搭載しているので、これはぜひ活用したい。
スパムアサッシンの設定はサーバ提供の初期設定でも構わないが、可能なら日本語環境向けにカスタマイズぐらいはしておきたい。
うちのサーバでのspamassassinカスタマイズ状況は、臨時対策:最近急に増えたスパムメール対策および2011年04月版SpamAssassinのベターな設定@さくらインターネットのレンタルサーバにまとめてあるので、そっちを参考にされたし。
で、SpamAssassinに対応する設定は以下の通り。
まず、/home/(user名)/fml/spool/ml/(ml名)/を開き、そこのconfig.phファイルとcfファイルに以下のコードを書き加える。
(config.ph:445行目ぐらいに設定があるのでコメントアウト外して追記しても、その辺りにコード追記でも構わない。もちろんどこに書いてもいいけど)
<code> $USE_DISTRIBUTE_FILTER = 1; &DEFINE_FIELD_PAT_TO_REJECT('X-Spam-Flag', 'Yes'); </code>
(cf:90行目辺りの# YOU CAN EDIT MANUALLY AFTER HERE. の後に書いておくのが無難だと思う)
<code> USE_DISTRIBUTE_FILTER 1 &DEFINE_FIELD_PAT_TO_REJECT('X-Spam-Flag', 'Yes'); </code>
両方同じ設定を書いてあるように見えるけど、まあおまじないと言うことで両方書いておいた方がいい。また、同じように見えて;一個分表記が違うのでその辺は一応注意。たしかさくらのレンタルサーバ初期設定でも、うちのスパムフィルタ設定参考にしても、さくらのレンタルサーバ非公式FAQを参考にしても、X-Spam-FlagをYesにして判定しているのは同じはずなので、そこは気にしなくてもいいだろう。これで、fmlのフィルタ機能が有効になる。
次に、同じく/home/(user名)/fml/spool/ml/(ml名)/の、includeおよびinclude-ctlに以下のように書き足す。
(includeの場合)
<code> "|/usr/local/bin/spamassassin |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name " # Multipart Canceler Filter by Yuao TANIGAWA #"|/home/user-name/fml/bin/multipart.pl |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name " </code>
(include-ctlの場合)
<code> # ***ATTENTION*** --ctladdr options is stronger than "--distribute", # Hence even if config.ph has the setting &DEFINE_MODE(distribute), # this "fml.pl ... --ctladdr" does commnads-service; "|/usr/local/bin/spamassassin |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name --ctladdr" # Multipart Canceler Filter by Yuao TANIGAWA #"|/home/user-name/fml/bin/multipart.pl |/home/user-name/fml/fml.pl /home/user-name/fml/spool/ml/fml-name --ctladdr" </code>
つまり、|/usr/local/bin/spamassassinを書き足す(上記コードではuser-nameおよびfml-nameを適宜修正すべし)。include-meadなんてファイルもあるが、これは書き換えても書き換えなくてもどっちでもいいだろう(エラーメール用のフィルタらしい)。これで、フィルタの中でSpamAssasinを呼ぶように設定が加わる。なお、参考記事では|/usr/bin/spamassassinとなっているけど、さくらのレンタルサーバではSpamAssassinの置き場所が違うのでそこは注意。一応SSHログインしてwhich spamassassinをして場所を確認しておいた方がいいかもしれない。
で、この二つを書き終えるとスパムからのfml投稿は拒否されるわけだけど、拒否された結果どこかの.spamボックスなどに残るのか、闇夜の彼方に消え去るのかはちょっと不明。時間があれば調査したい。
参加者以外の投稿を禁止
上記設定してあればほとんどのメールは食い止められると思うが、一部スパムフィルタをすり抜けるメールは存在するだろうので、ML登録者以外からの投稿は禁止してしまった方がいい。メーリングリストを介してスパムを垂れ流すなんて正直、管理者として赤っ恥もいいところなので、そんなメールはゼロにしたいと言う強い思い入れでもある。
なお、この設定をして何が困るかと言うと、ML参加者が複数のメールアドレスを所持していて、たまたまML配信先とは違うアドレスから投稿したら拒否された、と言うケースだが、fmlでは一応『配信可能なアドレス』と『配信されるアドレス』は別個に設定できる。設定はさくらのレンタルサーバコントロールパネルからでも可能だし、fmlの設定メニュー(makefml config ML)からでも可能だけど、めんどくさいので/home/(user名)/fml/spool/ml/(ml名)/にある
members→『配信可能なメールアドレス』
actives→『配信されるメールアドレス』
の一覧なのでこれに直接書き足した方が手っ取り早いと思う。で、管理者ですら知らないメーリングリスト参加者の保有メールアドレスへの対応はすっぱり諦めよう(余裕があれば棚卸調査のメールをMLに流してもいいとは思うが)。
で、以下のように設定を書き換える。/home/(user名)/fml/spool/ml/(ml名)/を開き、そこのconfig.phファイルとcfファイルを再び開きコードを書き換える。
(config.ph:90行目ぐらいと115行目ぐらいに設定があるので、書き換える。)
<code> $MAIL_LIST = "fml-name\@$DOMAINNAME"; $PERMIT_POST_FROM = "members_only"; $REJECT_POST_HANDLER = "ignore"; $CONTROL_ADDRESS = "fml-name-ctl\@$DOMAINNAME"; $PERMIT_COMMAND_FROM = "members_only"; $REJECT_COMMAND_HANDLER = "ignore"; </code>
(cf:26行目辺りからのアクセスポリシーの書き換え)
<code> ### Access Policy MAIL_LIST lapis@$DOMAINNAME PERMIT_POST_FROM members_only REJECT_POST_HANDLER ignore CONTROL_ADDRESS lapis-ctl@$DOMAINNAME PERMIT_COMMAND_FROM members_only REJECT_COMMAND_HANDLER ignore </code>
これも両方設定は同じことなんだけどおまじないで両方書き換えで。要するにPERMIT_XXX_FROMをmembers_onlyに、REJECT_XXX_HANDLERをignoreにしている。参加者以外からのメールは拒否した上に無視する、と言うこと。無視にしておかないと、『spam業者がfmlにメールを投げる』→『fmlが拒否メールをspam業者宛てに返す』→『spam業者から文句のメールが返ってくる』と言うくだらない事態が起こるからだ。文句と言うのはReturned mail: see transcript for details(reason: 550 5.1.:User unknown)だったりWarning: could not send message for past 4 hours(454 4.7.1 : Relay access denied)だったりとまあいろいろ(と言うか文句言ってるのはspam業者の鯖じゃなくてうちの鯖か)あるのだけど、こんな無駄なキャッチボールしてても仕方ない。
この設定をしておくことで、少なくともfml参加者にスパムを垂れ流すことは防げるだろう。いや、さらにfml参加アドレスで詐称してスパムメール流して来たらどうすんの?とかなくもないけど、そこまでになったらその時考える。まあ、可能性として高いのは、『詐称されるアドレス垂れ流すほどリテラシーの低いそのML参加者の方になんらかの対策を促し、それが不可能ならそのML参加者を退会処置にする』とすべきかなあ。
不正メール受信時の警告メール抑制
上記まで終えるとスパムメールがメーリングリスト上に流れたり、スパムメールに対して無駄な応答をしたり、と言った処置には対応が済むのだけど、最後の迷惑モノとして、メーリングリスト管理者宛てに「不正メールが来たので報告しておきますよ」と言うfmlのおせっかい機能がある。まあ、そりゃfmlのソフトの挙動として不審なエラーを報告する義務は大事なんだけど、毎日そんな報告を何件も受けていても仕方ない。ので、このfmlおせっかい機能を無効にする。
これは直接ソースコードを書き換えるしかないので、/home/(user名)/fml/を開き、そこのfml.plファイルを開きコードを改変する。
(fml.pl:1833行目辺りからのIgnoreHandler関数の改変)
<code> sub IgnoreHandler { &Log("Ignored: \"From:\" field is not member"); # &WarnE("Ignored NOT MEMBER article from $From_address $ML_FN", # "Ignored NOT MEMBER article from $From_address"); } </code>
IgnoreHandler という関数定義の中の「WarnE」をコメントアウトする。
これでfmlへの迷惑なメールの対処は一応完了。