server-memo.net

【postfix】送信元(From)によるメール拒否(smtpd_sender_restrictions )

   

postfixで送信元(From)でフィルタリングしてメールを拒否する方法です。

smtpd_sender_restrictions

postfixでメールの送信元(From)でメールを制限したい場合は、「/etc/postfix/main.cf」に「smtpd_sender_restrictions」を設定することでメールを制限することが出来るようになります。

「smtpd_sender_restrictions」で制限する場合には、制御するメールアドレスを記述したテーブルファイルを参照させたり、送信元のドメインが存在するかの確認や、送信元のアドレスがFQDN形式かどうかを確認するという方法があります。

  • テーブルファイル参照 check_sender_access テーブルの種類:/テーブルファイル
  • ドメインの有無を確認 reject_unknown_sender_domain
  • ドメイン形式の確認 reject_non_fqdn_sender

上記の項目を複数指定はする場合は「,」で区切り記述します。

check_sender_access

テーブルファイルを参照させる場合に良く使用されるのはテーブルの種類は、テーブルファイルをhash化したDBを参照する方法(hash:/~)と、正規表現で記述されたテーブルファイルを参照する方法(regexp:/~)があります。

  • hashを使用する場合 check_sender_access hash:/テーブルファイル
  • 正規表現を使用する場合 check_sender_access regexp:/テーブルファイル

※hashを使用する場合は、ルールファイルを作成後「postmap」コマンドでテーブルファイルをhash化させる必要があります。

reject_unknown_sender_domain

送信元ドメインが存在しているかを確認しドメインが存在しない(DNSのMX、Aレコードに存在しない)場合拒否します。

reject_non_fqdn_sender

送信元のアドレス形式を確認し、送信元のアドレスがFQDN形式でない場合拒否します。

テーブルファイルにhashを使用する場合

「/etc/postfix/main.cf」に「smtpd_sender_restrictions」項目を追加していきます。

# cp -p /etc/postfix/main.cf /etc/postfix/main.cf_yyyymmdd
# vi /etc/postfix/main.cf

main.cf設定

「/etc/postfixmain.cf」の最後に以下の内容を追記します。

今回は「reject_unknown_sender_domain」と「reject_non_fqdn_sender」も一緒に設定していきますが、必要ない場合は設定しなくてもかまいません。

smtpd_sender_restrictions = 
  check_sender_access hash:/etc/postfix/reject_sender,
  reject_unknown_sender_domain,
  reject_non_fqdn_sender

テーブルファイルについて

「check_sender_acces」で参照するテーブルファイルは、最初から用意されている「/etc/postfix/access」を使用しても良いですが、今回は「smtpd_sender_restrictions」以外の方法でメールの制限を行う場合も考慮して、新規に「/etc/postfix/reject_sender」というテーブルファイルを新しく作成してそこにルールを記述していきます。(ファイル名に決まりは無いので適宜分かりやすい名前で作成してくだい)

テーブルファイルを作成

拒絶するメールを記載したテーブルファイルを作成します。

# vi /etc/postfix/reject_sender

制限するメールのルールは下記の書式で記述することになります。

拒否するドメイン or メールアドレス 拒否方法

拒否ドメイン or メールアドレスの指定方法

拒否するメールの「From」の指定は、ドメイン全体や個別のメールアドレスで指定することが出来ます。

  • example.jp 「example.jp」ドメインからのメールを全てを指定
  • xxx@example.com 特定のメールアドレスを指定
拒否方法の指定

拒否方法は通常「REJECT」か「DISCARD」のどちらかを指定すればよいでしょう。

  • REJECT メール受信拒否メッセージが相手に帰る
  • DISCARD 相手には何も通知せずにメールを破棄

メール送信元にエラーメッセージを返したい場合は「REJECT」を指定して、エラーメッセージを返したくない場合は「DISCARD」を指定します。

「REJECT」「DISCARD」どちらを使うのが良いのか?

