« 2008年10月 | トップページ | 2011年5月 »

2011年4月

Mac OS X Server:メールサーバにドメイン認証(SPF)を設定する

【概要】
メールサーバMTA)またはメールクライアントがメールをMTAへ送信する際に,メール転送プロトコル(SMTP)に従いメール送信者のアドレスを送信先のサーバに知らせますが,この送信者アドレスが正当なものであるかを確認する仕組みがSMTPには組み込まれていません。すなわちメール送信者のアドレスは詐称が可能です。

この問題への対処として,メールを受け取ったサーバが,送信元サーバが正当な送信サーバかどうかを確認する「送信ドメイン認証(SPFなど)」が普及しつつあるようです。SPFは,送信側がメールを送信するサーバのアドレスを,そのドメインのDNSサーバで公表することで,メールを送信したのが正当なサーバかどうかを受信側が確認することを可能にするものです。
SPFはドメインとメールサーバを関連付けるものなので,ドメインの詐称を検知することはできますが,アカウントの詐称は検知することができません。

このエントリでは,メール送信側がDNSに設定するSPFの書式と設定方法について解説します。
このエントリは,メール受信側がSPFレコードをどのように利用するかについては対象外です。

【Hellow World:SPFをDNSに設定してみる】
最初に「何も判定しない」SPFレコードをDNSに記述して,これを公開してみることにします。SPFの公開がうまくいったのが確認できたら,必要な判定を随時追加修正すればいいでしょう。

例 1:何も判定しないSPF定義
v=spf1 ?all
例1の定義のうち,最初の「v=spf1」は,以下に続くテキストがSPFの定義であることを表します。「?all」は,すべてのIPアドレスの判定を保留にすることを表します。

SPF定義はBIND(DNSサーバ)のゾーンファイルに設定します。ゾーンファイルが保存されているディレクトリパスは,BINDの環境設定ファイル「/etc/named.conf」にて「option」セクションの「directory」に定義されています。Mac OS X Serverの場合,デフォルトのままならゾーンファイルは「/var/named/」にあります。
ドメイン名が「example.co.jp」の場合,ゾーンファイルのファイル名は「example.co.jp.zone」になります。このファイルをviなどのテキストエディタで開き,上記SPF定義を以下のように追加します。

example.co.jp. IN TXT "v=sft1 ?all"
ドメイン名「example.co.jp.」の最後にピリオドを付けるのを忘れないでください。

この行を追加して保存した後で,DNSを再起動します。
再起動をコマンドライン上で行うには,「named restart」を実行します。
Mac OS X Serverの場合は,「サーバ管理」ツールを起動して「コンピュータとサービス」から「DNS」を選んで「サービスを停止」ボタンを押し,停止したら「サービスを起動」ボタンを押すことにより再起動することができます。

以上の操作によりSPFの設定を行った後で,これが上位ドメインに反映されているかを確認します。

●Windows XPから確認する場合:
DOSプロンプトにて以下のようにコマンド実行します。

nslookup -query=txt example.co.jp

●LinuxやMac OS XなどUNIX系OSから確認する場合:
ターミナルシェルより以下のようにコマンド実行します。
dig example.co.jp txt

●Mac OS Xから「ネットワークユーティリティ」で確認する:
Mac OS Xでは「ネットワークユーティリティ」というアプリケーションからも確認できます。このツールは「dig」コマンドにGUIを被せたものです。
「ネットワークユーティリティ」はフォルダ「アプリケーション」→「ユーティリティ」に入っています。
使用方法は,ツールを起動して「Lookup」タブを選び,アドレス入力欄にドメインまたはDNSサーバのIPアドレスを入力,「ルックアップする情報」メニューで「テキスト情報」を指定して「Lookup」ボタンを押すと,下のテキストエリアに結果が出力されます。

