AD防御の最前線:6ヶ月間にわたる要塞化プロジェクトから得た教訓
私は最近、12年間運用されてきたレガシーなActive Directory(AD)環境を再構築する半年間のプロジェクトを完了しました。正直なところ、そこはラテラルムーブメント(横展開)の「食べ放題」状態でした。
多くの企業環境と同様に、10年以上にわたって無秩序に拡張され、過剰な権限を持つサービスアカウントや古いNTLMハッシュが放置されていました。私の使命は、基本的なアンチウイルスを超えた対策を講じることでした。具体的には、Pass-the-Hash、Kerberoasting、そして壊滅的な被害をもたらすGolden Ticketという3つの主要な攻撃を無効化する防御戦略が必要でした。
この混乱を乗り切るには、設定ファイルに触れる前に可視化が必要でした。また、ネットワーク計画のための信頼性が高く軽量なユーティリティも必要でした。例えば、特権管理者用ワークステーション(PAW)を分離する際、https://toolcraft.app/ja/tools/developer/ip-subnet-calculator のサブネット計算機を使用しました。これはクライアント側でCIDR計算を行うため、コアインフラの詳細を扱う際に私が重視する「プライバシー優先」のワークフローに合致しています。
敵を知る:攻撃手法の定義
防御はエクスプロイトを理解することから始まります。Pass-the-Hash (PtH)は、WindowsのNTLM処理を悪用するものです。攻撃者はパスワードを必要とせず、LSASSメモリ空間に存在するハッシュさえあれば十分です。
Kerberoastingは、サービスチケット(TGS)を要求してオフラインで解析(クラッキング)することでサービスアカウントを標的にします。ほとんど痕跡を残さないため、攻撃者に好まれる手法です。そして、Golden Ticket攻撃は、攻撃者がKRBTGTアカウントのハッシュを盗み出した場合に発生します。これは「チェックメイト」を意味します。攻撃者はチケットを偽造し、意のままにドメイン管理権限を自分自身に付与できてしまいます。
導入:アタックサーフェスのマッピング
可視化がすべてです。経路が見えなければ、それを遮断することはできません。私は、グラフ理論を用いて隠れた関係性を暴き出すオープンソースツール、BloodHoundを採用しました。内部的には、SharpHoundインジェスターからデータを取り込み、Neo4jデータベースとReactベースのUIで動作します。
LinuxでBloodHoundを起動する
私は専用のセキュリティワークステーションでBloodHoundインターフェースを実行しています。依存関係の競合(いわゆる依存関係地獄)を避けつつ、データベースとアプリの同期を保つには、Dockerを使用するのが最も確実な方法です。
# BloodHound環境を取得して準備する
git clone https://github.com/BloodHoundAD/BloodHound.git
cd BloodHound/Collectors
# Docker Composeを使用してスタックを起動する
docker-compose up -d
コンテナが起動すると、ダッシュボードは localhost:8080 でアクセス可能になります。データを供給するために、標準的な非特権ユーザーアカウントから SharpHound.exe を実行しました。これにより監査データが可視化され、ドメイン全体のグループメンバーシップやアクティブなセッションがマッピングされます。
# 標準のPowerShellプロンプトからコレクターを実行する
.\SharpHound.exe -c All --zipfilename MyDomainAudit.zip
設定:窓を閉める(脆弱性の封鎖)
最初の監査は衝撃的でした。ヘルプデスクのインターンのアカウントが1つ乗っ取りられるだけで、わずか3ホップでドメイン管理者にまで到達できることが判明したのです。私はこれらの経路を遮断するため、多層的なロックダウンを実施しました。
1. LSA保護によるPass-the-Hashの無効化
PtHを阻止する最善の方法は、Mimikatzのようなツールで見つけられる場所に認証情報がキャッシュされないようにすることです。グループポリシーを通じて、LSA保護とCredential Guardを強制適用しました。これにより、LSASSプロセスが保護されたコンテナ内で実行されるようになります。
GPOエディターを開き、以下に移動します:
コンピューターの構成 > 管理用テンプレート > システム > ローカル セキュリティ機関
LSA を保護されたプロセスとして実行するように構成する を 有効 に設定します。
2. Kerberoastingの封じ込め
Kerberoastingは弱いパスワードを餌にします。私はサービスプリンシパル名(SPN)を持つすべてのアカウントを特定し、パスワードの強制ローテーションを開始しました。これらのアカウントには、toolcraft.app/ja/tools/security/password-generator を使用して生成した32文字の文字列を割り当てました。ブラウザ内で完結して動作するため、機密性の高い文字列がネットワークに流れることはありません。高いエントロピーこそが、ここでの唯一の確実な防御策です。
# Kerberoastingに対して脆弱なすべてのアカウントを検索する
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
3. 王国の鍵(特権アカウント)の保護
Golden Ticketを完全に無効化する唯一の方法は、KRBTGTアカウントを保護することです。私は180日ごとに2回、KRBTGTのパスワードをローテーションするスクリプトを作成しました。これによりNTLM履歴が消去され、出回っている偽造チケットが無効化されます。また、すべてのドメイン管理者を Protected Users グループに移動しました。このシンプルな対策により、対象アカウントのNTLMが禁止され、KerberosのAES暗号化が強制されます。
監視:光を灯す(検知体制の確立)
要塞化は現状を守りますが、監視は未来を守ります。GPOで見逃される可能性のある動きを捉えるため、ドメイン全体に Sysmon を導入しました。Sysmonは、標準のWindowsログでは無視されてしまう詳細なデータを提供してくれます。
認証情報へのアクセスをリアルタイムで捕捉する
私は、特に lsass.exe をターゲットにしたイベントID 10(ProcessAccess)を監視するためにSysmonフィルターを使用しています。これは、ハッシュダンプの試行を示す決定的な証拠となります。
<!-- LSASSへの改ざんを検出するためのSysmonフィルター -->
<QueryList>
<Query Id="0" Path="Microsoft-Windows-Sysmon/Operational">
<Select Path="Microsoft-Windows-Sysmon/Operational">
*[System[(EventID=10)]] and *[EventData[Data[@Name='TargetImage']='C:\Windows\system32\lsass.exe']]
</Select>
</Query>
</QueryList>
Kerberoastingについては、イベントID 4769に注目してください。失敗コードが 0x0 で暗号化タイプが 0x17 (RC4) の場合、誰かがサービスチケットをクラッキングしようとしている可能性があります。現代的な環境ではAES (0x12) を使用すべきであり、RC4の使用は重大な警告サインです。
これらのログを分析(トリアージ)する際、ハッシュが既知の不正サンプルと一致するか確認する必要がよくあります。チェックサムを素早く確認するために、https://toolcraft.app/ja/tools/developer/hash-generator のハッシュジェネレーターを開いたままにしています。本番サーバーでCLIユーティリティを起動するよりも高速です。
結論
6ヶ月が経過し、私たちのBloodHoundグラフはクリーンになりました。ドメイン管理者への容易な「近道」は姿を消しました。Active Directoryのセキュリティは「一度設定すれば終わり」というものではありません。ラテラルムーブメントが検知されずに成功することが不可能になるまで、アタックサーフェスを縮小し続けるプロセスなのです。もしあなたの環境の KRBTGT パスワードが半年以上更新されていないなら、明日まず何をすべきかはお分かりですね。

