仮想化でお馴染みの、VMwareのESXiを検証マシンにインストールしてSPF(Sender Policy
Framework)を検証してみた。

 

SPFとは、なんじゃらほい?と言いますと、メールを受け取ったサーバが送信してきたサーバのドメインをDNSに問い合わせにいき、IPとDNSが登録されたもので合っていますよ!と、DNSから返事が返ってきたらメールを受信するというものです。(簡単すぎる説明でサーセンww)

詳しくは、参考文献を参照してください。

 

今回の検証環境は、検証用マシンに、VMware ESXiをインストールして仮想的に2台(仮にA、Bとおく)のLinuxマシンを構築しました。

OSは、CentOS 5.4を採用しています。

 

検証方法として、AのマシンにDNS(bind)とpostfix(MTA)をインストールし、Bのマシンにはpostfix(MTA)をインストールします。

で、BのマシンからAのマシンへドメインを偽ってメールを送信します。

その結果、AマシンがBマシンから送信されたメールを受け取らなければ成功です。(設定次第では結果は変わってきます。)

 

それでは、ここからは構築した時のメモです。

 

ESXiをインストールし、仮想マシン2台構築し、アップデートも終わり、vmware-toolsもインストールしましたよっと。

ちなみに

AマシンのIP:192.168.0.15

BマシンのIP:192.168.0.17

 

1)Aマシンにbindとpostfixをインストールする。

まぁ、これはyum使えば簡単なんでホイホイっとインストール。

 

[root@A ~]# yum -y install bind chaching-nameserver bind-chroot

bind ←DNSサーバ
chaching-nameserver ←DNSキャッシュサーバとして使用するなら必要
bind-chroot ←セキュリティー対策として必要。もし、セキュリティーホールが見つかった場合、bindのディレクトリ以外はアクセスできないようになるみたい。

 

正直、ローカル環境での構築なため、bindだけでもいいかなと思いましたが一応インストールしました。

 

次に、postfixのインストール。

 

[root@A ~]# yum -y install postfix

 

おk!

 

2)bindの設定

bindのnamed.confはデフォルトでインストールされなくなられたみたいなので、キャッシュネームサーバをインストールした時にできた設定例を流用します。

まず、コピっちゃいましょう。

 

[root@A~]# cp /var/named/chroot/etc/named.caching-nameserver.conf \
/var/named/chroot/etc/named.conf

 

named.confの中身

options {

#listen-on port 53 { 127.0.0.1; };

#listen-on-v6 port 53 { ::1; };

directory       “/var/named”;

dump-file       “/var/named/data/cache_dump.db”;

statistics-file “/var/named/data/named_stats.txt”;

memstatistics-file “/var/named/data/named_mem_stats.txt”;

 

// Those options should be used carefully because they disable port

// randomization

// query-source    port 53;

// query-source-v6 port 53;

 

#allow-query     { localhost; };

#allow-query-cache { localhost; };

};

logging {

channel default_debug {

file “data/named.run”;

severity dynamic;

};

};

view localhost_resolver {

#       match-clients      { localhost; };

#       match-destinations { localhost; };

recursion yes;

include “/etc/local.zone“;

};

 

local.zoneの中身

zone “mail-test.com” IN {

type master;

file “/etc/mail-test.com.zone“;

};

 

zone “0.168.192.in-addr.arpa” IN {

type master;

file “/etc/0.168.192.in-addr.arpa.zone“;

};

)ここで、Aマシンのドメインは「mail-test.com」となっている。

 

mail-test.com.zoneの中身(正引き)

$TTL    86400

$ORIGIN mail-test.com.

@       IN      SOA      ns.mail-test.com. root.mail-test.com. (

2009110301 ; Serial

28800      ; Refresh

14400      ; Retry

3600000    ; Expire

86400 )    ; Minimum

IN      NS      ns1.mail-test.com.

IN      MX      10      mail.mail-test.com.

ns1     IN      A       192.168.0.15

mail    IN      A       192.168.0.15

@       IN      A       192.168.0.15