※SPF設定後の注意:Mac OS X Server(10.4.x)でSPFを設定し「サーバ管理」ツールを使ってDNSの設定を更新すると,サーバ管理がSPF定義をエラーと解釈して勝手に削除してしまいます。SPF定義を記述した後はサーバ管理ツールはDNSの起動・停止のみ行い,DNS定義の変更はサーバ管理ツールでは行わないようにしてください。

【SPFによるメール送信元サーバの指定】
前項で設定したSPFの定義は,送信元サーバの指定をまったく行わないものでした。本項より送信元サーバを指定する方法を順次説明します。

●正当なメールサーバのIPアドレスを列挙する
例 2:正当なメールサーバのIPアドレスの列挙
v=spf1 +ip4:1.2.3.4 +ip4:1.2.3.5 +ip4:1.2.3.6 -all
「v=spf1」に続く「+ip4:IPアドレス」のリストは,DNSサーバが管理するドメインのメールを送信するメールサーバ(MTA)のIPアドレスのリストです。
「ip4:IPアドレス」はIPv4形式のIPアドレスによるサーバの指定です。アドレスの前の「+」は指定したサーバがメールの送信元として正当なサーバであることを表します。
末尾の「-all」について,「all」はそれより前に列挙したIPアドレスのどれにも該当しない全てのアドレスの判定を指定します。allの前に「-」を付与した場合,IPアドレスに該当しないアドレスは,メールの受け取りを拒否すべきであることを表します。
注意:IPv4のアドレスの指定でよくある誤りは「ipv4:」と記述するケースです。正しくは「ip4:」になります。

●IPアドレスとサブネットマスクで指定する
例 3:IPアドレスとサブネットマスクによる指定
v=spf1 +ip4:1.2.3.0/24 -all
IPアドレスの指定方法として,サブネットマスク(プレフィックス長)を付加して「ip4:IPアドレス/プレフィックス長」としてIPアドレスの範囲指定を行うこともできます。

●IPv6アドレスで指定する
例 4:IPv6アドレスによる指定
v=spf1 +ip6:1234:5678:9abc:def0:1234:5678:9abc:def0 -all
v=spf1 +ip6:1234:5678:9abc:def0:1234:5678:9abc:def0/96 -all
IPアドレスとしてIPv6のアドレスを「+ip6:IPアドレス」で指定することもできます。また,これにサブネットマスク(プレフィックス長)を付加して「ip6:IPアドレス/プレフィックス長」でIPアドレスの範囲指定を行うこともできます。

●メールを送信しないサーバを指定する
例 5:メールを送信しないサーバの指定
v=spf1 +ip4:1.2.3.4 -ip4:2.3.4.5 ~all
IPアドレスの前に「-」を付けた場合は,指定したIPアドレスからこのドメインのメールは送信されないことを表します。
ただし,最後が「-all」ならば,指定したIPアドレスはこの「-all」で判定されるので,指定は無意味です。IPアドレスで「-」を指定する場合に意味があるのは,allが「-」以外である場合です。
allには「-」のほか,「~」(チルダ),「?」を付与することができます。「~」は「弱い失敗」,「?」は「ニュートラル」を表します(詳細は次項)。
allに「+」を指定することも可能です。この場合,「-」を付与したIPアドレスを除くすべてのアドレスが正当なアドレス,という指定になります。
例5では,IPアドレス「1.2.3.4」は正当なアドレス,「2.3.4.5」は不正なアドレス,それ以外は「弱い失敗」を指定しています。

●このドメインのメールアドレスは存在しないことを表明する
例 6:送信用メールサーバは存在しない
v=spf1 -all
サーバ指定で「-all」とだけ書いた場合,このドメインからのメールはすべて受信拒否しなければならないことを表します。この指定は,このドメインのメールアドレスは存在しないことを表しています。

【サーバ指定について】
この項では,サーバを「正当」または「不当」と判断するための決まりごとについて説明します。

