【入門編】 メールヘッダー(Received, SPF, DKIM, DMARC)の検証と詐称対策 – サイバーセキュリティとプライバシー保護実践ガイド

こんにちは!技術メディアの主筆ライターとして、日々パケットの荒波を観測している私です。

皆さんは「ランサムウェア」という言葉を聞いて、どんな光景を思い浮かべますか? 映画のような高度なハッキングでしょうか? 実は、その恐ろしい被害の多くは、たった一通の「なりすましメール」から始まります。

今日は、ネットワークの入り口(境界線)で悪いヤツらを食い止める「メール認証の四銃士」—— Received、SPF、DKIM、そして DMARC について、郵便配達の仕組みに例えながら、一歩ずつ丁寧に紐解いていきましょう。難しい顔をせず、コーヒーでも飲みながらリラックスして読んでみてくださいね。

—

なぜメールは「なりすまし」が簡単にできてしまうのか?

まず、根本的な問題をお話しします。実は、インターネットのメールの仕組み(SMTP)は、1980年代に作られた非常に「お人好し」なプロトコルなんです。

ハガキを想像してみてください。裏面の差出人欄に「織田信長」と書けば、誰でも信長になりきって送れてしまいますよね? メールも同じです。送信者が名乗る「差出人(From)」は、実はいくらでも嘘をつけます。この「嘘」を見破るための仕組みが、今回紹介する技術たちなのです。

—

1. Received ヘッダー:パケットが歩んだ「旅の足跡」

メールが届いたら、まずはその裏側(ヘッダー情報)を見てみましょう。そこには Received という項目が並んでいます。

これは、郵便局で押される「消印」のようなものです。メールが送信者のパソコンを出て、いくつものサーバーを経由してあなたの元に届くまでの「経由地」がすべて記録されています。

Received: from mail.attacker.com (attacker.com [192.0.2.10])
          by mx.your-company.co.jp (Postfix) with ESMTPS id 12345678
          for <you@your-company.co.jp>; Wed, 25 Oct 2023 10:00:00 +0900 (JST)

この一行から、「192.0.2.10 というIPアドレスのサーバーから、うちの会社のサーバーに届いたんだな」ということが分かります。もし有名企業を名乗っているのに、全く関係ない怪しい国のサーバーを経由していたら……? そこで「おや?」と気づけるのが、プロの第一歩です。

—

2. SPF:許可された「配達員リスト」

次に登場するのが SPF (Sender Policy Framework) です。
これは、ドメイン(example.com など)の持ち主が、「うちのメールを運ぶのは、このIPアドレスのサーバー(トラック)だけですよ!」 と世界中に宣言しておく仕組みです。

現実世界で例えると?

「うちの会社からの荷物は、必ず『A運送』のトラックで届きます。それ以外は偽物です」という看板を、会社の玄関に掲げておくようなものです。

受信側のサーバーは、メールが届いたときにその看板(DNSレコード)を確認しに行きます。

SPFの設定例(DNSのTXTレコード)

# example.com の管理者が設定する内容
v=spf1 ip4:192.168.1.1 include:_spf.google.com ~all

# 解説:
# v=spf1          -> SPFのバージョン1です
# ip4:192.168.1.1 -> このIPアドレスからの送信を許可します
# include:...     -> Googleのサーバーからの送信も許可します
# ~all            -> それ以外は「たぶん偽物(SoftFail)」として扱ってください

—

3. DKIM:中身がすり替えられていない「封印シール」

SPFは「どのサーバーから来たか」をチェックしますが、メールの内容が途中で改ざんされていないかまでは分かりません。そこで登場するのが DKIM (DomainKeys Identified Mail) です。

これは、送信側がメールに「電子署名」を付与する仕組みです。

現実世界で例えると?

手紙の封筒に、送信者だけが持っている「特別な印章(シーリングワックス)」を押すようなものです。もし途中で誰かが手紙を書き換えて封を閉じ直しても、印章が壊れていれば「誰かが触ったな!」とすぐにバレてしまいます。

受信側は、送信者が公開している「検証用の鍵」を使って、その署名が正しいかを確認します。

—

4. DMARC:司令塔が下す「最終判断」

SPFとDKIMという二つの強力な武器が揃いましたが、実はこれだけでは不十分です。「認証に失敗したメールを、実際にどう処理するか(捨てるのか、迷惑メールボックスに入れるのか)」が、受信側に委ねられているからです。

そこで、ドメインの持ち主が「もし認証に失敗したら、こうしてね!」とポリシーを指定するのが DMARC (Domain-based Message Authentication, Reporting, and Conformance) です。

DMARCの設定例(DNSのTXTレコード)

# _dmarc.example.com に設定する内容
v=DMARC1; p=reject; rua=mailto:security-report@example.com

# 解説:
# v=DMARC1 -> DMARCのバージョン1です
# p=reject -> 認証に失敗したら、容赦なく「拒否(受け取らない)」してください!
# rua=...  -> 認証失敗の状況を、このメールアドレスに報告(レポート)してください

p=reject(拒否)や p=quarantine(隔離)を設定することで、ネットワークの境界線でランサムウェアの入り口となるなりすましメールを、水際でシャットアウトできるのです。

—

実践!Pythonでヘッダーを解析してみよう

インフラエンジニアとして、届いたメールのヘッダーが正しく認証されているか、プログラムでサクッと確認したい時もありますよね。簡単なサンプルコードを紹介します。

import email
from email import policy

# 解析したいメールの生データ(実際はファイルや受信データから読み込みます)
raw_email = """Delivered-To: victim@example.jp
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of boss@trusted.com designates 1.2.3.4 as permitted sender);
       dkim=pass header.i=@trusted.com;
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=trusted.com
Subject: 【至急】請求書の確認をお願いします
From: boss@trusted.com

怪しいリンクをクリックしてください...
"""

# メールオブジェクトに変換
msg = email.message_from_string(raw_email, policy=policy.default)

# 認証結果(Authentication-Results)を取り出して表示
auth_results = msg.get('Authentication-Results')

print("--- 認証結果の解析 ---")
if 'spf=pass' in auth_results:
    print("[OK] SPF認証に成功しました。送信元サーバーは正規のものです。")
if 'dkim=pass' in auth_results:
    print("[OK] DKIM署名が有効です。メール内容は改ざんされていません。")
if 'dmarc=pass' in auth_results:
    print("[OK] DMARCポリシーに合致しました。このメールは信頼できそうです。")

# もし認証が pass していない場合は、警戒レベルを最大にするロジックを組めますね!

—

おわりに:一歩ずつ、安全なネットワークへ

いかがでしたでしょうか?
SPF で「配達ルート」を、DKIM で「内容の正しさ」を、そして DMARC で「失敗時のルール」を決める。この三段構えによって、私たちのネットワークの境界線は守られています。

ランサムウェア対策と聞くと、何か特別な高価なツールが必要だと思われがちですが、まずはこうした「標準的な仕組み」を正しく理解し、設定すること。それが、最強の防御への第一歩になります。

「パケット一つひとつに、送った人の意図と、守るべき仕組みがある」

そんな風に考えると、ネットワークの世界が少しだけ愛おしく思えてきませんか? 難しい用語にぶつかっても大丈夫。またいつでもこのブログに戻ってきてください。一歩ずつ、一緒に学んでいきましょう!

それでは、今日も安全なネットワーク運用を!

コメント

タイトルとURLをコピーしました