4月 222011
 
シェアする


From詐称した迷惑メールへの対応として、「BATV」をPostfixで有効にしたいと思う。
BATVはBounce Address Tag Validation(バウンスアドレス タグ バリディション)の頭文字をとったらしい。
細かいところは自身で検索を。

参考にしたサイトはこちら

batv-proxy.plの動作として、

  1. メールを送信する際、送信元メールアドレス情報にタグをつける
  2. 送信先でエラーになってバウンスメールとなり戻ってくる。
  3. 戻ってきたバウンスメールの宛先メールアドレスからタグを探す
  4. タグが有る場合は受信しますが、ない場合は拒否する

From詐称されたメールがバウンスしてきた場合、上記「3」の時点でタグを見つけられないため、「4」にてメールは拒否されます。

設定に先立ち、ちょっと理解に時間が掛かったのが、アウトバウンド(サーバから送る)メールインバウンド(サーバに届く)メールで使うポート番号を分けるということ。batv-proxy.plの機能の中で「送信元メールアドレス情報にタグをつける」という作業と「メールアドレスからタグを探す」という作業を行っており、それぞれアウトバウンド用のポートとインバウンド用のポートの用意が必要だった。

今回、trippyboy.comの環境では、587番ポートを送信専用とする。これから送信するメールは全て587番ポートからメールを送信するようにした。Webメールも例外ではない。自サーバから送る全てのメールは587番ポートを使って送信することにする。そうしないと送信時にタグが付かないので、送信先でバウンスし、エラーメールの配信があっても受け取ることが出来ない(とおもう)。

準備

①必要なファイルをダウンロードして解凍しておこう。サーバ上で作業を行うのであれば以下を参考に。
http://babel.de/download/batv-proxy.pl.bz2

# cd /tmp
# wget http://babel.de/download/batv-proxy.pl.bz2
# bunzip2 batv-proxy.pl.bz2
# chmod +x batv-proxy.pl

②サーバで使用しているポートを確認しておこう

これから設定する「batv-proxy.pl」を利用する上でディフォルトで4つのポート(10025~10028)を利用する。現在のサーバにて以下のポートが利用されていないかを確認しておこう。「netstat」コマンドを使って確認します。

# netstat -ap | grep 1002

もし利用されているポートがあるなら、起動時に異常終了しエラーになってしまいます。自環境では「amavis」を用いてウイルスフィルタを噛ましているのだが、それに10025を利用していたので10025~10028の設定を全て10026~10029で行いました。もし同じように10025~10028のポートに関して利用している場合、「baty-proxy.pl」のなかの記述の変更が必要。加えてこれから行なうPostfxiの設定変更時にも注意が必要なので、そのへん宜しく。

/var/log/messagesに記録されたエラー

Apr 22 12:11:14 trippyboy batv-proxy-in[34448]: Error during bind(): Address already in use

設定1:「batv-proxy.pl」を編集する

ダウンロードしてきたファイルはそのままでは使えません。

①47行目あたりから「@keys」に入る鍵「secret*」を変更します(このままでも問題なく利用できます)

 47 my @keys =
 48  (
 49  'secret0',
 50  'secret1',
 51  'secret2',
 52  'secret3',
 53  'secret4',
 54  'secret5',
 55  'secret6',
 56  'secret7',
 57  'secret8',
 58  'secret9'
 59  );

上記「secret*」を「tomato*」に変更したい場合は、以下のコマンドで一括変更できます。

# sed -i 's/secret([0-9])/tomato1/g' batv-proxy.pl
#
# head -n 59 batv-proxy.pl|tail ←確認
 'tomato1',
 'tomato2',
 'tomato3',
 'tomato4',
 'tomato5',
 'tomato6',
 'tomato7',
 'tomato8',
 'tomato9'
 );
# 

②自サーバで利用しているドメインを指定します。

 63 use constant ADDRESSES =>
 64  '@example.com$',
 65  '@example.net$',
 66  '@example.org$';

もし利用しているドメインが「trippyboy.com」だったら以下のようになります。

 63 use constant ADDRESSES =>
 64  '@trippyboy.com$';

Perlの記述で、最後に「;」を忘れないようにしましょう。「,」を使って次の行に続くときは「;」は必要ありません。

③外部サーバから接続し、送信のみに使っているメールアドレスが有る場合は指定します。

ここで指定されたメールアドレスは、メール送信時に送信元メールアドレスに「タグ」が付与されなくなります。なぜかというと「送信のみ」に使っていますので、「タグ」を付与し、そのメールがバウンスし自サーバではないほかのサーバに配信されたとき、そのメールアドレスに含まれた「タグ」を認識できずにエラーになってしまうからです。

 79 use constant OUR_EXCEPTIONS =>
 80  '^external-shop@example.com$';

特に指定がない場合はこのままでも言いですし(どうせ使わないので)、もしくは「’**’;」の中身をけして「”;」だけにしてあげてください。

 79 use constant OUR_EXCEPTIONS =>
 80  '';