●アドレス及び「all」に付与する記号(限定子)について
例 7:「弱い失敗(Soft Fail)」「ニュートラル」
v=spf1 +ip4:1.2.3.4 ~all
v=spf1 +ip4:1.2.3.4 ?all
IPアドレス及び「all」の前に付与する「+」「-」について,「+」は指定したサーバが正当なサーバ,「-」は不当なサーバであることを表しますが,これ以外の指定に「~」(チルダ)と「?」があります。「~」は「弱い失敗(Soft Fail)」を表します。これに該当するサーバは,正当なサーバとは見なさないが,メールを受け取ってもかまわないことを表します。実際の実装ではSoft Failに対してメールの受信側は受信したメールのヘッダにスパム情報を挿入して受け取るようです。「?」は「ニュートラル」を表し,「+」と同じ扱いになります。「?」は本来「-」や「~」であるべきものを一時的に「+」と同じ扱いにする場合に指定します。

●評価順について
例 8:指定した範囲のアドレスのうち特定のアドレスだけ正当なアドレスに指定する
v=spf1 +ip4:1.2.3.4 -ip4:1.2.3.0/24 ~all
SPFレコードのアドレス指定を評価するときは,アドレス指定の列挙の最初から順番に比較していって,一致したところで評価が確定し,これ以降の評価は行いません。
例5の場合,IPアドレス「1.2.3.4」は正常受け取り,「1.2.3.4」を除く「1.2.3.0/24」は受け取り拒否,それ以外は「弱い失敗」で受け取るよう指定しています。ここで「1.2.3.4」は「1.2.3.0/24」に含まれますが,先に指定している「1.2.3.4」が優先されます。
例6の指定方法は,「1.2.3.0/24が自分達に割り振られているすべてのIPアドレスで,そのうち1.2.3.4をメールサーバに使用している」ということを表す場合に使えます。
「all」の指定が出現したところですべてのアドレスの評価が確定するので,allの後ろにアドレス指定を記述しても評価されません。そのためallはSPFレコードの末尾に記述します。
末尾にallなどがなく,評価が確定せずに終わった場合,評価は「ニュートラル(末尾が「?all」の場合と同義)」になるようです。

●サーバ指定で「+」など(限定子)を省略した場合の解釈
例 9:サーバ指定で「+」を省略
v=spf1 ip4:1.2.3.4 -ip4:2.3.4.5 ~all
アドレス指定及び「all」にて,先頭の「+」「-」「~」などの指定を省略した場合は「+」が指定されたものと解釈されます。例9は例2と同じ指定になります。

【アドレスを直接指定しないサーバ指定】
前項まではSPFレコードの中でIPアドレスを直接指定していましたが,本項では当該SPFレコード以外の場所で記述されたアドレスを指定する方法について説明します。

●DNSの「A」または「AAAA」レコードの内容を指定する
例 9:DNSのAまたはAAAAレコードに記述されたアドレスで判定する
v=spf1 +a -all
v=spf1 +a:example.co.jp -all
v=spf1 +a/24 -all
v=spf1 +a:example.co.jp/24 -all
・「a」
メール送信元のドメイン名からIPアドレスを正引きし,得られたIPアドレス(IPv4,IPv6共)のなかに送信元アドレスが含まれているかどうかを判定します。
・「a:example.co.jp」
引数のドメイン名でIPアドレスを正引きし,得られたIPアドレスのなかに送信元アドレスが含まれているかどうかを判定します。
・サブネットマスク指定
アドレス指定に「/プレフィックス長」を付加することで,サブネットマスクによるIPアドレスの範囲指定ができます。
※これらの指定は,A及びAAAAレコードからIPアドレスに展開するためのDNS参照が発生します。

