2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

Postfixのセキュリティパラメータ(2013年04月改訂版)!

はっきり言って、私の経験から”不正中継の試み”をやらかす奴らが非常に多い!!!(爆爆)
それも、他のサーバを踏み台にしてHelloパケットとかを送る”ふとどき者!”が・・・・!(爆)
多分、自前サーバを構築して運用してる方々は経験済みかと思う。ところでPostfixは、結構簡単な設定が売りのMTAである。したがって、簡単な設定だけでもかなり堅い壁が作れる。しかし、さらにシビアにセキュリティ設定を行うと奥が深い。あえて、ここではPostfixのセキュリティパラメータ!と命名した。不正中継に関してはPostfixの設定ファイルmain.cfのmynetworksとrelay_domainsで設定できちゃう。 [Postfixの導入!]ですでにPostfixの導入設定は完結している。なにげに、Postfixはさらに細かいセキュリティ設定が出来るように考慮されている。ここでは、セキュリティ設定を中心にmain.cfでのSPAM受信拒否とか怪しいメールの拒否等に関する設定について説明する。


1.HELO(EHLO)ホスト制限(Hello拒否設定)

● 指定の仕方
smtpd_helo_restrictions = [パラメータ],[パラメータ] ・・・・

● 例
smtpd_client_restrictions = check_client_access hash:/etc/postfix/bad_clients,

                     permit_mynetworks,
                   reject_rhsbl_client rhsbl.ahbl.org,
                   reject_rbl_client spamcop.net,
                   reject_rbl_client dynablock.wirehub.net,
                   reject_rbl_client opm.blitzed.org,
                   reject_rbl_client sbl.spamhaus.org,
                   permit

ハローパケットの受信について、自ネットワークは優先的に許可、bad_clientsファイルに登録されているホスト拒否、ORBL及びSPAMホスト拒否、その他は許可。

2.ホストの接続に関しての拒否(SPAM拒否設定)

● 指定の仕方
smtpd_client_restrictions = [パラメータ],[パラメータ] ・・・・

● 例(あまり設定できるオプションなし)
smtpd_client_restrictions = permit_mynetworks,
                  check_client_access hash:/etc/postfix/bad_sender,
                  reject_maps_rbl,
                  reject_invalid_hostname,
                  permit
ホストの接続に関して、自ネットワークは優先的に許可、ORBL登録のホスト拒否、無効なホスト名のホスト拒否、その他は接続許可。

3.メール中継の制限(オプションパラメータでの制限をする場合に使う)

● 指定の仕方
smtpd_recipient_restrictions = [パラメータ],[パラメータ]  ・・・・

● 例
smtpd_recipient_restrictions = permit_mynetworks,
                    regexp:/etc/postfix/recipient_checks.reg,
                    check_client_access hash:/etc/postfix/bad_sender,
                    reject_maps_rbl,
                    check_relay_domains
メール中継元に関して、任意のヘッダー情報を持つホストを拒否、自ネットワークは優先的に許可、ORBL登録のホスト拒否、$mydestination, $inet_interfaces, $virtual_maps, $relay_domains それぞれのパラメータ値にリストされたアドレス宛かチェックし許可。

4.MAIL FROMでシステムの受信制限をする

● 指定の仕方
smtpd_sender_restrictions = [パラメータ],[パラメータ] ・・・・

● 例
smtpd_sender_restrictions = reject_non_fqdn_sender,
                   reject_invalid_hostname,
                   reject_unknown_sender_domain,
MailFromでの受信制限に関して、送信元のローカルパートがFQDN出なければ拒否、無効なホスト名のホスト拒否、ローカルパートのドメイン名がDNSに登録してなければ拒否。

5.パラメータ詳細

1) パラメータの種類

パラメータ意 味
※1 regexp:正規表現ファイル指定。特定のアドレス宛のメールを拒否及び任意のヘッダ情報を持つメールを拒否。
permit_mynetworksローカルネット上のmynetworksで指定するIP Addressのホストを許可する。
permitパラメータの最後に記述することにより、”それ以外は中継を許可する”ということになる。
reject_unauth_destination$mydestination, $inet_interfaces, $virtual_maps, $relay_domains それぞれのパラメータ値にリストされたアドレス宛かチェックし、それ以外は拒否する。smtpd_recipient_restrictionsに設定するパラメータ。
permit_mx_backupDNSの問い合わせに対してのMXレコードのエントリーにあるドメイン宛のメッセージを許可する。
check_relay_domains
permit_auth_destination
$mydestination, $inet_interfaces, $virtual_maps, $relay_domains それぞれのパラメータ値にリストされたアドレス宛かチェックし許可する。smtpd_recipient_restrictionsに設定するパラメータ。
rejectパラメータの最後に記述することにより、”それ以外は中継を拒否する”と言うことになる
reject_invalid_hostname無効(怪しい)なホスト名の場合拒否する。
reject_maps_rbl$maps_rbl_domains(不正中継ブラックリスト)に登録されているクライアントからのメッセージを拒否する。
reject_non_fqdn_hostname正しいFQDNでない HELOホスト名を拒否する。
reject_non_fqdn_recipient受信者アドレスが FQDNでないホストを拒否する。
reject_non_fqdn_sender送信者アドレスがFQDNでないホストを拒否する。
reject_unauth_popeliningパイプを使用するプログラムから送信されたメールを拒否する。
reject_unknown_clientクライアントのホスト名が不明な場合拒否する(IPから逆引きが出来ないホストの拒否)。
注:これは出来れば設定しない方が良い。サーバの中では逆引きを設定してないサーバが多いからである。
reject_unknown_hostnameDNSのAレコードや MXレコードのエントリーにないホストを拒否する。
reject_unknown_recipient_domain受信者のメールアドレスが DNS の Aレコードや MXレコードを持たないホストを拒否する 。
reject_unknown_sender_domain送信者のメールアドレスが DNS の Aレコードや MXレコードを持たないホストを拒否する(実在しないドメイン)。
※2 check_client_accessアクセス制御ファイル指定。接続してくるホストのアクセス制御設定が出来る。 (IPAddress、ドメイン、ホスト名、メールアドレス)
※2 check_helo_accessアクセス制御ファイル指定。HELOパケットの送信元のアクセス制御設定が出来る。 (IPAddress、ドメイン、ホスト名、メールアドレス)
※2 check_recipient_accessアクセス制御ファイル指定。RCPT TOの中継元のアクセス制御設定が出来る。 (IPAddress、ドメイン、ホスト名、メールアドレス)
※2 check_sender_accessアクセス制御ファイル指定。MailFromの送信元のアクセス制御設定が出来る。 (IPAddress、ドメイン、ホスト名、メールアドレス

 2) 使い方