@       IN      TXT     “v=spf1 ip4:192.168.0.15 -all” ←SPFレコードの設定

)最後に指定している、「-all」ですが、「all」の前に「-」が付いています。これは、限定子と呼ばれるもので、この限定子の設定により、メールの受け取り方が変わってきます。限定子には2種類あり、「-」と「~」です。「-」は強制的なエラーになります。この場合の設定だと、ドメイン【mail-test.com】のIPは【192.168.0.15】でなければメールを受け取らない設定になっています。ちなみに、「~」だとSoft Failなので強制的に弾かれると言う事はありません。その他の設定方法は、参考文献を参照してください。

 

0.168.192.in-addr.arpa.zoneの中身(逆引き)

$TTL    86400

$ORIGIN 0.168.192.in-addr.arpa.

@       IN      SOA     ns1.mail-test.com. root.mail-test.com. (

2009110301 ; Serial

28800      ; Refresh

14400      ; Retry

3600000    ; Expire

86400 )    ; Minimum

IN      NS      ns1.mail-test.com.

15      IN      PTR     ns1.mail-test.com.

15      IN      PTR     mail-test.com.

15      IN      PTR     mail.mail-test.com.

 

設定ファイルが出来たら、bindを起動します。

 

[root@A ~]# /etc/rc.d/init.d/named start

 

ここで、すこしだけハマりました。

σ(゜∀゜のパーミッションの設定が悪かったのか、bindの起動に失敗しまくりました。

ログのmessagesには、bindを起動すると、permission deniedと出まくってました。

適当にパーミッションを直してあげたら起動してくれました(´_ゝ`)

 

bind起動後、digコマンドなどで正引き、逆引きを試してみましょう!

 

正引き

[root@A ~]# dig mail-test.com

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> mail-test.com

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34906

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

 

;; QUESTION SECTION:

;mail-test.com.                 IN      A

 

;; ANSWER SECTION:

mail-test.com.          86400   IN      A       192.168.0.15

 

;; AUTHORITY SECTION:

mail-test.com.          86400   IN      NS      ns1.mail-test.com.

 

;; ADDITIONAL SECTION:

ns1.mail-test.com.      86400   IN      A       192.168.0.15

 

;; Query time: 1 msec

;; SERVER: 127.0.0.1#53(127.0.0.1)

;; WHEN: Tue Nov  3 20:26:27 2009

;; MSG SIZE  rcvd: 81

 

逆引き

[root@A ~]# dig -x 192.168.0.15

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> -x 192.168.0.15

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42905

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

 

;; QUESTION SECTION:

;15.0.168.192.in-addr.arpa.     IN      PTR

 

;; ANSWER SECTION:

15.0.168.192.in-addr.arpa. 86400 IN     PTR     mail.mail-test.com.

15.0.168.192.in-addr.arpa. 86400 IN     PTR     mail-test.com.

15.0.168.192.in-addr.arpa. 86400 IN     PTR     ns1.mail-test.com.

 

;; AUTHORITY SECTION:

0.168.192.in-addr.arpa. 86400   IN      NS      ns1.mail-test.com.

 

;; ADDITIONAL SECTION:

ns1.mail-test.com.      86400   IN      A       192.168.0.15

 

;; Query time: 0 msec

;; SERVER: 127.0.0.1#53(127.0.0.1)

;; WHEN: Tue Nov  3 20:29:35 2009

;; MSG SIZE  rcvd: 137

 

見える!!見えるぞ!!私にもてk(ry

さて、ガンダムネタは置いておいて、このような感じで見えていればおkです。

ちなみに、見えない人は/etc/resolv.confなどを見直すか、ニュータイプになってくださいъ(`ー゜)

 

3)postfixの設定

postfixは、ほぼデフォルト。

設定したのと言えば、mydestinationとhome_mailboxくらい。

ただ、Aマシン(mail-test.com)を受信側としているのでSPFの設定は必要です。

以下のHPからPostfix-Policyd-spf-perlをダウンロードします。

 