●DNSの「mx」レコードの内容を指定する
例10:DNSのMXレコードに記述されたメールサーバアドレスで判定する
v=spf1 +mx -all
v=spf1 +mx:example.co.jp -all
v=spf1 +mx/24 -all
v=spf1 +mx:example.co.jp/24 -all
・「mx」
メール送信元ドメイン名のMXレコードをDNSで問い合わせ,取得したホスト名のIPアドレスを再度問い合わせて送信元IPアドレスと一致するものがあるかを判定します。DoS攻撃防止のため,MX問い合わせで複数のサーバ名が得られた場合は最大10件までで判定を行います。
この機構を指定する場合はDNSでMX及びAレコードが定義されている必要があります。
・「mx:example.co.jp」
指定したドメイン(example.co.jp)のMXレコードをDNSで問い合わせ,取得したホスト名のIPアドレスを再度問い合わせて送信元IPアドレスと一致するものがあるかを判定します。MX問い合わせで複数のサーバ名が得られた場合は最大10件までで判定を行います。
・サブネットマスク指定
アドレス指定に「/プレフィックス長」を付加することで,サブネットマスクによるIPアドレスの範囲指定ができます。
※これらの指定は,MXレコードからIPアドレスに展開するためのDNS参照が最大10件発生する可能性があります。

●DNSの逆引きの結果で判定する
例11:DNSでIPアドレスを逆引きできるかどうかで判定する
v=spf1 +ptr -all
v=spf1 +ptr:example.co.jp -all
・「ptr」
メール送信元のIPアドレスを逆引きして得られたホスト名に対して,正引きしてIPアドレスを取得し,得られたIPアドレスに送信元アドレスが含まれているかを判定します。DoS攻撃防止のため,逆引きで複数のサーバ名が得られた場合は最大10件までで判定を行います。
・「ptr:example.co.jp」
メール送信元のIPアドレスを逆引きして得られたホスト名に,引数のドメイン名と一致するものがあるかどうかを判定します。
※これらの指定は,ドメインからIPアドレスに展開するためのDNS参照が最大10件発生する可能性があります。

●指定したドメインの存在のみ判定する
例12:Aレコードの存在のみで判定する
v=spf1 +exists:example.co.jp -all
指定したドメインのAレコードが存在するかどうかで判定します。そのAレコードのIPアドレスの内容は参照しません。例11ではDNSでexample.co.jpのAレコードが見つかれば送信ドメインは正当なものと見なします。
この指定はマクロと組み合わせることで,メールブラックリストの問い合わせを作ることができるようです。

●別ドメインのSPF定義を参照する
例13:別ドメインのSPFを参照する
v=spf1 redirect=example.com
v=spf1 include:example.com -all
「redirect=ドメイン名」と指定すると,指定したドメインのSPFレコードに判定処理を引き継ぎます。redirectは,同一DNSサーバで複数のドメインを管理している場合に共通のSPFレコードで判定を行う使い方を想定しています。redirectはSPFの記述の最後に「all」の代わりに記述するのが一般的です。

※「redirect」と「ドメイン名」の間は「:(コロン)」ではなく「=(イコール)」でつなぎます。

「include:ドメイン名」を指定すると,指定したドメインのSPFレコードを取得し,取得したSPFレコードで送信サーバのアドレスが正当かどうかのみをチェックします。ここで正当(Pass)以外の結果のときは判定が確定しないことに注意してください。上記の例ではinclude先での判定が正当以外の結果だった場合は末尾の「-all」が最終的な判定になります。

■関連情報
SPFの解説記事
間違いから学ぶSPFレコードの正しい書き方
SPFレコード・テストサイト
NTT docomo 送信ドメイン認証について
EZwebへメール送信する際の注意事項
@IT解説記事
RFC4408(SPF)日本語訳

■関連書籍をAmazonで検索:[BIND/DNS][Mac OS X Server]
改訂新版 BIND9によるDNSサーバ構築 (エッセンシャルソフトウェアガイドブック)

にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ ネットワーク・SEへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。


ドミノ・ピザ【PC向けサイト】

| | トラックバック (0)

« 2008年10月 | トップページ | 2011年5月 »