● ※2 のアクセス制御ファイルの設定例

check_client_access hash:/etc/postfix/clients

といった形式で、データベースのタイプとデータベース名を指定する。データベースのレコードフォーマットは、

address action

で、address フィールドにはホスト名、IP Address、ドメイン名、IPネットワークの何れかを指定できる。actionフィールドは、指定された address に対するアクションを指定。

REJECT → 拒否
4xx text → textをメッセージとした一時的なエラー
5xx text 
→ textをメッセージとした永続的なエラー

テキスト形式でデータベースのテーブルファイルを上記の形式で作成したら、postmapコマンドでバイナリーのデータベースファイルを作成。

# postmap /etc/postfix/clients

でdbをこさえて、Postfixに可読に反映させる。尚、postmapでdb作成を行うのはhashが付いた場合のみである。

注:以下のように指定すると、データベースに登録されたホストやドメインはすべて拒否することになるので注意。

smtpd_recipient_restrictions = check_client_access hash:/etc/postfix/clients, reject

3) 受信メールの拒否

Postfixでは、リレーに関する細かい設定が行えるが、これをホスト及びHELO及びMAIL FROM に対しても設定することができる。

① 接続してくるホストを制限

 ● パラメータ設定例

 smtpd_client_restrictions = check_client_access hash:/etc/postfix/bad_clients,
                     permit_mynetwork,
                   reject_rhsbl_client rhsbl.ahbl.org,
                   reject_rbl_client spamcop.net,
                   reject_rbl_client dynablock.wirehub.net,
                   reject_rbl_client opm.blitzed.org,
                   reject_rbl_client sbl.spamhaus.org,
                   permit

② HELO(EHLO)ホスト制限(Hello拒否設定)

 ● パラメータ設定例 

 smtpd_helo_restrictions = reject_unknown_hostname, permit_mynetworks
 smtpd_helo_restrictions = check_helo_access hash:/etc/postfix/bad_helo

③ MAIL FROMコマンドのやり取りでメールを制限

 ● パラメータ設定例 

smtpd_sender_restrictions = reject_unknown_sender_domain, permit_mynetworks
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/bad_sender

6) ヘッダーでブロック

メッセージフィルタを利用してメールを拒否することもできる。Postfix の header_checksパラメータを利用すると、メッセージヘッダーをスキャンし、特定の文字を含むメッセージの配送をブロックすることができる(パラメータオプションは※1 で説明)

● 確認パラメータ設定例

header_checks = regexp:/etc/postfix/bad_header

のように設定(正規表現テーブルを使用する場合)し以下の要領でファイルを作成する。

pattern action

pattern はヘッダーフィールドでマッチングされる正規表現を記述する。action はパターンにマッチした時のアクションを指定する。アクションには、

REJECT   →   メッセージを拒否
OK       
→   メッセージを許可
IGNORE   
→   メッセージからヘッダー行を破棄

すべてのヘッダー行に対して指定した条件で実行される。テーブルの例は以下のようになる。大文字小文字は関係なし。

# The contents of “bad_header”(bad_headerの内容)

# It refuses by a partner’s subject. (サブジェクトの文字で受信拒否する)
/^Subject:.*!!!/                     REJECT 
← Subject: に”!!!” が有る場合はドロップ
/^Subject:.*( \$\$\$|\$\$\$ )/          REJECT 
← Subject: に “$$$” が有る場合はドロップ(\とかが入ってるのは日本語が混在している場合の対策)
/^Subject: more money$/              REJECT
/^Subject:.*I Love You/               REJECT
/^Subject:.*Re: Sample/              REJECT
/^Subject:.*dear valued customers/       REJECT
/^Subject:.*norton will/              REJECT
/^Subject:.*married/                 REJECT
/^Subject:.*lose we/                REJECT
/^Subject:.*Here is that sample/        REJECT
/^subject:.*ID MSG?/                REJECT

スパムが、Subjectでブロックされると以下のようなログが出現する。
reject: header Subject: ID MSG:75474 I am Julia, 27 y.o. Russia (dating) from unknown[78.175.207.242]; from=<5fmorrispeter.morris@marconi.com> to=<xxxx@xxxxxx.com> proto=ESMTP helo=<[78.175.207.242]>: 5.7.1 message content rejected
Oct 5 21:42:48 hiro postfix/smtpd[17292]: disconnect from unknown[78.175.207.242]

