RDPを「野晒し」にする罪――TCP 3389を巡る戦場と、ゼロトラスト時代の境界防衛術
「インターネットにRDPを公開している」。この言葉を聞くと、セキュリティエンジニアの背筋には冷たいものが走る。TCP 3389番ポートは、攻撃者にとっての「黄金の入り口」であり、スキャンツールが絶え間なくノックを繰り返す騒々しい玄関先だ。
今回は、ステートフルインスペクションの限界を突き詰め、RDPセッションの確立プロセスにおけるパケットの挙動を解剖しつつ、いかにしてこの脆弱なプロトコルを堅牢な要塞へと変貌させるか、その設計思想を紐解いていく。
—
1. パケットの深淵:RDPセッション確立の脆弱性
RDP(Remote Desktop Protocol)のセッション確立は、単なるTCPコネクションではない。まずは SYN を送り、SYN-ACK を受け、ACK を返す3ウェイ・ハンドシェイクが成立する。しかし、そこからが本番だ。
X.224 プロトコルによるコネクション要求が続き、TS_UD_CS_CORE(クライアントコアデータ)を含むネゴシエーションが始まる。この段階で、攻撃者は「ブルートフォース」や「BlueKeep」のような脆弱性攻撃を仕掛けてくる。
ステートフル・インスペクション型FWは、このパケットの順序を追跡し、シーケンス番号の整合性を確認する。しかし、現代の高度な脅威は、接続試行自体を断片化したり、極めて低速なハンドシェイク(Slow-rate attack)を仕掛けてFWのリソース(接続テーブル)を枯渇させようとする。
2. ネットワーク層における「門番」の最適化
インフラアーキテクトとして、我々がまず取り組むべきは「ノイズ」の遮断だ。無差別なスキャンをステートフルFWで受けるのは、リソースの無駄遣いである。
Linuxカーネルレベルでの防御:TCP SYN Cookieと制限
FWの前面に配置する境界ルータやゲートウェイのLinuxカーネルで、以下のチューニングを行うことは必須だ。
# SYN Flood攻撃に対する防御:SYN Cookiesを有効化
sysctl -w net.ipv4.tcp_syncookies=1
# TCP接続のタイムアウトを短縮し、不完全なセッションを早期解放
sysctl -w net.ipv4.tcp_fin_timeout=15
# バックログキューのサイズを拡大し、急激な接続増に対応
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
これらの設定は、OSがパケットを処理する前の「クッション」となる。しかし、真の解決策はパケットを「届かせない」ことにある。
3. RTT短縮とTLSハンドシェイクの「美学」
RDPの体感速度(Latency)を決定づけるのは、TLS ハンドシェイクの往復回数だ。セッションのセキュリティを高めつつ、RTTを削るには TLS 1.3 への強制移行が不可欠である。
RDPにおける NLA(Network Level Authentication)は、接続前に認証を要求する強力な防御策だが、暗号化オーバーヘッドを伴う。ここで、ネットワーク側で TCP Fast Open (TFO) を有効にすることで、ハンドシェイクのRTTを1つ削減できる。
# TCP Fast Openを有効化し、ハンドシェイクのオーバーヘッドを削減
sysctl -w net.ipv4.tcp_fastopen=3
これにより、初回のデータ転送(SYN パケットと共にデータを送る)が可能になり、クライアント側のRDPユーザーは、クリックした瞬間の「重さ」を感じることなく安全なトンネルへ到達できる。
4. ゼロトラストの鉄則:境界を「消し去る」
どれほどチューニングを重ねようとも、インターネットに 3389 を直接晒している時点で「負け」である。RDPポートを閉塞し、以下の設計へ移行することこそが、2024年のセキュリティスペシャリストの解答だ。
推奨構成:Identity-Aware Proxy (IAP) の導入
1. ポート完全閉塞: FWで 3389 への外部からのアクセスを DROP(REJECT ではなく DROP することで、ポートスキャン側に「生きているか不明」という情報を与える)。
2. トンネリング: ユーザーは HTTPS (443) 経由でプロキシに認証し、裏側で RDP へ接続させる。
3. セッション可視化: どのIPが、いつ、誰のアカウントでログインを試みたかを詳細なログとして収集する。
iptables/nftablesによる防衛のコード例
もしFW構築が必要であれば、以下のように「接続頻度」で動的に弾く設計を推奨する。
# 1分間に3回以上の接続試行があるIPをブラックリスト化
nft add set inet filter blacklist { type ipv4_addr; flags timeout; }
nft add rule inet filter input tcp dport 3389 \
set add ip saddr @blacklist timeout 1h \
update @blacklist { ip saddr } counter drop
結びに:泥臭い検証の先に
ネットワークの最適化とセキュリティは、しばしばトレードオフの関係にある。しかし、パケットの挙動を理解し、カーネルのバッファからアプリケーション層のTLSプロトコルまでを一気通貫で設計できれば、それは「堅牢かつ高速」という理想的なアーキテクチャへと昇華する。
教科書的なファイアウォール設定で満足せず、パケットがデバイス間を駆け抜けるその瞬間の「重み」を想像してほしい。あなたのネットワークが、攻撃者にとって「攻略困難な迷路」となることを願っている。
コメント