弊社のメールサーバにSPF(Sender Policy Framework)を組み込んでみました
SPF(Sender Policy Framework)
http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
2. SPFの標準化
SPFは、IETFのMARID等において数々の議論と検討を経て、現在、実験的カテゴリのRFCとして(RFC 4408)標準化されている。SMTP通信において送信者のドメインの正当性を検証する技術を一般に「送信ドメイン認証(Sender Authentication Technology)」と総称するが、SPFはそのひとつであり、SMTP通信において送信側のホストのIPアドレスを基に認証を行うIPアドレスベースの認証方式のひとつとして分類されている。
弊社のメールサーバにはすでにDKIM (Domainkeys Identified Mail)も組み込んであります
Install DomainKeys Identified Mail (DKIM)
http://www.rootlinks.net/2012/11/06/install-domainkeys-identified-mail-dkim/
今回参考にさせて頂いたサイト
postfix で postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を使ってSPF認証する(CentOS/ScientificLinux編)
http://server-setting.info/centos/postfix-policyd-spf-python-redhat.html
今回は簡単そうなpostfix-policyd-spf-perlを組込みました
SPF Policy Server for Postfix (Perl implementation)
https://launchpad.net/postfix-policyd-spf-perl/
当方の環境はCentOS release 5.10 (Final)+Postfix 2.3.3です
- 送信側の設定
- DNS設定追加
- digコマンドで確認
- フリーメール宛に送信してみる
送信側の設定は簡単です。ドメインのDNSにTXTレコードを記述します
1 |
rootlinks.net. IN TXT "v=spf1 mx -all" |
意味は「rootlinks.netからのメールは必ずMXレコードに登録されたホストから送信されます」。言い換えればMXレコード以外のホストから送信されたものは偽物ですとなります
ただ”-all”にするとメーリングリストのように中継サーバを経由すると拒否される場合があるかもしれません。その場合には”~all”の方が適切でしょうかね
digコマンドで確認します
1 |
dig -t TXT rootlinks.net |
弊社からgoogleメールに送信してヘッダを確認します。”Received-SPF: pass”とあれば成功です
1 2 3 4 |
Received-SPF: pass (google.com: domain of xxxxxx@rootlinks.net designates ... ; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ...; dkim=pass header.i=@rootlinks.net |
- 受信側設定
- perl-Sys-Hostname-Longのインストール
- perl-Mail-SPFのインストール
- postfix-policyd-spf-perl-2.010.tar.gzをインストール
- master.cfを編集
- main.cfの編集
- Postfixを再起動
- テスト
perl-Sys-Hostname-Longをyumでインストールします
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
[root@host1 ~]# yum info perl-Sys-Hostname-Long Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: ftp.nara.wide.ad.jp * base: ftp.nara.wide.ad.jp * centosplus: ftp.nara.wide.ad.jp * epel: ftp.kddilabs.jp * extras: ftp.nara.wide.ad.jp * remi: remi.kazukioishi.net * updates: ftp.nara.wide.ad.jp Available Packages Name : perl-Sys-Hostname-Long Arch : noarch Version : 1.4 Release : 5.el5 Size : 13 k Repo : epel Summary : Try every conceivable way to get full hostname URL : http://search.cpan.org/dist/Sys-Hostname-Long/ License : GPL+ or Artistic Description: How to get the host full name in perl on multiple operating systems : (mac, windows, unix* etc) [root@host1 ~]# yum install perl-Sys-Hostname-Long Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: ftp.nara.wide.ad.jp * base: ftp.nara.wide.ad.jp * centosplus: ftp.nara.wide.ad.jp * epel: ftp.kddilabs.jp * extras: ftp.nara.wide.ad.jp * remi: remi.kazukioishi.net * updates: ftp.nara.wide.ad.jp Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package perl-Sys-Hostname-Long.noarch 0:1.4-5.el5 set to be updated --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: perl-Sys-Hostname-Long noarch 1.4-5.el5 epel 13 k Transaction Summary ================================================================================ Install 1 Package(s) Upgrade 0 Package(s) Total download size: 13 k Is this ok [y/N]: y Downloading Packages: perl-Sys-Hostname-Long-1.4-5.el5.noarch.rpm | 13 kB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : perl-Sys-Hostname-Long 1/1 Installed: perl-Sys-Hostname-Long.noarch 0:1.4-5.el5 Complete! |
perl-Mail-SPFをyumでインストールします
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
[root@host1 ~]# yum info perl-Mail-SPF Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: ftp.nara.wide.ad.jp * base: ftp.nara.wide.ad.jp * centosplus: ftp.nara.wide.ad.jp * epel: ftp.kddilabs.jp * extras: ftp.nara.wide.ad.jp * remi: remi.kazukioishi.net * updates: ftp.nara.wide.ad.jp Available Packages Name : perl-Mail-SPF Arch : noarch Version : 2.007 Release : 1.el5 Size : 138 k Repo : epel Summary : Object-oriented implementation of Sender Policy Framework URL : http://search.cpan.org/dist/Mail-SPF/ License : BSD Description: Mail::SPF is an object-oriented implementation of Sender Policy : Framework (SPF). See http://www.openspf.org for more information : about SPF. [root@host1 ~]# yum install perl-Mail-SPF Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: ftp.nara.wide.ad.jp * base: ftp.nara.wide.ad.jp * centosplus: ftp.nara.wide.ad.jp * epel: ftp.kddilabs.jp * extras: ftp.nara.wide.ad.jp * remi: remi.kazukioishi.net * updates: ftp.nara.wide.ad.jp Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package perl-Mail-SPF.noarch 0:2.007-1.el5 set to be updated --> Processing Dependency: perl(version) for package: perl-Mail-SPF --> Running transaction check ---> Package perl-version.i386 1:0.7203-1.el5 set to be updated --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: perl-Mail-SPF noarch 2.007-1.el5 epel 138 k Installing for dependencies: perl-version i386 1:0.7203-1.el5 epel 47 k Transaction Summary ================================================================================ Install 2 Package(s) Upgrade 0 Package(s) Total download size: 185 k Is this ok [y/N]: y Downloading Packages: (1/2): perl-version-0.7203-1.el5.i386.rpm | 47 kB 00:00 (2/2): perl-Mail-SPF-2.007-1.el5.noarch.rpm | 138 kB 00:00 -------------------------------------------------------------------------------- Total 728 kB/s | 185 kB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : perl-version 1/2 Installing : perl-Mail-SPF 2/2 Installed: perl-Mail-SPF.noarch 0:2.007-1.el5 Dependency Installed: perl-version.i386 1:0.7203-1.el5 Complete! |
postfix-policyd-spf-perl-2.010.tar.gzをダウンロードしてインストールします。インストールといってもperlプログラムをコピーするだけですが
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@host1 ~]# cd /usr/local/src/ [root@host1 src]# wget https://launchpad.net/postfix-policyd-spf-perl/trunk/release2.010/+download/postfix-policyd-spf-perl-2.010.tar.gz --2014-09-04 10:32:55-- https://launchpad.net/postfix-policyd-spf-perl/trunk/release2.010/+download/postfix-policyd-spf-perl-2.010.tar.gz launchpad.net をDNSに問いあわせています... 91.189.89.223, 91.189.89.222 launchpad.net|91.189.89.223|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 Moved Temporarily 場所: https://launchpadlibrarian.net/107864701/postfix-policyd-spf-perl-2.010.tar.gz [続く] --2014-09-04 10:32:56-- https://launchpadlibrarian.net/107864701/postfix-policyd-spf-perl-2.010.tar.gz launchpadlibrarian.net をDNSに問いあわせています... 91.189.89.228, 91.189.89.229 launchpadlibrarian.net|91.189.89.228|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 13981 (14K) [application/x-tar] `postfix-policyd-spf-perl-2.010.tar.gz' に保存中 100%[======================================>] 13,981 54.3K/s 時間 0.3s 2014-09-04 10:32:58 (54.3 KB/s) - `postfix-policyd-spf-perl-2.010.tar.gz' へ保存完了 [13981/13981] [root@host1 src]# tar xvfz postfix-policyd-spf-perl-2.010.tar.gz postfix-policyd-spf-perl-2.010/ postfix-policyd-spf-perl-2.010/CHANGES postfix-policyd-spf-perl-2.010/INSTALL postfix-policyd-spf-perl-2.010/postfix-policyd-spf-perl postfix-policyd-spf-perl-2.010/README postfix-policyd-spf-perl-2.010/LICENSE [root@host1 src]# cp postfix-policyd-spf-perl-2.010/postfix-policyd-spf-perl /usr/local/bin [root@host1 src]# ls -l /usr/local/bin/postfix-policyd-spf-perl -rwxr-xr-x 1 root root 13312 9月 4 10:41 /usr/local/bin/postfix-policyd-spf-perl |
postfixの設定ファイル /etc/postfix/master.cfを編集します
1 2 3 4 5 6 |
[root@host1 src]# which perl /usr/bin/perl [root@host1 src]# vi /etc/postfix/master.cf # Sender Policy Framework policy-spf unix - n n - 0 spawn user=nobody argv=/usr/bin/perl /usr/local/bin/postfix-policyd-spf-perl |
postfixの設定ファイル /etc/postfix/main.cfを編集します
1 2 3 4 5 6 |
[root@host1 src]# vi /etc/postfix/main.cf # Sender Policy Framework policy-spf_time_limit = 3600 smtpd_recipient_restrictions = permit_mynetworks, check_policy_service unix:private/policy-spf |
1 2 3 |
[root@host1 src]# /etc/init.d/postfix restart postfix を停止中: [ OK ] postfix を起動中: [ OK ] |
googleからrootlinks.netにメールを送信してみます
メールヘッダーを確認するとpassの行が追加されています
1 |
Received-SPF: pass (gmail.com ... _spf.google.com: Sender is authorized to use ... |
余談ですがSPFもDKIMもまだまだ実装されているサーバは少ない気がします
たまたま見つけたドメインでは”Received-SPF: permerror(SPFレコードの記述に誤りがあるなどで認証処理に失敗した)”になっていました。実装したのに設定ミスって….
確認したら単純な記述ミスがされていました。ひとつのドメインに複数行書かれていたんです。至極残念ですね
1 2 3 4 5 |
Sample 4: 1つのドメインに対して複数のspf1レコードを公開している 【誤】example.org. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ~all" example.org. IN TXT "v=spf1 a:mx01.example.org ~all" example.org. IN TXT "v=spf1 a:web.example.org ~all" |