境界防御は死んだ:DHCPとARPが織りなす「LAN内の悪夢」を解剖する
ゼロトラストアーキテクチャが叫ばれて久しいが、依然として多くの現場で「社内LANは安全」という神話がゾンビのように生き残っている。だが、少しばかりネットワークの深淵を覗けば、そんな幻想は一瞬で崩れ去る。
今日は、最も基本的なレイヤー2、レイヤー3のプロトコルである DHCP と ARP が、いかにして現代のランサムウェアの侵入経路となり、内部ネットワークを「死の回廊」へと変貌させるか。そして、パケットを極限までチューニングしつつ、どう防御を敷くかについて語ろう。
1. 偽りのゲートウェイ:DHCPスプーフィングの残虐性
攻撃者は、ネットワークの末端で UDP ポート 67 (Server) と 68 (Client) を悪用する。不正な DHCP サーバーをネットワーク内に紛れ込ませるだけで、攻撃者はクライアントのデフォルトゲートウェイを自身の端末へ書き換え、すべてのトラフィックを傍受できる「Man-in-the-Middle (MitM)」の足掛かりを掴む。
この挙動をパケットレベルで見ると、非常に残酷だ。正当な DHCP OFFER が届くよりわずか数ミリ秒早く、攻撃者が偽の OFFER を流し込む「レースコンディション」を仕掛けてくる。端末がこの偽の情報を ACK すると、エンドポイントは自ら進んで攻撃者の檻の中へ飛び込むことになる。
パフォーマンスとセキュリティのジレンマ
ここで重要なのは、TLS ハンドシェイクの最適化だ。本来、MitM攻撃を検知するために TLS の証明書検証は不可欠だが、ネットワークの遅延が激しい環境では TLS 1.3 の 0-RTT (Zero Round Trip Time) を活用したくなる。しかし、0-RTT はリプレイ攻撃のリスクを孕む。インフラエンジニアとしては、セッションの RTT 削減とセキュリティ強度のバランスを、カーネルレベルの TCP バッファチューニングで補完しなければならない。
2. ARPスプーフィング:レイヤー2の裏切り
DHCP でゲートウェイを奪取した後、攻撃者は ARP スプーフィング(キャッシュポイズニング)を仕掛ける。ARP は信頼性ゼロのプロトコルだ。要求していない ARP Reply を受け取っても、多くのエンドホストは疑問を持たずに ARP テーブルを更新してしまう。
結果、通信は攻撃者の NIC を経由する。ここで攻撃者は SSL Stripping を行い、HTTPS を HTTP に強制ダウングレードさせ、認証情報を平文で抜き取る。
3. 現場で打てる「最強の防壁」:防御の処方箋
「パケットが嘘をつく」という前提でネットワークを設計せよ。以下の対策は、プロフェッショナルであれば常識として備えておくべきだ。
DHCP Snooping と Dynamic ARP Inspection (DAI)
スイッチレベルで DHCP Snooping を有効化し、信頼できるポート以外からの DHCP OFFER を遮断する。また、DAI を併用することで、ARP パケットと DHCP Snooping のバインディングデータベースを突き合わせ、不正な ARP パケットをドロップさせる。
Cisco系スイッチでの設定例を記しておく。
# DHCP Snoopingを有効化
ip dhcp snooping
# 特定のVLANで有効化
ip dhcp snooping vlan 10
# アップリンクポートを信頼(信頼できないポートからのOFFERは破棄される)
interface GigabitEthernet0/1
ip dhcp snooping trust
# DAIの設定(ARPの整合性チェック)
ip arp inspection vlan 10
Linuxカーネルによる保護
エンドポイント側での防御も怠るな。Linuxサーバーであれば、sysctl で ARP の挙動を厳格化できる。
# /etc/sysctl.conf に追記し、ARPの応答を制限する
# 自身のIP宛でないARPリクエストへの応答を抑制する
net.ipv4.conf.all.arp_ignore = 1
# 受信したARPの送信元IPが、受信インターフェースのIP範囲内であるか検証する
net.ipv4.conf.all.arp_filter = 1
4. 極限のパフォーマンスチューニング:パケットロスを殺す
セキュリティ対策を施すと、パケット検査のオーバーヘッドでスループットが落ちることがある。これを防ぐには TCP バッファのチューニングが欠かせない。
# 高速なネットワーク環境でのバッファ拡大例
# 送信・受信バッファの最大値を16MBに設定
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCPウィンドウ拡大オプションの有効化(RTTが長い通信の効率化)
net.ipv4.tcp_window_scaling = 1
最後に:ネットワークを信じるな
DHCPやARPといったプロトコルは、インターネットの黎明期における「お互いを信頼する」という性善説に基づいて設計されている。しかし、今の戦場は違う。
ARP テーブルを常に監視し、不自然な MAC アドレスの遷移を SIEM でアラートとして飛ばす。あるいは、Micro-segmentation を徹底し、LAN内であっても L3 での認証なしには通信できない環境を作る。
結局のところ、ネットワークセキュリティにおいて「設定して終わり」という日は来ない。パケットが流れるその瞬間まで、我々エンジニアはプロトコルの挙動を疑い、最適化し続けなければならない。それが、プロフェッショナルというものだ。
コメント