# It refuses in a FROM address.(FROMアドレスで受信拒否する)
/^From:.*<#.*@.*>/                 REJECT  ← fromが何も無いときは拒否する
/^From:.*email.it/                   REJECT
/^From:.*lycos.co.kr/                REJECT
/^From:.*.co.kr/                   REJECT
/^From: .your friend$/                REJECT

# It refuses with the mailer which the partner is using.(相手のMUAで受信拒否する)
/^X-Mailer: *Achi-Kochi Mail/i          REJECT 
← 相手のメーラにバルクメーラが使われている場合にドロップ(iは大文字と小文字を区別する)
/^X-Mailer:.*DM Mailer/              REJECT
/^X-Mailer:.*Achi-Kochi Mail/          REJECT
/^X-Mailer:.*PostMaster General/        REJECT
/^X-Mailer:.*Direct Email/             REJECT
/^X-Mailer:.*Oshirase Mailer/           REJECT
/^X-Mailer:.*IMail/                  REJECT
/^X-Mailer:.*Cara Mail/               REJECT
/^X-Mailer:.*Achi-Kochi Mail/i          REJECT

# It refuses with a return path.(リターンパスで受信拒否する)
/^Reply-To:.*<#.*@.*>/               REJECT  ← reply toが何も無いときは拒否する
/^Reply-To:.*@lycos.co.kr/            REJECT
/^Reply-To:.*@gte.net/               REJECT
/^Reply-To:.*yahoo.co.kr/             REJECT
/^Reply-To:.*@email.it/               REJECT

# It refuses with To.(抹消したはずの自ドメインアカウント宛にspamが来るので拒否する)
/^To:.*meiwaku@akunin.com/           REJECT

7) メールの本文でブロック

body_checks=regexp:/etc/postfix/body_checks

The contents of “body_checks”(body_checksの内容)
# It refuses in the mail text.(メールの本文で受信拒否する)
/^(|[^>].*)remove.exec/              REJECT
/^(|[^>].*)shichifuku.net/             REJECT
/^(|[^>].*)tobutobu.host/              REJECT
/^(|[^>].*)freewebtools/              REJECT
/^(|[^>].*)kyoukono.go.ro/             REJECT
/^(|[^>].*)www.porno/                REJECT
/^(|[^>].*)netian.com/               REJECT
/^(|[^>].*)DMaster /                 REJECT
/^(|[^>].*)DMaster/                 REJECT

# It refuses by the attached file of mail.(添付ファイルで受信拒否する)
/name=.*\.scr/                    REJECT
/name=.*\.pif/                    REJECT
/name=.*\.com/                   REJECT
/name=.*\.dll/                    REJECT
/name=.*\.reg/                    REJECT
/name=.*\.vbs/                    REJECT
/name=.*\.shs/                    REJECT

8) IPアドレスでブロック

smtpd_recipient_restrictions=check_client_access hash:/etc/postfix/reject_ip

The contents of “reject_ip”(reject_ipの内容)# The contents of “reject_ip”

xxx.xxx.xxx.xxx                   REJECT
xxx.xxx.xxx                       REJECT 
← xxx.xxx.xxx.0のネットワークアドレス全て対象

9) あり得ない形式のメールアドレスをブロック
ユーザ名@ホスト.ドメインと言ったFQDNではないメールアドレスをブロック。

smtpd_recipient_restrictions=regexp:/etc/postfix/recipient_checks.reg

The contents of “recipient_checks.reg”(recipient_checks.reg内容)
# Contents described by the mail answered.
/[@!%].*[@!%]/ 550 Please use user@domain address forms only. ← 返信されるエラーメールに表示される

10) From 送信者のメールをブロック

smtpd_recipient_restrictions=check_client_access hash:/etc/postfix/reject_sender

The contents of “reject_sender”(reject_senderの内容)
# The contents of “reject_sender”
bitcat.net                        REJECT
usa.net                          REJECT
hongkong.com                     REJECT
china.com                        REJECT
asult-newsletter.com                REJECT
yahoo.co.kr                       REJECT
amipara.com                      REJECT
lycos.co.kr                       REJECT
wanadoo.nl                       REJECT
.or.kr                           REJECT
.go.kr                           REJECT
.ac.kr                           REJECT
.sh.cn                           REJECT
.edu.cn                          REJECT
.com.cn                         REJECT
.org.cn                          REJECT

11) あり得ないドメインからの受信をブロック

smtpd_sender_restrictions=reject_unknown_senmder_domain

12) From:がFQDNの書式に反した形式をブロック

smtpd_sender_restrictions=reject_non_fqdn_sender

13) Webサイトのブラックリストデータでブロック(2004年11月現在でサーバが動いているサイト)
注:ブラックリストサイトは雄志で運営しているため、いきなりサーバが停止してたり、サービスを止めてしまっている場合が多い。したがってping等でサーバが稼働してるかあらかじめ確かめること。(サーバが停止してるのにもかかわらず設定してると、ログに沢山エラーを吐くので注意すること。)この指定方法は、すでに無効になった。代わりに、reject_rbl_clientで直接スパムDBサイトを直接指定する形となった。

maps_rbl_domains = relays.ordb.org,
             dynablock.wirehub.net,
             opm.blitzed.org,
             relays.visi.com,
             spamcop.net

reject_rhsbl_client rhsbl.ahbl.org,
reject_rbl_client spamcop.net,
reject_rbl_client dynablock.wirehub.net,
reject_rbl_client opm.blitzed.org,
reject_rbl_client relays.visi.com,
reject_rbl_client sbl.spamhaus.or
reject_rbl_client dynablock.wirehub.net,
reject_rbl_client opm.blitzed.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client cn-kr.blackholes.us,
reject_rbl_client brazil.blackholes.us,
reject_rbl_client russia.blackholes.us

