SendMailでの以前の記事、
では、SPFの設定について簡単に解説しました。今回は、そのPostfix編 (CentOS/ScientificLinux) になります。
→ postfix で postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を使ってSPF認証する(Debian/Ubuntu編) を参照してください。
Postfixでは、SPF認証するための方法は Postfix + postfix-policyd-spf の組み合わせが最も有名みたいです。
postfix-policyd-spf には、
- perl版 : postfix-policyd-spf-perl
– 簡単ですが、細かい設定はできません。
- python版 : postfix-policyd-spf-python
– perl版と異なり、設定ファイルがあり、細かい設定を行うことができます。
の2つがあります。
今回は、postfix-policyd-spf-python を使ってSPFを使えるようにしたいと思います。
( postfix-policyd-spf-perlとの違いは、詳細設定ができるか否かの違いでしかありません。追記でpostfix-policyd-spf-perlについても記載しておきます。)
Sender Policy Framework(センダー・ポリシー・フレームワーク)の略で、電子メールにおける送信ドメイン認証のひとつです。 差出人のメールアドレスが他のドメインになりすましていないかどうかを検出することができると言われています。 SPF もしくは SPF認証 とも呼ばれています。
出典 : Wikipedia
- 目次
- 履歴
2013.2.5 初版
送信側の SPF 設定を行う
SPFの設定には、
- メールの受信時に送信元サーバーが正しいかを判定するための機能
ここでは、Postfix + postfix-policyd-spf-python を使ってチェックするように設定してみます。
- メールを送信時に正しい送信元サーバー情報を提供する機能
送信時の正しい送信元サーバー情報は、ドメイン毎のDNS情報に設定します。
とに大きく大別されます。
まずは、後者の送信時の正しい送信元サーバー情報の設定をDNSに行います。
設定すべき内容は、DNSのレコードの書き方で記述すると以下のような感じになります。
レンタルーサーバーやドメインレジストラのDNSを利用している場合は、それぞれ設定画面が異なります。
基本は、変わらないのですが、もしわからないようなら、ヘルプ画面やサポートに確認しましょう。
設定例
|
上記は、メールに関する事項のみを記載しています。(本当は、それ以外にもウェブサイト名などの設定もありますがここでは省略しています)
設定している内容を簡単に解説しておきます。
- 1行目 : ドメインのメール受信先(MX)ホスト設定
- 2行目 : ドメインのSPF設定
ここでの設定内容は、以下のような意味になります。
v=spf1spf の宣言を指定しています。
mxこのドメインのメールアドレスは、ここでmxレコードに指定しているホストから送信される・・という宣言です。
~all先の指定内容(ここでは、mx)は、ほぼ全部・・・という意味になります。
-allこのように指定すると、完全全部・・・という意味になりますから、もし、mxレコードに指定しているホスト以外からメールを送信した場合、SPF認証結果Failと認識されスパムメールと判断、破棄されることが考えられます。
まだ、SPFは完全に対応しているわけではないので、一般的には、~all を指定しておくことが無難とされています。
- 3行目 : STMP(Sendmail)サーバーのIPアドレス設定
SPFのチェック結果とその意味
SPFのチェック結果は、以下のようになります。
None | SPFレコードが公開されていない |
---|---|
Neutral | SPFレコードが“?”として公開されている条件にマッチした |
Pass | 認証処理に成功した |
Fail | SPFレコードが公開されているが、認証に失敗した |
SoftFail | SPFレコードが“~”として公開されている条件にマッチした |
TempError | 一時的な障害で認証処理が失敗した |
PermError | SPFレコードの記述に誤りがあるなどで認証処理に失敗した |
赤字は、REJECT(破棄)すべき、あるいは、REJECT(破棄)を選択される場合もありうる。
オレンジは、管理者が判断すべきで、一般的には、受信はする。
青字は、正常と判断、受信する。
Postfix で postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を使ってSPF認証する
SPF認証をするためにのpostfix-policyd-spf-python ( or postfix-policyd-spf-perl ) をインストールし、Postfix でメール受信時に認証作業を行うために
情報を渡すように設定する必要があります。
まずは、postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) をインストールから、SPF認証するまでの手順を以降に記述します。
postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) をインストールする
- postfix-policyd-spf-python の場合
- python DNSをインストールします。
$ cd /usr/local/src [src]$ wget http://pypi.python.org/packages/source/p/pydns/pydns-2.3.6.tar.gz ... [src]$ tar xfz pydns-2.3.6.tar.gz [src]$ cd pydns-2.3.6 [pydns-2.3.6]$ python setup.py install ...
- python pyspfをインストールします。
$ cd /usr/local/src [src]$ wget http://pypi.python.org/packages/source/p/pyspf/pyspf-2.0.7.tar.gz ... [src]$ tar xfz pyspf-2.0.7.tar.gz [src]$ cd pyspf-2.0.7 [pyspf-2.0.7]$ python setup.py install ...
- python pypolicyd-spfをインストールします。
$ cd /usr/local/src [src]$ wget https://launchpad.net/pypolicyd-spf/1.1/1.1/+download/pypolicyd-spf-1.1.tar.gz ... [src]$ tar xfz pypolicyd-spf-1.1.tar.gz [src]$ cd pypolicyd-spf-1.1 [pypolicyd-spf-1.1]$ python setup.py install ...
- python pypolicyd-spfのコメントあるの設定ファイルをコピーします。
$ mv /etc/python-policyd-spf/policyd-spf.conf /etc/python-policyd-spf/policyd-spf.conf.org $ cp /usr/local/src/pypolicyd-spf-1.1/policyd-spf.conf.commented /etc/python-policyd-spf/policyd-spf.conf
- python DNSをインストールします。
- postfix-policyd-spf-perl の場合
- perl-Sys-Hostname-Longをインストールします。
$ yum info perl-Sys-Hostname-Long ... Is this ok [y/N]: y ...
- perl-Mail-SPFをインストールします。
$ yum install perl-Mail-SPF ... Is this ok [y/N]: y ...
- perl policyd-spfをインストールします。
$ cd /usr/local/src [src]$ wget https://launchpad.net/postfix-policyd-spf-perl/trunk/release2.010/+download/postfix-policyd-spf-perl-2.010.tar.gz ... [src]$ tar xfz postfix-policyd-spf-perl-2.010.tar.gz [src]$ cd postfix-policyd-spf-perl-2.010 [postfix-policyd-spf-perl-2.010]$ cp postfix-policyd-spf-perl /usr/local/lib/.
- perl-Sys-Hostname-Longをインストールします。
postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を利用するように main.cf,master.cf を編集する
postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を Postfixで利用するためには、master.cf , main.cf をそれぞれ編集する必要があります。
master.cf を編集する。
/etc/postfix/master.cf の設定を行います。
- 設定例
- postfix-policyd-spf-python の場合
$ vi /etc/postfix/master.cf ... # for SPF policy-spf unix - n n - 0 spawn user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/python-policyd-spf/policyd-spf.conf
- postfix-policyd-spf-perl の場合
$ vi /etc/postfix/master.cf ... # for SPF policy-spf unix - n n - 0 spawn user=nobody argv=/usr/bin/perl /usr/local/lib/postfix-policyd-spf-perl
以降に master.cf の設定方法、設定内容について簡単に以下の解説しておきます。
- postfix-policyd-spf-python の場合
- 設定方法
Postfixの master.cf は、以下のように各項目を半角空白刻みで設定します。
service type private unpriv chroot wakeup maxproc command + args (yes) (yes) (yes) (never) (100)
ここで注意すべき点は、次行へ続ける場合は、前行末に空白を入れず、次行の先頭には必ず空白を入れる点です。 以下に例を示しておきます。
1 2
policy-spf unix - n n - 0 spawn user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf
- 1行目 : spawnの後には空白は入れません。
- 2行目 : userの前に必ず空白を入れます。
- 各パラメータの意味
設定方法で解説したように、先の設定例では、以下のような項目がそれぞれ設定されています。
service policy-spf type unix private – unpriv n chroot n wakeup – maxproc 0 command + args spawn user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf
以下は、各項目の解説(マニュアルからの抜粋)です。
サービス種類(service,type)以下のサービス種類の内一つを指定します:
inetサービスはTCP/IPソケットで listen し、ネットワーク越し に アクセスすることができます。
サービス名は host:port のように指定され、これは新しい接続 を受け入れるホストとポートを示します。ホスト部分 (とコ ロ ン) は省略できます。ホストやポートはシンボル形式 (ホスト またはサービス名) でも数値形式 (IPアドレスやポート 番 号) で 与えられます。ホスト情報は “[]” の中に括ることもできま すが、この形式は必須ではありません。
例: 127.0.0.1:smtp または ::1:smtp という名前のサービスは ルー プバックインターフェースからのメールのみを受け取りま す; そして 10025 という名前のサービスは inet_interfaces パラメータで設定されたすべてのインターフェースのTCPポート10025で接続を受けます。
注意: Postfixバージョン2.2以降では master.cf や main.cf でループバック IPアドレス情報をハードコーディングするので はなく、main.cf で “inet_interfaces = loopback-only” を指 定してください。unixUNIX ドメインソケットで listen するサービスで、ローカルク ライアントのみがアクセスできます。
サービス名はPostfixキューディレクトリからの相対パス名(main.cf の queue_directory 設定パラメータで制御されるパス名) です。
Solarisシステムでは unix タイプはストリームソケットで実装されています。fifoFIFO (名前付きパイプ) で listen するサービスで、ローカルクライアントのみがアクセスできます。
サービス名はPostfixキューディレクトリからの相 対パス名(main.cf の queue_directory 設定パラメータで制御されるパス名) です。Private (デフォルト: y)メールシステムへのアクセスを制限するかどうか。インターネット (タイプ inet サービスは private にできません。Unprivileged (デフォルト: y)サー ビスがroot権限で走るかPostfixシステムの所有者として走るか (所有者名は main.cf ファイルの mail_owner 設定変数で制御されます)。
local(8) および pipe(8)、spawn(8)、virtual(8) デーモンは特権を必要とします。Chroot (デフォルト: y)サービスをメールキューディレクトリ (パス名は main.cf ファイル の queue_directory 設定変数で制御されます) にchrootして走らせるかど うか。
chrootは local(8) や pipe(8)、spawn(8)、 virtual(8) デーモンで使 う べきではありません。 proxymap(8) サーバはchrootして走らせることはできますが、そうするとこのサービスを使うそもそもの目的のほとんどが無意味になってしまいます。
Postfixソースコードアーカイブの examples/chroot-setup サブディレクトリのファイルには、マシンの種類ごとにPostfixのchroot 環境 をセットアップする方法が記述されています。 また BASIC_CONFIGURA-TION_README ではデーモンをchrootして走らせることの問題についての議論があります。
Wake up time (デフォルト: 0)指定された秒数が経過したら、指定されたサービスが自動的に起動されます。 起動はサービスに接続して起動要求を送ることで実装しています。 起動時間フィールドの最後に ? を付けると、起動イベントは実際に使われているサービスのみに送られるようになります。 0を指定すると、自動的には起動しません。
pickup(8) および qmgr(8)、flush(8) デーモンは起動タイマーを必要とします。Process limit (デフォルト: $default_process_limit)このサービスを同時に実行できるプロセスの最大数。0を指定すると プロセス数制限がなくなります。
注 意: Postfixサービスの中にはシングルプロセスサービスとして設定しなければいけないものがあり (例えば qmgr(8))、 またプロセス数 を無制限に し な け れ ば な ら な いサービスもあります (例えば cleanup(8))。これらの制限は変更してはいけません。Command name + arguments実行されるコマンド。”>” や “|” のようなシェルにとって特別な文字はここでは特別な意味を持たず、 また空白を含む引数を保護するのに引用符を使うことはできません。
コマンド名はPostfixデーモンディレクトリからの相対パスです (パ ス名は daemon_directory 設定変数によって制御されます)。
特定のコマンドに対するコマンド引数の文法はそれぞれのデーモンのマニュアルページに明記されています。
以下のコマンドラインオプションはすべてのデーモンプログラムに対して同じ効果があります:
-Dmain.cf 設定ファイルの debugger_command 変数で指定されたコマンドの制御下でデーモンを動かします。
ヒント やtips はDEBUG_README を参照してください。
-o name=value指定された main.cf 設定パラメータを上書きします。
パラメータの値は main.cf の中と同様に、$name などとして他の パラメータを参照することができます。 文法は postconf(5) を参照してください。
注意1: “=” の前後に空白を置いてはいけません。 パラメータ値では、 空 白を完全に避けるか、空白の代わりにカンマを使うか、 main.cf で設定された $override_parameter を使って “-o name=$override_parameter” のように上書きすることを考えてください。
注意2: パラメータの上書きを使いすぎると、Postfixの設定 を理解したり管理するのが難しくなってしまいます。 ある時点で、 master.cfで複数の個性を設定するよりも、複数のPostfixインスタンスを設定する方が簡単になるでしょう。
-v冗長ログレベルを増加させます。
-v オプションを複数設定すると、 Postfixデーモンプロセスは冗長性を増します。
main.cf を編集する。
次に、/etc/postfix/main.cf の設定を行います。
|
デフォルトで1000秒後に先のmaster.cf でspf用に設定したserviceの子プロセスを kill します。その値を、ここで設定することができます。ここでは、3600s (秒) = 60 (分) = 1 (時間) となります。
- permit_mynetworks : mynetworks で設定されたホストからのメールは全て許可します。
- check_policy_service : “policy-spf” という service でチェックした結果で判断します。
postfix を再起動する
全ての設定を終えたら、postfix を再起動します。
|
Yahoo!などのフリーメールからメールを送信してSPF認証を確認してみる
Yahoo!などのフリーメールからメールを送信してみましょう。
受信したメールのヘッダ情報に以下のような情報が追加されていればSPF認証が実施されています。
|
postfix-policyd-spf-python に関しても、ほとんどこのままでもOKですが、細かい設定ができますので、以降に簡単に解説します。
postfix-policyd-spf-python をカスタマイズする
postfix-policyd-spf-python の設定には、
/etc/python-policyd-spf/policyd-spf.conf の編集を行います。
デフォルトでは、以下のような設定になっています。
|
- SPF_Not_Pass (default) – Pass/None/Tempfail の場合、拒否(Reject)しない。
- Softfail – Softfail / Fail の場合、拒否(Reject)する。
- Fail – HELO Fail の場合、拒否(Reject)する。
- Null – HELO Fail for Null sender (SPF Classic) の場合のみ、拒否(Reject)する。
- False – ヘッダへ情報を付加するだけ。何もしない。
- No_Check – HELO チェックそのものを行わない。
- helo_passed_spf – HELOのチェック結果がPassのときに与えられた制限を適用します。
- SPF_Not_Pass (default) – Pass/None/Tempfail の場合、拒否(Reject)しない。
- Softfail – Softfail / Fail の場合、拒否(Reject)する。
- Fail – Fail の場合、拒否(Reject)する。
- False – ヘッダへ情報を付加するだけ。何もしない。
- No_Check – メールの発信者情報 チェックそのものを行わない。
- Fail – 通常のSPFレコードの処理をする。(デフォルト)
- True – ドメインのDNSレコードに “v=spf1 -all” が設定してある場合のみ、拒否(reject)する。
- mfrom_passed_spf – メールの発信者情報 のチェック結果がPassのときに与えられた制限を適用します。
Recevier policy option to reject mail from certain domains when SPF is not Pass/None even if their SPF record does not produce a Fail result.
This Option does not change the effect of PermError_reject or TempError_Defer
(Google翻訳)
これらのドメインの Netural/Softfail 結果を得るために、メールを拒否します。
それらのSPFレコードが失敗の結果を生成していない場合でも、 SPFは/ Noneを渡すされませんときに、特定のドメインからのメールを拒否するRecevierポリシーオプション。
このオプションはPermError_rejectまたはTempError_Deferの効果を変更することはありません
ドメイン名は、カンマで区切って記述します。
例)
Reject_Not_Pass_Domains =aol.com,hotmail.com
- Fail – 無効
- True – 有効
- Fail – 無効
- True – 有効
指定したIPアドレスから送信されたメールを通過させるかどうか確認する。
例)
Prospective = 192.168.0.4
必要に応じて、内部ネットワーク用のSPFをスキップするためにアドレスを追加します。 デフォルトは標準的なIPv4とIPv6のlocalhostアドレスになります。
例)
skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0//104,::1//128
SPFのチェックが不要な絶対的に安全なIPアドレス(or ネットワークアドレス)を設定します。
以下のようにIPアドレス(192.168.1.12)を限定して設定することもできますし、ネットワーク(192.168.0.0/31)を指定することもできます。
例)
Whitelist = 192.168.0.0/31,192.168.1.12
List of domains whose sending IPs (defined by passing their SPF check should be whitelisted from SPF.
例)
Domain_Whitelist = pobox.com,trustedforwarder.org
Domain_Whitelist_PTR: List of domains to whitelist against SPF checks base on PTR match.
例)
Domain_Whitelist_PTR = yahoo.com
RFC 4408に準拠した Received-SPF (SPF) の形式
RFC 5451に準拠した Authentication Results (AR) の形式
のいずれかを設定できます。両方を設定することはできません。
例)
Header_Type = AR
(デフォルトは、SPF です。)
これは、構文の完全修飾ドメイン名に似ています。詳細については、policydの-spf.conf.5 および RFC5451 2.3節 を参照してください。
Header_Type = AR としている場合は、Authserv-Id は 指定する必要があります。
例)
Authserv_Id = mx.example.com
(デフォルトは、未設定 です。)
ほとんど、現状(デフォルト)のままで良いと思いますが、
編集した場合は、Postfixの再起動を行います。
|
SPF認証動作をテストする
ここまでで、SPF認証のための動作環境はできているはずです。
ただ、本当にちゃんと動作しているかは、実際にテストしてみないとわかりません。
Yahoo!などのフリーメールからメールを送信してSPF認証を確認してみる で正しく動作していれば、ほぼ、間違いなく動作しています。
ここでは、動作しなかった場合の簡単な対処方法や、あえてSPF認証でFailなどを出してみて、正しくSPFが認証されるか確認してみましょう。
あえてSPF認証でOK以外を出すようにテストしてみます。
あえてSPF認証でOK以外を出すようにテストするには、単純に、差出人をyahoo.co.jpドメインのメールアドレスとし、Windowsのメールクライアントソフトなどから該Postfixサーバーのユーザ宛へ送信すればOKです。
例えば、以下のようなメールをSPF認証設定を行ったメールサーバーへ直接送付すればOKです。
|
以下は、その実施例です。確かにSoftfailとなって、正しくSPF認証できているようです。
|
うまく動作しない場合の対処を考えてみます。
SPF認証が正しく動作しないのは、ほとんどインストールに不備があるか設定内容に誤りがある場合です。
例えば、メールのログ(/var/log/maillog) で以下のように出力されている場合は、環境に誤りがあります。
postfix-policyd-spf-pythonの場合
|
postfix-policyd-spf-perlの場合
|
上記は、ほとんど間違いなく動作環境に問題があります。
まずは、/etc/postfix/master.cf の設定内容を確認しましょう。よくあるのはパスの間違いです。
master.cf で記載した実行イメージを、そのままシェルで実行してみてください。
postfix-policyd-spf-pythonの場合
|
正常なら、何も出力されずに実行中のままとなります。(Ctrl+Cで抜けます)
上記のように出力されたら、動作環境に問題があります。
上記メッセージは、python DNSがインストールされていないという意味ですから、
python DNSをインストールしましょう。
postfix-policyd-spf-perlの場合
|
正常なら、何も出力されずに実行中のままとなります。(Ctrl+Cで抜けます)
上記のように出力されたら、動作環境に問題があります。
上記メッセージは、perl Sys::Hostname::Long がインストールされていないという意味ですから、
perl Sys::Hostname::Long をインストールしましょう。
ほとんどデフォルトのままで良いのですが、メールを別のサーバーへ転送する場合などは、SPFの場合、発信者情報に依存する部分が大きいので、fail になってしまうこともあります。 そのような場合、python版を使っていると設定で、rejectしないようにすることも可能です。
何も細かい設定が必要ない場合は、perl版でも十分だと思います。
SPFは、簡単にスパムメールを判断することができる優れものです。(もちろん、完全ではありませんが)まだ、SPFに対応されていないなら、対応されることをおすすめします。自分がSPFに対応することで、管理しているドメインを使ったスパムは激減するはずです。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
- postfix で postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を使ってSPF認証する(Debian/Ubuntu編)
- Debian(Ubuntu)で postfix を使ってみる
- CentOS(Scientific Linux)で postfix を使ってみる
- Postfix で Submissionポート(サブミッション・ポート)& SMTP-AUTH(認証)& STARTTLS or SSL/TLS を使ってみる
- Postfix で dkim-milter(dkim-filter) を使ってDKIM に対応する(Debian/Ubuntu編)
2016年2月18日, 11:37 AM
こんにちは。SPF導入において大変参考にさせて頂きました。
導入後のトラブルで、メールのヘッダが一部消えてしまう
(In-Reply-To, References)という現象が発生してしまったのですが
原因または解消方法に心当たりがありますでしょうか…?
導入したのは、pypolicyd-spf-1.3.2 で Postfix 2.6.6-6、RHEL6.3を使っています。