Sun Java System Messaging Server 6.3 管理ガイド

第 15 章 Sender Policy Framework を使用して偽造電子メールを処理する

スパム作成者や電子メール詐欺犯は、多くの場合、不正なドメイン名や電子メールアドレスを使用するか、または適正なドメイン名や電子メールアドレスを使用して、知っている人物や会社からメッセージが届いたと思い込ませることにより、電子メールを偽造します。たとえば、スパム発信者は president@whitehouse.gov のようなアドレスから電子メールを送信し、それを受信したユーザーは本当にそのアドレスからメールが届いたと思い込む可能性があります。電子メールを偽造することで、ユーザーに迷惑メッセージを開かせたり、虚偽の公共機関に情報を提供させることができます。また、スパム発信者は、RBL のリストに登録されていない適正なドメインから電子メールを送信することを好みます。

Sender Policy Framework (SPF) は、SMTP 対話処理中に、偽造電子メールを検出して拒絶する技術です。SPF は具体的には、ホストがそのドメイン名を使用できることを、ドメインがホストに対して明示的に認可できるようにするプロトコルです。加えて、この認可をチェックするように受信側ホストを設定することができます。SPF ではこのようなしくみにより、偽造電子メールの数を大幅に減らすことができます。

15.1 動作原理

Messaging Server からメッセージが届くと、MTA は SPF クエリーを実行して、そのアドレスが本当にそのアドレス上のドメインに由来するものかどうかを判定します。SPF クエリーは、メッセージのドメイン (domain) に属する TXT レコードを DNS に問い合わせます。domain は、HELO または EHLO (spfhelo チャネルキーワードが使用された場合) の引数として指定されたドメイン名か、MAIL FROM: コマンドで指定されたオリジネータのアドレス内のドメイン名(通常は @ 文字のあとの部分) のいずれかです。ドメイン名が指定されていないか、使用できない場合は、HELO/EHLO で指定されたドメインが domain として使用されます。ほとんどの ISP は、自社のドメインに一致する IP アドレスの公式リストを配布しています。IP アドレスがドメイン名に一致しない場合、そのメッセージは偽造されたとみなされます。


注 –

DNS に問い合わせる前に、SPF_LOCAL マッピングテーブルに一致するドメインがあるかどうかを確認します。一致するドメインがある場合は、それが最初に使用されます。


マッピングテーブルで見つかったレコードに redirect=domain 節が含まれている場合は、ドメインへのリダイレクションが DNS クエリーとして実行され、マッピングファイルの冗長な再帰的チェックが行われなくなります。

取得される TXT レコードの例を次に示します。

v=spf1 +mx a:colo.siroe.com/28 -all

v=spf1 トークンは、この RFC によってサポートされる SPF レコードに必ず指定されます。

+mx は、MX レコードから domain を検索し、この SMTP 接続のソース IP アドレスが domain に関する MX クエリーの結果として得られたいずれかの IP アドレスに一致するかどうかを確認するように指示しています。+ は、一致した場合にこの結果が Pass になることを意味します。

a:colo.siroe.com/28 は、A レコードから colo.siroe.com を検索し、この SMTP 接続のソース IP アドレスが A レコードで指定されたのと同じ CIDR サブネット内にあるかどうかを (255.255.255.240 でマスクした) 28 ビットのみを比較することによって確認するように指示しています。修飾子文字が指定されていないので、一致した場合は結果が Pass になることを意味するデフォルトの + が使用されます。