実際に上記のORBLサイトのブラックリストが効いたlogを見てみるとこんな感じである。さらに、その下はOPEN PROXYになってる無防備なサーバを踏み台にして不正中継を試みようとしている馬鹿野郎である。まあ、以下のようなlogは頻繁に有る。もう、イヤになるほどである。だから、ORBLサイトには大変にお世話になっている。

Dec 11 07:45:32 sub postfix/smtpd[14440]: NOQUEUE: reject: RCPT from unknown[222.101.164.186]: 554 Service unavailable; Client host [222.101.164.186] blocked using sbl.spamhaus.org; http://www.spamhaus.org/SBL/sbl.lasso?query=SBL19164; from=<h7e4fe4576weg4@yahoo.com> to=<talent311@daum.net> proto=SMTP helo=<none> Dec 11 09:36:56 sub postfix/smtpd[14620]: NOQUEUE: reject: RCPT from unknown[222.101.164.67]: 554 Service unavailable; Client host [222.101.164.67] blocked using sbl.spamhaus.org; http://www.spamhaus.org/SBL/sbl.lasso?query=SBL19164;
from=<56ehe45e456@yahoo.com> to=<talent311@daum.net> proto=SMTP helo=<none>Dec 11 18:44:38 sub postfix/smtpd[15407]: NOQUEUE: reject: RCPT from YahooBB219175100065.bbtec.net[219.175.100.65]: 554 Service unavailable; Client host [219.175.100.65] blocked using opm.blitzed.org; Open proxy – see http://opm.blitzed.org/219.175.100.65; from=<Flanagan5Prater@cursoscucalegal.com.br> to=<xxxx@xxxxxx.com> proto=SMTP helo=<yahoobb219175100065.bbtec.net> Dec 11 19:31:13 sub postfix/smtpd[15451]: NOQUEUE: reject: RCPT from unknown[222.101.164.67]: 554 Service unavailable; Client host [222.101.164.67] blocked using sbl.spamhaus.org; http://www.spamhaus.org/SBL/sbl.lasso?query=SBL19164;
from=<56ehe45e456@yahoo.com> to=<talent311@daum.net> proto=SMTP helo=<none>Oct 9 09:24:58 hiro postfix/smtpd[24769]: connect from unknown[125.71.240.134]
Oct 9 09:25:05 hiro postfix/smtpd[24769]: NOQUEUE: reject: RCPT from unknown[125.71.240.134]: 554 5.7.1 Service unavailable; Client host [125.71.240.134] blocked using cn-kr.blackholes.us; Listed by cn-kr.blackholes.us; from=<gczlwiic@vip.citiz.net> to=<xxxx@xxxxxx.com> proto=ESMTP helo=<134.240.71.125.broad.cd.sc.dynamic.163data.com.cn>

6. 番外編 (procmailを利用して”未承諾広告”をブロックする)

自分の場合、”未承諾広告”のSubjectのSPAMが多いため対策を考えていたが、同じ自鯖仲間の かっちゃん がprocmailでSPAMブロックを行って居ることを教えてもらい、彼のサイトを参考にSPAM対策を行ってみた。
従って、以降にその方法を説明する。

まず俺の場合、AmaViSでメールフィルタをかけているのでPostfixでprocmailとAmaViSの両方を使いたい。したがって、 [AMaViSを使ってウィルスフィルタをかける!]で の4項方法でAmaViSをセットアップしてからprocmailをセットアップした。

procmailは、ソースでもバイナリでも良いので勝手にインストールして欲しい。あえてここではセットアップ方法は紹介しない。/etc/postfixのmain.cfに追加する。

# vi main.cf

省略
mailbox_command = /usr/bin/procmail -m /etc/postfix/procmailrc
省略

次に、/etc/postfixにprocmailrcファイルを作る。

ここで気を付けなければいけないのが、デフォルトメールボックスである。通常、以下の記述で行くと/var/spool/mailディレクトリ配下のユーザのメールボックス宛の設定となる。
しかし、/var/mail配下にユーザのメールボックスを作りたい場合もある。その場合は、procmailrcの先頭に以下のような記述が必要である。

DEFAULT=/var/mail/$LOGNAME
or
DEFAULT=/var/mail/$USER     ← procmailのバージョンにより、環境変数がどちらの記述か解らないので注意すること(新しいバージョンは$LOGNAMEを使ってるようだ)

# vi procmailrc

:0
* ^Subject: \/.*
* ? echo “$MATCH” | nkf -Zme | grep ‘!.*広告.*!’
/dev/null

:0
* ^Subject: \/.*
* ? echo “$MATCH” | nkf -Zme | grep ‘DM@.*広告.*@’
/dev/null

:0
* ^Subject: \/.*
* ? echo “$MATCH” | nkf -Zme | grep ‘未承諾広告※’
/dev/null

:0
* ^Subject: \/.*
* ? echo “$MATCH” | nkf -Zme | grep ‘未承諾広告’
/dev/null

 :0
 * ^[Ff]rom:.*yahoo.co.kr
/dev/null

このような記述を書き込み保存する。これは、未承諾広告の文字列があった場合、捨てる設定である。
次に、Postfixを再起動する。これで完了!

# postfix reload

コラム:Postfixでは、メールのFROM行のアドレスでSPAMブロックする方法は、2通り有る。
1) main.cfのパラメータ、smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/bad_sender で拒否する方法
bad_senderファイルの内訳:

yahoo.co.kr      REJECT
akunin.com      REJECT