④「batv-proxy.pl」を適切な場所に移動する。

現在は/tmp/配下にあると思うので、これを適切な場所に移動しておきましょう。ぶっちゃけ何処でもいいんですが、私の場合/root/bin/配下に置くようにしておきます。

# mkdir /root/bin/ ←/root/binを利用する + /root/bin/がない場合
# mv /tmp/batv-proxy.pl /root/bin/

設定2:「/etc/rc.d/rc.local」を編集する

①「batv-proxy.pl」がサーバの起動時に自動で起動するように設定を記述しておきます。

以下のコマンドは「batv-proxy.pl」が「/root/bin/」に有る場合です。

# echo "/root/bin/batv-proxy.pl -i -n &" >> /etc/rc.d/rc.local
# echo "/root/bin/batv-proxy.pl -o -n &" >> /etc/rc.d/rc.local

なお、上記「-i」はンバウンド、「-o」はウトバウンド、「-n」は拒否しないという設定です。
設定が完了し動作に問題がないときにはこの「-n」を削除しておきましょう。

変更が正しく行なわれたかも一応見ておきましょう。

# cat /etc/rc.d/rc.local

設定3:「/etc/postfix/master.cf」を編集する

さてさて、いよいよメインの/etc/postfix/master.cfの編集です。
編集をする前に必ずバックアップを取っておきましょう

準備段階で、利用しているポート番号がかぶっている場合、以下内容の「10025~10028」を適時自身で決めたポート番号に変更してください。このポート番号は「batv-proxy.pl」に設定したものと同じである必要があります。

以下「-o」から始まる行は行頭からではなく必ず半角スペースで行頭との隙間を開けてください。

①「smtp            inet n - n - - smtpd」の記述を探し、その下に以下を追記
 -o smtpd_proxy_filter=127.0.0.1:10025
 -o receive_override_options=no_unknown_recipient_checks
②「submission      inet n - n - - smtpd」の記述を探し、その下に以下を追記
 -o smtpd_proxy_filter=127.0.0.1:10027
 -o receive_override_options=no_unknown_recipient_checks
③「cleanup         unix n - n - 0 cleanup」の記述を探し、その下に以下を追記
 -o canonical_classes=envelope_recipient,header_recipient
 -o canonical_maps=regexp:/etc/postfix/batv.regexp

④以下の記述を一番下にそのままコピペします。

127.0.0.1:10026 inet n - n - - smtpd
 -o smtpd_authorized_xforward_hosts=127.0.0.1
 -o smtpd_client_restrictions=
 -o smtpd_helo_restrictions=
 -o smtpd_sender_restrictions=
 -o smtpd_recipient_restrictions=permit_mynetworks,reject
 -o smtpd_data_restrictions=
 -o mynetworks=127.0.0.1
127.0.0.1:10028 inet n - n - - smtpd
 -o smtpd_authorized_xforward_hosts=127.0.0.1
 -o smtpd_client_restrictions= 
 -o smtpd_helo_restrictions=
 -o smtpd_sender_restrictions=
 -o smtpd_recipient_restrictions=permit_mynetworks,reject
 -o smtpd_data_restrictions=
 -o mynetworks=127.0.0.1

④「/etc/postfix/batv.regexp」を作成します。

# echo '/^prvs=[0-9]{4}[0-9A-Fa-f]{6}=(.*)$/ $1' >> /etc/postfix/batv.regexp

ここではまだPostfixの再起動はしないように

起動

①まずはメインとなる「batv-proxy.pl」を起動しておきます。

# /root/bin/batv-proxy.pl -i -n &
# /root/bin/batv-proxy.pl -o -n &

②Postfixを再起動します。

# service postfix restart

以上で設定が完了です。今後は/etc/rc.d/rc.localを編集したのでサーバ起動時に自動で起動してくれます。
もし、①で起動したプロセスを停止し起動オプションを変えたい場合には、プロセス一覧からPIDを特定しkill -9してあげてください。

 

さて、「どうやって正しく動いているか確認したらいいんだ?」って事ですよね。
以下に私がやってみたことを書いておきます。

1. 587番ポートを使ってメールを送信し、送信先に届いたメールのヘッダの内「Return-Path」の記述が書き換わっていることを確認。
2. 他サーバAから自サーバのメールアドレスを詐称したメールを他サーバBに送信し、他サーバBからのバウンスメールが自サーバに配信されるが、宛先不明でエラーになることを確認(batv-proxy.plのオプション「-n」を削除したあと)。
3. 587番ポートを使ってメールを「でたらめ@他サーバA」に送り、バウンスメール配信時の自サーバのメールログにて「orig_to=<prvs=***」を確認。

 

不明点あればコメント or コンタクトme。

 

このエントリーをはてなブックマークに追加

コメント大歓迎!質問も受け付けておりますヽ(*´∀`)ノ