http://www.openspf.org/Software

)σ(゜∀゜がダウンロードした最新版は2.007でした。

 

アーカイブをダウンロード後解凍します。

その中に入っているINSTALLを見ると全部分かっちゃいますが、一応書いておきます。(ほぼ自分のためにww)

 

■必要なもの

(1)NetAddr-IP

(2)Mail-SPF

 

上記のPerlモジュールが必要です。

リポジトリを入れているとyumで入るみたいですが、めんどくさかったのでCPAN(シーパン)を使用することにしました。CPANで失敗する人は、yumで入れましょう。

 

インストール方法

 

[root@A ~]# perl –MCPAN -e shell

 

/usr/lib/perl5/5.8.8/CPAN/Config.pm initialized.

 

 

色々と、聞かれてきますがσ(゜∀゜はデフォルトでインストール。

必要な設定は、それぞれの環境で行わないといけないみたいです。

ftpが使えなかったり、ftpが使えなかったり、f(ry

ちなみに、ftpが使えない場合、ダウンロードするアドレスをhttpなどに書き換える必要があります。

【o conf urllist push URL名】などで(;´ρ`)

 

さて、CPANの初期設定が出来たら、以下のようになっていると思います。

 

Terminal does not support AddHistory.

 

cpan shell — CPAN exploration and modules installation (v1.7602)

ReadLine support available (try ‘install Bundle::CPAN’)

 

cpan>

 

ここで、【cpan>install Mail::SPF】と言うコマンドを打ってモジュールをインストールしましょう!ъ(`ー゜)

 

うじゃうじゃと文字列が出てきて、インストール完了後、ちゃんとインストールされているか確認する。ちなみに、CPANコンソールからの抜け方は【quit】です。

 

[root@A ~]# perl -MMail::SPF -e ”

 

何も表示されなかったら、無事インストール完了。

ちなみに、NetAddr-IPも確認してみましょう。

 

[root@A ~]# perl -MNetAddr::IP -e ”

 

何も表示されなければおk!

 

独り言:当初、google先生に「SPF 設定」などでググったら、必要なモジュールで「Mail::SPF::Query」がありました。しかし、2.007では、このモジュールは必要ないみたいです。それを知らず、CPANでこのモジュールを入れようと頑張ってたんですが、【エラー 255】とか出てきてインストール出来ず、これまたハマってました。ちゃんと最新のドキュメントは読むものですね(´_ゝ`)

 

次に、postfix-policyd-spf-perlをコピーして/usr/local/lib/の直下にでも置きましょう。

Perlスクリプトなので、どこに置いても構わないと思います。

置く場所は、各自考えて置きましょうと言う事でw

 

[root@A postfix-policyd-spf-perl-2.007]# cp postfix-policyd-spf-perl /usr/local/lib/policyd-spf-perl

 

コピー後、postfixのmain.cfとmaster.cfを編集する。

 

main.cf

[root@A postfix]# vi main.cf

最終行にでも以下を追加

smtpd_recipient_restrictions =

reject_unauth_destination

check_policy_service unix:private/policy

 

master.cf

[root@A postfix]# vi master.cf

最終行にでも以下を追加

policy    unix  -       n       n       -       0       spawn

user=nobody argv=/usr/local/lib/policyd-spf-perl

)user=nobodyの前に、tab(又はスペース?)を入れておかないとbad transport typeとか出てきて起動しない。これも、σ(゜∀゜はハマりました(;´ρ`)

 

後、INSTALLを見ると、4.Add “policy_time_limit = 3600″ to main.cfと書かれていますが、今回は記述しません。

 

4)Bマシンの設定

Bマシンにはpostfixを入れるだけです。

設定も、上とほぼ変わらず。

後、変えたのは/etc/resolv.confにAマシン(DNSサーバ)のIPを記述したくらいです。

 

5)テスト

さて、ドキドキのテストです。

今回は、BマシンからAマシンで使用されているドメインを使用してメールを送信します。

ちなみに、MUAを使うのはめんどくさかったのでtelnetでメール送信を行いました。

 

テスト

[root@B ~]# telnet localhost 25

Trying 127.0.0.1…

Connected to localhost.localdomain (127.0.0.1).

Escape character is ‘^]’.

220 mail2-test.com ESMTP Postfix

helo mail2-test.com Bマシンのホスト名はmail2-test.com

250 mail2-test.com

mail from:root@mail-test.com ←ここで、fromを偽る。

250 2.1.0 Ok

rcpt to:ユーザ名@mail-test.com ←Aマシンに登録されているメールが受け取れるユーザ

250 2.1.5 Ok

data

354 End data with <CR><LF>.<CR><LF>

testmail ←適当なメッセージ

.

250 2.0.0 Ok: queued as A717D802E

 

さて、Aマシンにメールが届いてるか見てみると・・・。

届いてない!!届いてないよママン!!

ログを確認してみる。

 

Aマシンのmaillog