2) Procmailのprocmail.rcで拒否する方法(正確に言うと無視する)
procmail.rcファイルの内訳:

省略
:0
 * ^[Ff]rom:.*yahoo.co.kr
/dev/null

 :0
 * ^[Ff]rom:.*akunin.com
/dev/null


7.main.cfのサンプル(筆者のです)

Postfixセキュリティコンフィグレーション例(私独自の設定です。注意すること!あくまでもオリジナルです!責任は持ちません)
緑の部分が今回のセキュリティ設定部分。ブルーの部分もコメントしているので、参考にすると便利です(以下の設定は、セキュリティ的にはかなり固いはずです)。しかし、あまり固くしすぎて必要なメールが送受信でき無くならないように注意すること!

① 複数の値やパラメータを入れるときは、「,」もしくは「スペース」で区切る。
② 複数行に値やパラメータが続く場合は、「スペース」を入れる。

# サンプル① 2006年度版(main.cf) SMTP認証にPOP before SMTPを使用
# Postfixのオーナーのユーザ名定義
mail_owner = postfix# Postfixのオーナーのグループ定義
setgid_group = maildrop# Postfixのセカンドオーナー定義
default_privs = nobody# このサーバの名前(FQDNホスト名を定義)
myhostname = sub2.kozupon.com# このネットワークのドメイン名(インターネットドメイン名を定義)
mydomain = kozupon.com# 全てのメールの送信ドメイン(ドメイン名無しでメールを送信したとき、fromに付くドメイン名を定義、デフォルトは myorigin = $myhostnameだが、メール鯖が複数台ある時は myorigin = $mydomain の方がよい)
myorigin = $mydomain
#myorigin = $myhostname# 監視するインターフェースの指定、つまり、どのネットワークインターフェースアドレスからメールを受けるかを設定する
inet_interfaces = all# メッセージのアドレスとして認めるホストの定義(配送されるべき、ドメイン名及びホスト名を定義、メールゲートウェイなどの場合を考慮して $mydomain を追加しておくべきかと思う)
mydestination = $myhostname, localhost.$mydomain $mydomain# メール中継の制限(中継を許可するIPアドレスもしくはネットワークアドレス、つまり信頼されたネットワークアドレス)。IPアドレスでリレー拒否設定する場合は、ここに追加する。基本的に信頼されたネットワークアドレスを設定する
mynetworks_style = subnet              
← 本来デフォルトでこの設定になっている。(通常メールサーバとして使用する場合は、この設定にする、これを class の設定にするとオープンリレーになるので注意が必要)mynetworks = 127.0.0.0/8               ← このホストだけを宣言(外部からメール配送を行わない場合は、localhostのみの設定にしておいた方がセキュリティ的にベスト)# DNSでバックアップメール鯖等に設定されている鯖でサブドメインにメール中継をうける場合に設定する。ホスト名及びIPアドレスでなく、ドメイン名で中継を許可したい場合にも記述すると良いだろう
# 自分の場合は、外部リレーはドメインで許可している。上記のmynetworks設定の中にIPアドレスを定義してもかまわない
relay_domains = $mydestination, onechan-kawaii.com# EXPN/VRFY コマンドを拒否する(telnetによるアカウント漏洩防止)
disable_vrfy_command = yes# SMTPで接続したときにPostfix Versionを非表示にする、以下の設定ならバージョンは表示されない
smtpd_banner = $myhostname ESMTP $mail_name# smtpd_helo_required パラメータは、SMTP セッションのはじめに HELO (または EHLO) コマンドを要求するかどうかをクライアントに対して決定する。デフォルトでは「no」に設定されており、HELOコマンドの使用を要求しない。HELOコマンドを要求するようにしておくことでブロックできるスパムが有るので「yes」に設定しておいた方がよい。smtpd_helo_required = yes# メールアドレスを間違えて送信したとき、「User unknown」というエラーメールが返って来ることがあるが、Postfixのデフォルトの設定では、自分のドメインに存在しないユーザー宛てにメールが送られてきてもエラーメッセージが返されない。存在しないユーザー宛てのメールがきたとき、一定時間をおいて再送するようになっている。これは、Postfixの設定を誤ったときでも、自分のドメイン宛てに送られてきたメールが拒否されないようにするための安全策になっている。したがって、設定に問題がないことを確認できたら、存在しないユーザー宛てのメールは拒否して、その場でエラーメッセージを返すように設定を変更した方がよい。main.cfの中にあるデフォルトの「unknown_local_recipient_reject_code = 450」→「550」に変更する。「450」というエラーコードはtry again later(一定時間後に再試行)を意味する。一方の「550」はreject mail(メール拒否)を表している。unknown_local_recipient_reject_code = 550# ヘッダチェック(怪しいヘッダ付きメールを拒否する設定)
# 指定するファイルに拒否設定を記述。
header_checks = regexp:/etc/postfix/header_checks# メール本文でチェック(怪しい文字列を拒否する)
# It blocks in the text of mail
body_checks=regexp :/etc/postfix/body_checks# 明示したドメインをFROM行に持たないメールは拒否する
smtpd_sender_restriction = reject_non_fqdn_sender,
                  reject_invalid_hostname,
                  reject_unknown_sender_domain,
                  permit
# 送信元ホストの制限(SPAMメール拒否設定)
# ここでは、ORBSで登録されているホストやSPAM DBに登録されているホストからのメールを拒否する。
smtpd_client_restrictions = permit_mynetworks,
                 reject_rhsbl_client rhsbl.ahbl.org,
                 reject_rbl_client spamcop.net,
                 reject_rbl_client dynablock.wirehub.net,
                 reject_rbl_client opm.blitzed.org,
                 reject_rbl_client relays.visi.com,
                 reject_rbl_client sbl.spamhaus.org,
                 permit
