スパムフィルタの適用実績を調べる

Postfix の main.cf で

smtpd_client_restrictions =
    reject_rbl_client bl.spamcop.net,
    # 中略…
    permit

のように複数のブラックリストデータベース(MAPS RBL)を設定していて、実際どれが使われているのか判断したい場合、以下のようにして実際に何件のメールについてブロックが適用されたか調べられます。
 

$ cat /var/log/maillog | perl -ne ‘if(/blocked using (.+?);/){print $1.”\n”;}’ | sort | uniq -c

結果例:

$ cat /var/log/maillog | perl -ne ‘if(/blocked using (.+?);/){print $1.”\n”;}’ | sort | uniq -c
  45 bl.spamcop.net
   4 list.dsbl.org
   7 sbl-xbl.spamhaus.org

[Linux] メール自動受信処理のための procmail 入門

はじめに

procmail とはメール受信時の振り分け、フィルタリングなどを行うためのメール処理プログラムです。
Procmailが使える環境なら、レシピを書くだけでメール受信時に好きなプログラムで自動処理することができます。

たとえば、こんなことに使えます。

− メールが届いた時に、お礼メールを自動応答をする
– メールが届いた時に、自動で他の誰かに転送する
– スパムメールを自動で捨てる
– メモを書いたメールを送ったら、内容をデータベースに保存してくれるシステム
– 添付画像つきメールを送ったら、添付画像を自分のサイトで公開するシステム
– 問い合わせメールを管理画面で見えて、そのままメール返信ができるシステム
– などなど。

とにかく、

「メールを特定のメールアドレスに送ったら○○が✕✕する」

という処理のきっかけ(開始地点)として、procmailが使えます。

使ってみる

Procmailを使うには、メールサーバに Procmail が入っていることが前提です。

メールサーバ構築方法についてこの記事では省略します。
たとえばメールサーバとしてPostfixを使う場合は、以下の記事を参考にしてください。

この記事ではProcmailインストール方法はCentOS(RedHat Linux)、Postfixを使った場合の説明をします。
利用方法はOSによらず共通です。

procmailをインストールする

which procmail

とたたいて、 /usr/local/bin/procmail のように、パスがかえってくればOKです。

パスが何も結果がかえってこなければ、

sudo yum install -y procmail

と実行してインストールします。

インストールしたら、Postfixの設定ファイル main.cf の、mailbox_command設定を探して、以下のように追記します。
mailbox_commandが見つからなければ、main.cfのどこに入れてもOKです。

/etc/postfix/main.cf:

#mailbox_commandが並んでる最後の行に・・・
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
#mailbox_command = /usr/local/mybin/procmail_wrap
#↓これを追記する!
mailbox_command = /usr/bin/procmail

/usr/bin/procmail は、自分の環境で

witch procmail

として出てきたパスを入力してください。

procmailを使う準備

procmail のルールを書くためには、まずメール受信ユーザのホームディレクトリに
以下の内容をもつ .forward ファイルを作成します(両端のダブルクォーテーションも必要)。

"|IFS=' '&&exec procmailのフルパス -f-||exit 75 #ログインユーザ名"

例:
/home/john/.forward を追加する場合…

"|IFS=' ' && exec /usr/local/bin/procmail -f-||exit 75 #john"

最初と最後のダブルクオーテーションが無いと正しく動かず、超ハマるので注意してください。

procmailのルールを書く

次に同様に .procmailrc ファイルを作成します。

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/.procmail.lock
<h1>--- 例1:未承諾広告を捨てる</h1>
:0 H
* ^Subject:.<em>iso-2022-jp
* ^Subject:.</em>\/.*
* ? echo "$MATCH" | nkf -me | egrep '※未承諾広告'
/dev/null
<h1>--- 例2:エイリアスによる script@example.org 宛のメールの内容(ヘッダ含む)を /usr/local/bin/dosomething.sh に渡して実行する</h1>
:0
* ^To:.*script@example.org
| /usr/local/bin/dosomething.sh

例1はメールフィルタリングの例です。
例2はメールをトリガとして任意のプログラムを実行する例です。この例では、/usr/local/bin/dosomething.shにメールの内容を標準入力で渡して、実行しています。
このように好きなプログラムにメールヘッダ・本文を渡して実行することで、自動応答メール等様々な用途で利用できます。

補足

~/.forward がない場合は、main.cf の mailbox_command 変数で指定されたコマンド, mailbox_cmmand も指定されていない場合は通常のメール配送を行います。

また、procmail を実行した時に ~/.procmailrc がない場合も(procmail が)単純にメール配送を行います。

仮想ドメイン・仮想ユーザを使っているPostfixでProcmailを使う方法

仮想ドメインのメールボックスでは .forward ファイルおよび main.cf での mailbox_command は参照されないため、 procmail 等コマンド実行は適用されません。
このため、仮想ドメインのメールアドレスで procmail を扱うためには virtual_alias_maps で、procmailを使いたいメールアドレスのみ、ローカルのリアルユーザにエイリアス(紐付け)する必要があります。

例: foo@example.org 宛のメールをリアルユーザ mailuser で受け取る場合…

/etc/postfix/main.cf:

#...略...
#@localhost のみリアルユーザとする(仮想ドメインを含めないこと)
mydestination = localhost
#...略...
#仮想メールアカウントのエイリアス
virtual_alias_maps = hash:/etc/postfix/viatual
#仮想メールアカウントのメールボックス
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps

/etc/postfix/virtual:

foo@example.com   mailuser@localhost

/etc/postfix/virtual_mailbox_maps:

#(エイリアスしたものは含めません)
#example.com
info@example.com         example.com/info
postmaster@example.com   example.com/postmaster
root@example.com         example.com/postmaster
#example.net
info@example.net         example.net/info
postmaster@example.net   example.net/postmaster
root@example.net         example.net/postmaster