最後の -all はほかのすべてに一致し、その結果は Fail になります。SPF レコードの詳細については、RFC 4408 (http://www.ietf.org/rfc/rfc4408.txt) を参照してください。

SPF 処理の結果には、いくつかの種類があります。次の表に、処理の結果とその説明を示します。

表 15–1 SPF 処理の結果

結果 

説明 

Pass

検索が成功しました。つまり、SPF レコードが見つかり、そのレコードによって、発信元のシステムが domain の使用を認可されていることが検証されました。

Fail

検索で一致する SPF レコードが見つかりましたが、そのレコードによって、SMTP クライアントに対する SMTP トランザクション中の domain の使用の認可が明示的に拒否されました。Sun の SPF 実装のデフォルト動作では、5xx 応答によって SMTP コマンドを拒否します。

SoftFail

検索で一致する SPF レコードが見つかり、そのレコードによって、SMTP クライアントに対する domain の使用の認可も拒否されましたが、この拒否は厳密なものではなく、そのレコードは完全な失敗を指示していません。Sun の実装のデフォルト動作では、メッセージを受け入れますが、Sieve 処理中などのその後の評価では、Received-SPF: ヘッダー内の SoftFailに注意してください。

Neutral

SPF レコードは、SMTP クライアントによる domain の使用の認可に関して何も要求していません。メッセージは受け入れられます。仕様では、Neutral を次の None と同じように処理することが要求されています。

None

一致する SPF レコードが見つからなかったため、SPF 処理は実行されませんでした。 

PermError

SPF 処理中に恒常的エラーが発生しました。たとえば、SPF レコードに構文エラーがあった場合や、(include: 機構や redirect= 修飾子による) 入れ子の SPF レコードを処理中に DNS 障害が発生した場合や、入れ子の SPF レコードを処理中に SPF 処理に関する制限値を超えた場合などです。デフォルトの動作では、5xx 応答によって SMTP コマンドを拒否します。

TempError

SPF 処理中に一時的エラーが発生しました。これは、ほとんどの場合、SPF レコード照会時の DNS タイムアウトが原因です。デフォルトの動作では、4xx 応答によって SMTP コマンドを拒否します。 

SPF 処理の完了後、SPF 処理の結果をドキュメント化するメッセージに Received-SPF: ヘッダーが書き込まれます。このヘッダーは、その後の検討における Sieve 処理の中で照会できます。option.dat ファイルの MTA オプション MM_DEBUG が有効 (>0) になっている場合は、拡張デバッグが利用可能です。

15.2 制限

SPF は、スパムに対抗するためのツールの 1 つにすぎず、必ずしもすべての問題を解決するわけではありません。スパム発信者にとって、ドメインを作成し、そのドメインを適正なものに見せかける SPF TXT レコードを追加することはきわめて簡単です。一方、SPF は既存の ISP から送信された偽造電子メールを検出するのに非常に効果的ですが、多くの TXT レコードでは SPF の処理結果が Fail になりません。

15.3 配備前の考慮事項

あらゆるメッセージに対して DNS クエリーが必要になるため、非常に高速な DNS サーバーをシステムに設置することが重要です。

15.4 テクノロジの設定

SPF テクノロジを設定するための手順は、次の 2 つです。

15.5 参照情報

この節では、SPF チャネルキーワードと SPF MTA オプションに関する参照情報を示します。SPF サポートは、受信 tcp_* チャネル (一般には tcp_local) に適用される 4 つのチャネルキーワードによって実装されます。次の表に、キーワードとその説明を示します。

表 15–2 SPF キーワード

キーワード 

説明 

spfnone

SPF 処理を無効にします。 

spfhelo

HELO または EHLO への引数として指定されたドメイン名に関して、SPF 処理を有効にします。 

spfmailfrom

MAIL FROM: の受信後にオリジネータのエンベロープアドレスとして指定されたドメイン名に関して、SPF 処理を有効にします。 

spfrcptto

RCPT TO: の受信後にオリジネータのエンベロープアドレスとして指定されたドメイン名に関して、SPF 処理を有効にします。spfmailfrom と同じ処理ですが、RCPT TO: コマンドが発行され、宛先が有効な宛先であることが別の方法で確認されるまで、SMTP トランザクション内で処理が保留されます。


注 –

spfmailfromspfrcptto は競合するキーワードなので、これら 2 つのキーワードのうち、いずれか一方のみをチャネルに指定するようにしてください。ただし、spfmailfromspfrcptto のいずれかを spfhelo と組み合わせて使用することにより、両方の種類の SPF チェックを実行できます。


追加サポートにより、SPF 処理に関する制限値を設定し、FailSoftFailPermErrorTempError などの SPF の各種処理結果に関して、SMTP コマンドを受け入れるか、4xx 応答を伴うエラー (一時的エラー) にするか、5xx 応答を伴うエラー (恒常的エラー) にするかを制御できます。

option.dat 内の次の MTA オプションを使用して、SPF 処理に関する制限値を設定できます。

表 15–3 SPF 制限オプション

オプション 

説明 

SPF_MAX_RECURSION

include: または redirect= による SPF レコードの入れ子の許容反復回数を指定します。この制限値を超えた場合の処理結果は、PermError になります。

デフォルト: 10 (RFC による規定) 

SPF_MAX_DNS_QUERIES

DNS 検索を必要とする機構または修飾子 (include:a:mx:ptr:exists:redirect=exp= を含む) の数を指定します。この制限値は実際の DNS 検索の数をカウントするものではないため、1 つの機構によって複数の DNS クエリーが発生する可能性もあります。この制限値を超えた場合の処理結果は、PermError になります。

デフォルト: 10 (RFC による規定) 

SPF_MAX_TIME

SPF 処理が完了するまでの許容時間 (秒数) を指定します。この値を超えた場合の処理結果は、TempError になります。デフォルト値は、RFC の規定より大きくなっています。

デフォルト: 45 

さらに、option.dat 内の次の MTA オプションを設定することにより、SPF の処理結果 FailSoftFailPermError、および TempError に対する SMTP サーバーの動作を制御できます。これらの処理結果のそれぞれに対して、SMTP サーバーは 2xx (成功)、4xx (一時的エラー)、または 5xx (恒常的エラー) の応答を返信できます。また、FailSoftFail に関して、MTA は「all」機構の結果として得られた SPF 処理結果とそれ以外の方法で明示的に参照された一致を区別できます。これにより、ユーザーは特定の結果と SPF レコードのデフォルトの結果を見分けることができます。これらのオプションの有効な値は 2、4、または 5 です。2、4、または 5 という値は、特定の SPF ステータスを取得した結果として SMTP サーバーから受信される 2xx、4xx、または 5xx の応答に対応しています。したがって、たとえば、SPF_SMTP_STATUS_FAIL=2 で、SPF レコードが「-a:192.168.1.44」(ユーザーの IP アドレス) で明示的にメールをブロックしている場合は、5xx 応答ではなく、「250 OK」でこのアドレスが受け入れられます。

表 15–4 SPF の失敗およびエラーのオプション

オプション 

説明 

SPF_SMTP_STATUS_FAIL

SPF レコードの一致が「-all」以外の「-」付きの機構である場合に使用されます。 

デフォルト: 5 

SPF_SMTP_STATUS_FAIL_ALL

一致した機構が「-all」である場合に使用されます。 

デフォルト: 5 

SPF_SMTP_STATUS_SOFTFAIL

SPF レコードの一致が「~all」以外の「~」付きの機構である場合に使用されます。 

デフォルト: 2 

SPF_SMTP_STATUS_SOFTFAIL_ALL

一致した機構が「~all」である場合に使用されます。 

デフォルト: 2 

SPF_SMTP_STATUS_TEMPERROR

一時的エラー (通常は DNS 処理の問題に関連するもの) が発生した場合に使用されます。 

デフォルト: 4 

SPF_SMTP_STATUS_PERMERROR

恒常的エラー (通常は、SPF 処理中に見つかった構文エラーやその他の技術上のエラーによるもの) が発生した場合に使用されます。これは、ローカル以外のエラーが原因で発生します。 

デフォルト: 5 

15.6 spfquery を使用した SPF のテスト

このテストユーティリティーを使用して、SPF 処理をテストできます。


注 –

spfquery は、SPF の設定をテストするものではありません。SPF 処理を有効にした場合に返される可能性がある結果をテストするものです。


要件: Messaging Server のバイナリを実行し、そのライブラリにアクセスするためのアクセス権を持っているユーザーとして実行する必要があります。

場所: msg-svr-base/sbin/

15.6.1 構文


spfquery [-i ip-address] [-s sender-email] [-h helo-domain]
  [-e none | neutral | pass | fail | temperror | permerror] [-v] [-V] [?] domain

次の表に、spfquery のオプションとその説明を示します。

表 15–5 spfquery のオプション

オプション 

説明 

-i ip address

SPF クエリーのリモートアドレスとして使用する IP アドレスを指定します。デフォルトは 127.0.0.1 です。このオプションは、--ip-address と表記することもできます。

-s domain

MAIL FROM: として指定されたとみなして使用する電子メールアドレスです。デフォルトはpostmaster@domain です。このオプションは、--sender と表記することもできます。

-h helo-domain

HELO ドメインとして指定されたとみなすドメイン名です。このドメインは、それ自体は検証されませんが、マクロ処理の補足的情報として提供されます。デフォルト値は、domain に指定された値と同じになります。このオプションは、--helo-domain と表記することもできます。

-e result

spfquery は、SPF 処理の結果を予想される結果と比較します。結果が予想と異なる場合は、メッセージが出力され、0 以外の復帰状態とともに spfquery が終了します。処理結果は、noneneutral、passfailsoftfailtemperrorpermerror のいずれかになります。このオプションは、--expect と表記することもできます。

-v

SPF 処理中の冗長出力を有効にします。このオプションは、--verbose と表記することもできます。

-V

SPF ライブラリの現在のバージョンを出力します。このオプションは、--version と表記することもできます。


-?

ここに示した使用方法についての情報を表示します。このオプションは、--help と表記することもできます。

15.6.2 デバッグを有効にした例


# /opt/SUNWmsgsr/sbin/spfquery -v -i 192.168.1.3 11.spf1-test.siroe.com
    Running SPF query with:
      IP address: 192.168.1.3
          Domain: 11.spf1-test.siroe.com
          Sender: postmaster@11.spf1-test.siroe.com (local-part: postmaster)
     HELO Domain: 11.spf1-test.siroe.com

    15:30:04.33: ----------------------------------------------------------------
    15:30:04.33: SPFcheck_host called:
    15:30:04.33:       source ip = 192.168.1.3
    15:30:04.33:          domain = 11.spf1-test.siroe.com
    15:30:04.33:          sender = postmaster@11.spf1-test.siroe.com
    15:30:04.33:      local_part = postmaster
    15:30:04.33:     helo_domain = 11.spf1-test.siroe.com
    15:30:04.33:
    15:30:04.33:   Looking up "v=spf1" records for 11.spf1-test.siroe.com
    15:30:04.35:     DNS query status: Pass
    15:30:04.35:       "v=spf1 mx:spf1-test.siroe.com                  -all"
    15:30:04.35:
    15:30:04.35:   Parsing mechanism: " mx : spf1-test.siroe.com"
    15:30:04.35:     Assuming a Pass prefix
    15:30:04.35:     Processing macros in spf1-test.siroe.com
    15:30:04.35:     Comparing against 192.168.1.3
    15:30:04.35:     Looking for MX records for spf1-test.siroe.com
    15:30:04.41:       mx02.spf1-test.siroe.com:
    15:30:04.41:         192.0.2.22 - No match
    15:30:04.41:         192.0.2.21 - No match
    15:30:04.41:         192.0.2.20 - No match
    15:30:04.41:         192.0.2.23 - No match
    15:30:04.41:       mx01.spf1-test.siroe.com:
    15:30:04.42:         192.0.2.13 - No match
    15:30:04.42:         192.0.2.11 - No match
    15:30:04.42:         192.0.2.12 - No match
    15:30:04.42:         192.0.2.10 - No match
    15:30:04.42:       mx03.spf1-test.siroe.com:
    15:30:04.42:         192.0.2.32 - No match
    15:30:04.42:         192.0.2.30 - No match
    15:30:04.42:         192.0.2.31 - No match
    15:30:04.42:         192.168.1.3 - Matched
    15:30:04.42:   Mechanism matched; returning Pass
    15:30:04.42:
    15:30:04.42:   Parsing mechanism: "- all : " (not evaluated)
    15:30:04.42:
    15:30:04.42: SPFcheck_host is returning Pass
    15:30:04.42: ----------------------------------------------------------------