# ★メール中継の制限(オプションパラメータでの制限をする場合に使う)
# It is transmitting agency and refuses.
smtpd_recipient_restrictions = permit_mynetworks,
                    regexp:/etc/postfix/recipient_checks.reg,
                    check_client_access hash:/etc/postfix/bad_sender,
                    check_client_access hash:/etc/postfix/pop-before-smtp,   
← pop-before-smtpをしているので、ここにデータベース宣言している。
                    reject_non_fqdn_recipient,
                    reject_unknown_sender_domain,
                    reject_unauth_destination(注:smtpd_recipient_restrictionは最後にrejectもしくは、reject_unauth_destinationの何れかで終結しなければいけない。)# 中継禁止の有無
# 注:この2行を”no”にすると何でもかんでも中継禁止にしてしまう!気を付けること。
allow_percent_hack = yes    ← これは、user%domainをuser@domainに書き換えるか否かの設定
swap_bangpath = yes       
← これは、site!userをuser@siteに書き換えるか否かの設定# エイリアスファイルの在処の指定
alias_maps = hash:/etc/postfix/aliases# エイリアスデータベースの在処の指定
alias_database = hash:/etc/postfix/aliases# ユーザメールボックスの在処の指定
mail_spool_directory = /var/spool/mail# デバッグレベルの指定
debug_peer_level = 2# デバッガコマンドパスの指定
debugger_command =
PATH=/usr/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5# Postfixメールキューコマンドのパス
mailq_path = /usr/libexec/postfix# Postfixメールキューパス
queue_directory = /var/spool/postfix# Postfixコマンドディレクトリのパス
command_directory = /usr/sbin# デーモンディレクトリのパス
daemon_directory = /usr/libexec/postfix# Postfixオンラインマニュアルのパス
manpage_directory = /usr/local/man# Postfix設定サンプルファイルのパス
sample_directory = /etc/postfix# READMEディレクトリの有無
readme_directory = no# AntiVirus独自の設定
mailbox_command = /usr/sbin/amavis “$SENDER” “$RECIPIENT”# 外部コマンドへのメール配送の制限(メーリングリスト等を立ち上げている場合は必要!)たとえば、fmlで/etc/aliasesにinclude形式で記述するが、そう言う場合にここでincludeを指定する
allow_mail_to_commands = alias,forward,include# mailbox受信メッセージMax容量(0に設定した場合は、無制限)
mailbox_size_limit = 102400000# 1メッセージ当たりのMax容量(Postfixキューファイルサイズの最大サイズ)、Default値は10M 10240000 が設定される。mailbox_size_limitパラメータより小さくなくてはならない
message_size_limit = 51200000# メール添付ファイルをmessage_size_limitとは別に定義する場合のMax容量、Default値は、50k 51200
body_checks_size_limit = 204800000# ユーザ名だけでメールを送信したときに、ドメイン名を付加するか否かを設定する、Default値はyes、基本的にPostfixはドメイン名が無いメールはサポートしないのでここを変える必要は無いだろう。
append_at_myorigin = yes

サンプル② 2013年度版(main.cf)SMTP認証にCyrusSASL2を使用している。

queue_directory = /var/spool/postfixcommand_directory = /usr/sbindaemon_directory = /usr/lib/postfixmail_owner = postfixsetgid_group = postdropdefault_privs = nobodymyhostname = hiro.kozupon.combounce_queue_lifetime = 1hmaximal_queue_lifetime = 1hmydomain = kozupon.commyorigin = $mydomaininet_interfaces = allmydestination = $myhostname, localhost.$mydomain $mydomainunknown_local_recipient_reject_code = 550mynetworks_style = submetmynetworks = 127.0.0.0/8relay_domains = $mydestinationalias_maps = hash:/etc/aliasesalias_database = hash:/etc/aliasesheader_checks = regexp:/etc/postfix/header_checkssmtpd_client_restrictions = permit_mynetworks,
reject_rbl_client all.rbl.jp,
reject_rbl_client bl.spamcop.net,
reject_rbl_client blackholes.five-ten-sg.com,
reject_rbl_client dnsbl.sorbs.net,
reject_rbl_client t1.dnsbl.net.au,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client list.dsbl.org,
permitsmtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yessmtpd_recipient_restrictions = permit_mynetworks,
regexp:/etc/postfix/recipient_checks.reg,
check_sender_access hash:/etc/postfix/bad_clients,
reject_non_fqdn_recipient,
permit_auth_destination,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:60000smtpd_sender_restrictions = reject_non_fqdn_sender,
reject_invalid_hostname,
reject_unknown_sender_domain,
permitmailbox_command = /usr/bin/procmail -m /etc/postfix/procmailrcmail_spool_directory = /var/spool/maildisable_vrfy_command = yessmtpd_helo_required = yesallow_percent_hack = yesswap_bangpath = yessmtpd_banner = $myhostname ESMTP $mail_namedebug_peer_level = 2debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/binxxgdb $daemon_directory/$process_name
$process_id & sleep 5sendmail_path = /usr/sbin/sendmailnewaliases_path = /usr/bin/newaliasesmailq_path = /usr/bin/mailqmanpage_directory = /usr/local/mansample_directory = /etc/postfixreadme_directory = noallow_mail_to_commands = alias,forward,includecontent_filter = smtp-amavis:[127.0.0.1]:10024mailbox_size_limit = 102400000message_size_limit = 51200000smtpd_error_sleep_time = 1s   ←このパラメータは、リモートホストからのSMTPエラーに応答するとき、見せかけの遅延を挿入するために使用する。smtpd_soft_error_limit = 10    ←このパラメータは、リモートMTAが混乱した場合、そのことを検知するように試みるために使用する。この値に設定された回数のSMTPエラーがリモートMTAによって生成されると、PostfixによってSMTPセッションに強制的な遅延が挿入される。smtpd_hard_error_limit = 20    ←このパラメータは、1つのSMTPセッション中にPostfixによって、許容されるSMTPエラー数の上限を指定する。この数値の限界を超えたときにPostfix SMTPサーバが切断される。
上からの3つの緑のパラメータは、SPAMメールのフラッディング攻撃(電子メールの連打によるオーバーフロー攻撃)を回避する設定として有効である。