設定ファイルの書き換えが終わったら、設定を反映するため以下のコマンドを実行します。

su - # root ユーザで行う
cd /etc/postfix
postmap hash:virtual_mailbox_maps
postmap hash:virtual
postfix reload

あとは前述のとおり mailuser のホームディレクトリ(例: /home/mailuser/ )に .forward, .procmailrc を作成すれば、
foo@example.com に対して procmail のルールが書けるようになります。

参考:
Advanced Email Forwarding
Manpage of PROCMAILRC(JM Project による和訳)
Postfix 設定パラメータ
.procmailrc の書き方
Virtual環境での.forward が有効になりません(postfix-jp: 425)
Postfix 設定パラメータ

Postfix での Port 25 Blocking 対策

Outbound Port 25 Blocking により、外部にSMTP が通せない環境でメールサーバを運用する場合、次のいずれかの対応方法をとる必要があります。
1.プロバイダのメールサーバに転送する
2. サブミッションポート(Submission Port)が使える外部のメールサーバに転送する
 
1 の場合で認証が不要な場合は、main.cf に以下を加えることで簡単に対応することができます。
main.cf:

relayhost = smtp.nifty.com

smtp.nifty.com は自分のプロバイダの SMTP サーバに置き換えてください。
 
1 で認証が必要な場合、あるいは、2 の場合は普通認証を必要としますが、この場合は Cyrus SASL 対応の Postfix を使うことで、認証付きのリレーが可能になります。
main.cf:

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
relayhost = [smtp.nifty.com]:587
smtp_use_tls = yes # optional

relayhost は自分が使う SMTP サーバ、ポート番号に置き換えてください(587 はサブミッションポートを使う場合)
 
次に、smtp_sasl_password_maps で指定したファイルを作成します。
saslpass:

# 書式:”relayhostに指定した値”<space>”認証ユーザ名”:”認証パスワード”
[smtp.nifty.com]:587 user:pass

作成後、postmap で saslpass.db を生成します。

$ cd /etc/postfix/
$ postmap saslpass

 
このままでも動作しますが、ここでセキュリティを考慮するのであれば、元としたプレインテキストのパスワードファイル saslpass は削除しておくべきでしょう。

$ rm saslpass

 
あとは Postfix を再起動し、好きなメーラを使って動作確認を行えば完了です。ここでは CUI の mail コマンドの例を示します。

$ mail -s test foo@example.com
hello, world
.

(foo@exmple.com は自分が確認できる任意のメールアドレス)
 
参考:
Re: プロパイダのsmtpホストが smtp authを要求してる場合(Postfix-jp ML:1685)
  ぷらら環境での Postfix 設定。
25番ポートブロック対策について(Fedoraで自宅サーバー構築BBS)
  @nifty 環境での Postfix 設定。
Postfix で、Gmail にメールをリレーする(私の二次記憶)
  Postfix + Gmail
postconf(5)(Postfix 日本語マニュアル)

Postfix でバーチャルドメインを利用した例

/etc/postfix/main.cf
# 略.. プログラムの指定
myhostname = foo.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = all
# 実ユーザに配送したくないため mydestination にはあえて何も指定しない
mydestination=
# LAN も信頼しない
mynetworks_style = host
#
# 略.. プログラムのパス指定やグループ指定, オプションのディレクトリ指定など
#
virtual_alias_maps = hash:/etc/postfix/v_alias_maps
# virtual_alias_maps で指定するディレクトリパスのルートディレクトリ。
virtual_mailbox_base=/var/vmaildir
# このサーバで処理する(virtual_alias_maps で解決する)ドメインの一覧
virtual_mailbox_domains = example.org, example.net, example.com
# どのユーザをどの UID で処理するかの対応づけ。static なら全てに適用。
virtual_uid_maps = static:5000
# どのユーザをどの GID で処理するかの対応づけ。
virtual_gid_maps = static:5000
#

/etc/postfix/v_alias_maps
# 最後に postmap hash:v_alias_maps として更新すること
# 空白区切りで メールアドレス ディレクトリ を指定する
# 指定したディレクトリを Maildir として扱う
# email dir
root@example.com exmaple.com/postmaster/
john@eaxmple.com example.com/john/
 
root@example.org example.org/postmaster/
# ユーザ名前を省略すると、そのドメインについてユーザが存在しない場合にマッチする
@example.org example.org/allusers/
 
@example.net example.net/postmaster/

Postfix をローカル配送専用に設定する

SMTP サーバ、 POP3 サーバとして XMail(1.20) を使っている時に、sendmail の仕様が妙だったため、sendmail プログラムは Postfix を使っていました。その時の、Postfix の設定方法概略です。

main.cf:
# (略)
# 取得ドメインを example.org, サーバのホスト名を foo とする場合の設定
myhostname = foo.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = localhost
# 決して Postfix でメール配送を完結させないような、存在しないドメイン名を指定する(こんなみっともない事せず空っぽでいいのかも…)
# mydestination =
mydestination = no.domain.for.localmailer.localhost
mynetworks_style = host
# (以下略)

master.cf:
# inet はコメントアウト。unix はコメントアウトしない。
# smtp inet n – n – – smtpd
smtp unix – – n – – smtp

Postfix + Cyrus SASL で Outlook でも SMTP Auth

– broken なメールクライアントであるところの Outlook で SMTP Auth を使うには、 postfix の main.cf で次の記述が必要。

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain

ただし LOGIN しか使えないので POP before SMTP のほうがまだマシ。
http://uniunix.net/contents/postfix.html
– Linux Lovers -Fedora Coreで始めるサーバ構築-: Postfix の設定