Nov  3 21:20:29 mail-test postfix/smtpd[12004]: connect from unknown[192.168.0.17]

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : SPF fail (Mechanism ‘-all’ matched): Envelope-from: root@mail-test.com

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: handler sender_policy_framework: is decisive.

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : Policy action=550 Please see http://www.openspf.org/Why?s=mfrom;id=root%40mail-test.com;ip=192.168.0.17;r=mail-test.com

Nov  3 21:20:29 mail-test postfix/smtpd[12004]: NOQUEUE: reject: RCPT from unknown[192.168.0.17]: 550 5.7.1 <ユーザ名@mail-test.com>: Recipient address rejected: Please see http://www.openspf.org/Why?s=mfrom;id=root%40mail-test.com;ip=192.168.0.17;r=mail-test.com; from=<root@mail-test.com> to=<ユーザ名@mail-test.com> proto=ESMTP helo=<mail2-test.com>

Nov  3 21:20:29 mail-test postfix/smtpd[12004]: disconnect from unknown[192.168.0.17]

Nov  3 21:20:29 mail-test postfix/smtpd[12004]: connect from unknown[192.168.0.17]

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : SPF none (No applicable sender policy available): HELO/EHLO (Null Sender): mail2-test.com

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: handler sender_policy_framework: is decisive.

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : Policy action=PREPEND Received-SPF: none (mail2-test.com: No applicable sender policy available) receiver=mail-test.com; identity=helo; helo=mail2-test.com; client-ip=192.168.0.17

Nov  3 21:20:29 mail-test postfix/smtpd[12004]: 9129613018C: client=unknown[192.168.0.17]

Nov  3 21:20:29 mail-test postfix/cleanup[12009]: 9129613018C: message-id=<20091103122030.684808033@mail2-test.com>

Nov  3 21:20:29 mail-test postfix/qmgr[11208]: 9129613018C: from=<>, size=2809, nrcpt=1 (queue active)

Nov  3 21:20:29 mail-test postfix/smtpd[12004]: disconnect from unknown[192.168.0.17]

Nov  3 21:20:29 mail-test postfix/local[12010]: 9129613018C: to=<root@mail-test.com>, relay=local, delay=0.03, delays=0.02/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)

Nov  3 21:20:29 mail-test postfix/qmgr[11208]: 9129613018C: removed

)AマシンのIP:192.168.0.15 BマシンのIP:192.168.0.17

 

なんか、長ったらしいのでSPFの部分だけ取り出してみた。

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : SPF fail (Mechanism ‘-all’ matched): Envelope-from: root@mail-test.com

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : SPF none (No applicable sender policy available): HELO/EHLO (Null Sender): mail2-test.com

Nov  3 21:20:29 mail-test postfix/policy-spf[12008]: : Policy action=PREPEND Received-SPF: none (mail2-test.com: No applicable sender policy available) receiver=mail-test.com; identity=helo; helo=mail2-test.com; client-ip=192.168.0.17

 

うん。

ちゃんと見ているようだ。

届いてないから当たり前かw

 

ちなみに、ドメインを偽らなくメールを送信して受信してみました。

ヘッダーには

Received-SPF: none (mail2-test.com: No applicable sender policy available) receiver=mail-test.com; identity=mailfrom; envelope-from=”root@mail2-test.com”; helo=mail2-test.com; client-ip=192.168.0.17

 

と、記述されています。

mail2-test.comは何も設定してません┐(´∀`)┌

 

取り合えず、これで、基本的な設定でのSPFでメールを弾く設定は終わりです。

 

さて、話は変わりますが最近寒くなってきましたね((((゜Д゜;))))

今日、余裕ぶっこいて半袖で外でたら寒すぎでしたww

 

これから、どんどん寒くなっていくんでしょうね(´・ω・`)

しかし!!雪国育ちの本領を発揮する時が!!

 

さて、コートを買ってこよう(´_ゝ`)

 

参考文献

http://e-words.jp/w/SPF.html

http://ja.wikipedia.org/wiki/Sender_Policy_Framework

http://www.kozupon.com/mail/spf.html

 


[root@A postfix]# vi main.cf

最終行にでも以下を追加

smtpd_recipient_restrictions =

reject_unauth_destination

check_policy_service unix:private/policy


11月 3, 2009 at 9:45 pm by 黒ぶちメガネ
Category: Linux, Postfix, spam対策