8.postfixのバージョン確認方法

postfixのバージョン確認方法は以下の要領で行う。
# postconf | grep mail_version
mail_version = 2.2-20040504


9.時としてエラーと間違いやすい紛らわしいコネクションに関する統計情報
Postfixの2.2以降のバージョンで、メール送信後にメールログに出力される統計情報。以下のような統計情報が出力される。

Jan 5 16:37:06 hiro postfix/anvil[16679]: statistics: max connection rate 1/60s for (smtp:xxx.xxx.xxx.xxx) at Jan 5 16:35:42
Jan 5 16:37:06 hiro postfix/anvil[16679]: statistics: max connection count 1 for (smtp:xxx.xxx.xxx.xxx) at Jan 5 16:35:42
Jan 5 16:37:06 hiro postfix/anvil[16679]: statistics: max cache size 1 at Jan 5 16:35:42

これは、以下のようなパラメータをセッティングするための統計情報のようだ。
smtpd_client_connection_count_limit
(1つのSMTPクライアントの最大同接続数 デフォルト:50)
smtpd_client_connection_rate_limit(1つのSMTPクライアントの単位時間あたりの最大同接続数 デフォルト:制限なし)
smtpd_client_event_limit_exceptions(接続カウントや接続速度、SMTP要求速度の制限から除外されるクライアントの指定 デフォルト:$mynetwork)

anvil_rate_time_unit(クライアントの接続速度やその他の速度の計算に用いられる単位時間 デフォルト:60s)
このような、パラメータが有ったので、これで上記の統計情報で60sの数値が変化するか試しにmain.cfの中に
anvil_rate_time_unit = 120
みたいに追加してみた。その結果、

Jan 5 17:22:20 hiro postfix/anvil[16763]: statistics: max connection rate 1/120s for (smtp:xxx.xxx.xxx.xxx) at Jan 5 17:17:28
Jan 5 17:22:20 hiro postfix/anvil[16763]: statistics: max connection count 1 for (smtp:xxx.xxx.xxx.xxx) at Jan 5 17:17:28
Jan 5 17:22:20 hiro postfix/anvil[16763]: statistics: max cache size 1 at Jan 5 17:17:28

うんやっぱ変わったね(笑)。


10.ローカルにヘッダーを偽造してメールを仕掛ける輩の防御
メール鯖にコネクトして、「webmaster」とかなにげに有りそうなアカウント宛へSPAMメールを送ってくる輩の対処。こう言った類は必ず、送信元を偽造する。以下に、そんな場合のmailログを示す。

ターゲットメールサーバ:ns.xxxxxxxx.net
宛先のアカウント:webmaster
SPAM送信者のIPアドレス:210.xxx.xxx.xxx

Jan 25 10:59:46 ns postfix/smtpd[17871]: connect from unknown[210.xxx.xxx.xxx]  ←SPAM送信者のホストアドレス、必ずと言っていいほど逆引きが出来ないホスト(動的IPの場合も有る)。
Jan 25 11:02:44 ns postfix/smtpd[17871]: 2ECCE5BB10: client=unknown[210.xxx.xxx.xxx]
Jan 25 11:05:05 ns postfix/cleanup[17878]: 2ECCE5BB10: messageid=<20070125020137.2ECCE5BB10@ns.xxxxxxxx.net>
Jan 25 11:05:05 ns postfix/qmgr[17787]: 2ECCE5BB10: from=<webmaster@xxxxxxxx.net>, size=366, nrcpt=1 (queue active)
Jan 25 11:05:06 ns postfix/smtpd[17882]: connect from localhost[127.0.0.1]
Jan 25 11:05:06 ns postfix/smtpd[17882]: 1B6765BD59: client=localhost[127.0.0.1]
Jan 25 11:05:06 ns postfix/cleanup[17878]: 1B6765BD59: messageid=<20070125020137.2ECCE5BB10@ns.xxxxxxxx.net>
Jan 25 11:05:06 ns postfix/qmgr[17787]: 1B6765BD59: from=<webmaster@xxxxxxxx.net>,size=807, nrcpt=1 (queue active)
Jan 25 11:05:06 ns postfix/smtpd[17882]: disconnect from localhost[127.0.0.1]
Jan 25 11:05:06 ns amavis[15443]: (15443-09) Passed, <webmaster@xxxxxxxx.net> ->
<webmaster@xxxxxxxx.net>, Message-ID: <20070125020137.2ECCE5BB10@ns.xxxxxxxx.net>, Hits: – Jan 25 11:05:06 ns postfix/smtp[17879]: 2ECCE5BB10: to=<webmaster@xxxxxxxx.net>,
relay=127.0.0.1[127.0.0.1], delay=209, status=sent (250 2.6.0 Ok,id=15443-09, from MTA: 250 Ok: queued as 1B6765BD59)
Jan 25 11:05:06 ns postfix/qmgr[17787]: 2ECCE5BB10: removed
Jan 25 11:05:06 ns postfix/local[17883]: 1B6765BD59: to=<m@xxxxxxxx.net>,
orig_to=<webmaster@xxxxxxxx.net>, relay=local, delay=0, status=sent (delivered to command: /usr/bin/procmail -m /etc/postfix/procmailrc)
Jan 25 11:05:06 ns postfix/cleanup[17878]: A7C425BB10: messageid=<20070125020137.2ECCE5BB10@ns.xxxxxxxx.net>
Jan 25 11:05:06 ns postfix/qmgr[17787]: A7C425BB10: from=<webmaster@xxxxxxxx.net>, size=933, nrcpt=1 (queue active)
Jan 25 11:05:06 ns postfix/local[17883]: 1B6765BD59: to=<webmaster@xxxxxxxx.net>, relay=local, delay=0, status=sent (forwarded as A7C425BB10)
Jan 25 11:05:06 ns postfix/qmgr[17787]: 1B6765BD59: removed

