RDPの「3389」をインターネットに晒すという愚行――ゼロトラスト時代の境界防御とランサムウェア対策
深夜2時、電話が鳴る。画面の向こうで真っ赤に染まったサーバー群。ランサムウェアの身代金要求メッセージ。エンジニア人生で最も見たくない光景の一つだ。そのインシデントの火種が、往々にして「インターネットに直結されたTCP/3389(RDP)」にあることを、君たちは知っているだろうか?
今日は、教科書的な「RDPは危険です」という警告を超えて、なぜそれが攻撃者の入り口になり、現場のエンジニアとしてどう防壁を構築すべきか、その「泥臭い現実」を語ろうと思う。
—
1. なぜRDPは「ランサムウェアの正面玄関」なのか
攻撃者は、世界中に散らばる脆弱なポートをスキャンしている。TCP/3389 は、彼らにとっての「開けっ放しの金庫」だ。
RDPの通信フローは、まず TCP 3ウェイ・ハンドシェイクから始まる。その後、RDP Security Layer と TLS によるネゴシエーションが行われる。ここで、NLA (Network Level Authentication) が無効な場合、攻撃者は「認証画面」まで辿り着くことができてしまう。
この「認証画面」こそが脆弱性だ。IDとパスワードの組み合わせを何万回と試す「ブルートフォース攻撃」や、流出した認証情報を使った「パスワードスプレー」を仕掛けられれば、防壁の薄いサーバーはあっけなく陥落する。一度ログインを許せば、そこは攻撃者の遊び場。権限昇格、横展開(ラテラルムーブメント)、そしてデータの暗号化まで、わずか数時間しかかからない。
—
2. 物理的な境界から論理的な境界へ:NLAの強制
まずは、OSレベルで最も基本的な防御策を講じる。それが NLA だ。
NLA は、ユーザーがRDPセッションを確立する「前」に、認証を要求する仕組みだ。これにより、攻撃者は認証完了前にセッションリソースを消費させられるリスクから解放され、より強固な防御が可能になる。
Windows Serverであれば、以下の設定が必須だ。
# NLAを有効にするためのレジストリ操作
# UserAuthenticationを1に設定することでNLAを強制する
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1
※手動で行う場合は、「システムのプロパティ」→「リモート」タブから「ネットワークレベル認証でリモートデスクトップを実行しているコンピューターからのみ接続を許可する」にチェックを入れる。これだけで、スキャナーの多くは認証に至る前に接続を断念する。
—
3. 「インターネット直結」を卒業する:ゼロトラストの鉄則
しかし、NLA だけでは「パスワード強度」という人間の弱点に依存することになる。真の防御策は、RDPポートをインターネットから物理的に遮断することだ。
現場で推奨されるのは、VPNの利用、あるいは RD Gateway を経由したアクセスだが、現代の最適解は「ゼロトラスト・アクセス・プロキシ」だ。
Pythonによる接続確認(診断用スクリプト)
もし君たちが「今、自分の環境が公開されているか?」を確認したいなら、外部からポートの状態を叩くシンプルなスクリプトを書いてみるといい。
import socket
def check_rdp_port(ip, port=3389):
"""
指定したIPのポートが開いているかを確認する簡易チェッカー
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)
result = sock.connect_ex((ip, port))
if result == 0:
print(f"[!] 警告: ポート {port} は開いています。直ちに閉鎖を検討してください。")
else:
print(f"[+] 安全: ポート {port} は閉じているか、フィルタリングされています。")
sock.close()
# 実際の運用では自分のグローバルIPに向けて実行する
check_rdp_port("203.0.113.1")
—
4. 多要素認証(MFA)をRDPに組み込む
VPNを導入できない小規模環境や、どうしてもリモート接続が必要な場合は、DUO や Microsoft Entra ID Application Proxy を活用して、RDP接続に MFA を強制する設計が必須だ。
特に Microsoft Entra ID と連携した Conditional Access を活用すれば、以下のようなポリシーが構築できる。
1. 場所の制限: 許可されたIPレンジからのみ接続を許可。
2. デバイスの健全性: セキュリティパッチが当たったIntune管理デバイスからのみ接続を許可。
3. MFAの強制: 接続時にスマホアプリでの承認を要求。
これらを組み合わせることで、万が一パスワードが漏洩しても、攻撃者が最終的なデスクトップ画面を拝むことは不可能になる。
—
5. 最後に:現場のエンジニアへ
僕がトラブルシューティングの現場で痛感するのは、「設定一つで防げた悲劇」の多さだ。3389 を開けることは、鍵のかかっていない玄関を大通りに面して設置するのと同じ。
- 鉄則1: インターネットから
3389への直接到達を禁止する。 - 鉄則2: VPNまたはゼロトラストプロキシを必ず挟む。
- 鉄則3:
NLAを有効にし、強固なパスワードとMFAを組み合わせる。
ネットワークセキュリティは、完璧な壁を作ることではなく、攻撃者のコストを跳ね上げさせ、彼らに「ここを狙うのは割に合わない」と思わせるゲームだ。君たちの守るインフラが、ランサムウェアの餌食にならないことを心から祈っている。
何かあれば、ログを見ろ。パケットは嘘をつかない。それが、凄腕への第一歩だ。
コメント