私個人の考えでは、スパム対策で使用する場合は「DISCARD」が良いと思います。

「REJECT」で拒否してしまうと送信元にエラーが通知されてしまい、わざわざメールアドレスが存在しているという情報をSPAMの送信元に知らせてしまうよりかは、何もせずにメールを破棄してしまう方が余計な情報をわたさずにすむので良いと思います。

ただし、ドメイン全体で拒否する場合は本当にそのドメインからは、スパム以外のメールが送信されてこないかの確認を十分い行ってください。

「DISCARD」でメールを破棄してしまうと、そのドメインから必要なメールが送られて来た場合、相手には何も通知されませんのでメール送信者は届いたつもりになっていも実際には届いていないという事が発生します。

設定例

下記の例では、「From」が「example.jp」ドメインからの場合はすべて(ドメイン全体を指定)「REJECT」し、「user@example.com」からのメール(個別のメールアドレスを指定)は「DISCARD」させるといった内容になります。

example.jp REJECT
user@example.com DISCARD

postmapによるhash化

テーブル形式に「hash」を指定した場合、そのままでは設定した作成したファイルの内容が「postfix」に読み込まれないので、「postmap」コマンドを使用して作成したファイルからhash化したDBファイルを作成します。

# postmap reject_sender

これで「reject_sender.db」というhash化されたファイルが作成されます。

※「check_sender_access hash:/etc/postfix/reject_sender」といったように、テーブルファイルとして「reject_sender」を指定していますが実際には今作成した「reject_sender.db」が参照されています。

内容の確認方法

作成されたファイルは「strings」コマンドを使用することで中身の確認をすることが出来ます。

# strings reject_sender.db
REJECT
example.jp
DISCARD
example.com

設定反映

テーブルファイルが完成しましたら「postfix」を再起動させて設定を反映させます。

CentOS7であれば「systemctl」コマンドで再起動させます。

# systemctl restart postfix

CentOS6まであれば下記の方法などで再起動させてください。

# /etc/init.d/postfix restart

あとは、実際にメールが拒否されるかどうかをログ等で確認してください。

regexp(正規表現)を使用

main.cf設定

「/etc/postfixmain.cf」の最後に以下の内容を追記します。

smtpd_sender_restrictions = 
  check_sender_access regexp:/etc/postfix/reject_sender,
  reject_unknown_sender_domain,
  reject_non_fqdn_sender

テーブルファイル作成

正規表現を使用して制限したいメールアドレスと拒否方法を記述します。

# vi /etc/postfix/reject_sender

設定例

下記のように正規表現を使用してドメイン全体を指定したり、個別のメールアドレスを指定することが出来ます。

/@example.com$/ REJECT
/^hogehoge@example.jp$/ REJECT
/^hoge0[1-3]@example.jp$/ REJECT 

※regexp(正規表現)を使用する場合は「postmap」コマンドを使用する必要はありません。

設定反映

テーブルファイルが完成しましたら「postfix」を再起動させて設定を反映させます。

CentOS7であれば「systemctl」コマンドで再起動させます。

# systemctl restart postfix

CentOS6まであれば下記の方法などで再起動させてください。

# /etc/init.d/postfix restart

メールを拒否した際のログ

実際にメールを「REJECT」と「DISCARD」で拒否した場合のログとなります。(メールアドレスやホストの情報は伏せています)

REJECTの場合

Nov 30 13:53:16 mc postfix/smtpd[1817]: NOQUEUE: reject: RCPT from xxx.xxx.xxx[xxx.xxx.xxx.xxx]: 554 5.7.1 : Sender address rejected: Access denied; from= to= proto=ESMTP helo=

DISCARDの場合

Nov 30 06:16:54 mc postfix/smtpd[23855]: NOQUEUE: discard: RCPT from xxx.xxx.xxx[xxx.xxx.xxx.xxx]: : Sender address triggers DISCARD action; from= to= proto=ESMTP helo=

 - postfix