このようなログのメールの場合は、宛先と差出人が同一のメールアドレスとして、いわばメールアドレスの偽造をして相手を目くらます。では、このような偽造メールはどのように実現されているかというと、以下のように telnet により簡単に実現されている。

[mity@linux_michan mity]$ telnet ns.xxxxxxxx.net 25
Trying 210.xxx.xxx.xxx…
Connected to ns.xxxxxxxx.net.
Escape character is ‘^]’.
220 ns.xxxxxxxx.net ESMTP Postfix
EHLO localhost
250-ns.xxxxxxxx.net
250-PIPELINING
250-SIZE 51200000
250-ETRN
250-AUTH CRAM-MD5
250-AUTH=CRAM-MD5
250 8BITMIME
MAIL FROM: <webmaster@xxxxxxxx.net>  ←①
250 Ok
RCPT TO: <webmaster@xxxxxxxx.net>    ←②
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: <webmaster@xxxxxxxx.net>       ←③
To: <webmaster@xxxxxxxx.net>
         ←④
Subject:

TEST Message.
.
250 Ok: queued as 2ECCE5BB10
QUIT
221 Bye
Connection closed by foreign host.

上記のように、ターゲットのメール鯖へ接続してコマンドを打って①~④を同じwebmaster@xxxxxxxx.netアカウントにして本文を入力する訳だ。ただし、③④は適当なメールアドレスに偽造可能(これは、よくSpammerがやる手口だ)。

それでは、このようなSPAM対策としてはPostfixのmain.cfでどのような設定をすればベストなのか?
SMTPのコネクトに関する制御は、 smtpd_client_restrictions で行う。したがって、このパラメータで設定する。

smtpd_client_restrictions = reject_unknown_client,
                 permit_mynetworks,
               reject_rhsbl_client rhsbl.ahbl.org,
               reject_rbl_client spamcop.net,
               reject_rbl_client dynablock.wirehub.net,
               reject_rbl_client opm.blitzed.org,
               reject_rbl_client sbl.spamhaus.org,
               permit

smtpd_client_restrictionsの記述例を書いてみた。まず、 reject_unknown_client を使うとDNSに問い合わせて正当性の有るホストのみが許可されるのでかなり怪しいホストに厳しくなのでSPAMMERをブロックする効果が非常に大きい。これは最近、はやり始めたS25Rの考え方である。厳しくなるのは良いが、単に逆引き出来ないホストは拒否されてしまう。果たして、それは正解なのだろうか?
俺の答えは、「NO」で有る。と言うのも、正引きだけ出来て逆引きできないホストは世の中に沢山あるし、ましてやDynamicDNSで鯖構築している方々の全てが拒否されてしまうことになる。IPアドレスのみでの評価には限界があるので、上記の設定のように SPAM常習鯖のブラックリスト等を設定しておく のがとりあえず推奨だ。さらに、SPAMのブロック効率をあげるには、 Postgrey との併用をお勧めする。


11.SPAM常習者ブラックリストデータベースサーバが落ちてるときの注意
SPAM常習者ブラックリストデータベースサーバが落ちているとき、そのホストをそのままmain.cfに残しておくと、SPAMでないメールもSPAMとして扱われてしまうので注意が必要だ。
これは、maillogをチェックしてる人には解るが、チェックしない人には気がつかないので何ともたちが悪いかも知れない。それが嫌ならば、SPAM常習者ブラックリストデータベースサーバを設定するのは止めた方がいいかも知れない。以下のような、エラーがmaillogに現れる。

Mar 14 19:26:04 ns postfix/smtpd[8396]: disconnect from unknown[xxx.xxx.xxx.xxx] Mar 14 19:41:21 ns postfix/smtpd[8410]: connect from sprm104c.xxxxxxx.co.jp[xxx.xxx.xxx.xxx] Mar 14 19:41:28 ns postfix/smtpd[8410]: NOQUEUE: reject: RCPT from sprm104c.xxxxxxx.co.jp[xxx.xxx.xxx.xxx]: 554 Service unavailable; Client host [sprm104c.xxxxxxx .co.jp] blocked using blackhole.securitysage.com; from < > to=< > proto=ESMTP helo= Mar 14 19:41:28 ns postfix/smtpd[8410]: disconnect from sprm104c.xxxxxxx.co.jp[xxx.xxx.xxx.xxx]

blackhole.securitysage.comがSPAM常習者ブラックリストデータベースサーバ(何らかの理由でダウンしてる)で 554エラー [このメールエラーなによ!?]で戻ってきた状態。

以上

コメント