Windows Server 2022 のエンタープライズ CA(AD CS)で、Security ログに Event ID 4899(テンプレート更新)/4900(テンプレート読み込み)が全く記録されない――この現象は「高度な監査ポリシーの優先設定」「CA 側のフラグ(EditFlags)の不足」「テンプレート操作の勘違い」「サービス再起動・AD レプリケーション待ちの不足」が重なって起きるのが定番です。ここでは最短の復旧手順と、失敗しやすい落とし穴まで具体的に整理します。
質問の背景と現象
Windows Server 2022 上のエンタープライズ CA(Active Directory 証明書サービス、以下 AD CS)で、監査イベント 4899「Certificate Services template was updated」 と 4900「Certificate Services loaded a template」 が一切出力されない。Windows Server 2012 R2 時代の資料を参考に設定したが効果がなく、どこを見直すべきか知りたい――というケースです。
結論(最短の答え)
- 高度な監査ポリシーを強制(サブカテゴリ優先)し、Object Access > Audit Certification Services を 成功+失敗で有効化する。
- CA レジストリの EditFlags に EDITF_AUDITCERTTEMPLATELOAD を付与して テンプレート読み込みの監査を明示的に ON にする。
certutil -setreg CA\EditFlags +EDITF_AUDITCERTTEMPLATELOAD - gpupdate /force と certsvc 再起動(または
Restart-Service certsvc)を行い、直後に 4900 が出るか確認する。
その後、テンプレートを実際に編集して保存(複製→プロパティ変更でも可)し、AD レプリケーションを待った上で 4899 を確認する。 - それでも出ない場合は、監査設定の実効値確認(
auditpol)、Security ログのサイズ・フィルタ、Enterprise CA 以外でないか、テンプレート編集の手順を再点検する。
対処手順(一覧)
| 手順 | 内容 | 補足 |
|---|---|---|
| ① 高度な監査ポリシーを優先させる | GPO → [コンピューターの構成] → [Windows の設定] → [セキュリティの設定] → [ローカル ポリシー] → [セキュリティ オプション] →「監査: 監査ポリシーのサブカテゴリ設定 (Windows Vista 以降) が監査ポリシーのカテゴリ設定を上書きする」を「有効」。 | 旧来(カテゴリ単位)の監査がサブカテゴリ設定を打ち消す事故を防止。 |
| ② CA 用の監査サブカテゴリを有効化 | [Advanced Audit Policy Configuration] → [Object Access] →「Audit Certification Services」を成功+失敗で有効化。 | 実効値は auditpol /get /subcategory:"Certification Services" で確認。 |
| ③ CA レジストリで EditFlags を設定 | 管理者 PowerShell / CMD で以下を実行:certutil -getreg CA\EditFlagscertutil -setreg CA\EditFlags +EDITF_AUDITCERTTEMPLATELOAD | テンプレート読み込み(4900)を明示的に監査。 数値を直接足すのではなくシンボリック名で付与するのが安全。 |
| ④ ポリシー適用とサービス再起動 | gpupdate /force 実行後、net stop certsvc && net start certsvc(または Restart-Service certsvc)。 | 再起動直後に Event 4900(テンプレート読み込み)が出ればここまで成功。 |
| ⑤ Event 4899 を発生させる操作 | certtmpl.msc でテンプレートを編集。既定テンプレートは直接変更不可のものがあるため、複製 → プロパティ変更 → OK で保存。 その後 1~2 分待機(レプリケーション待ち)。必要に応じて certutil -pulse で CA の AD 監視ポーリングを促す。 | 4899 は「属性が保存された時」のみ出る。閲覧や OK なし(変更なし)では発生しない。 |
| ⑥ DS 監査の活用(任意) | ドメイン コントローラ用 GPO → [Advanced Audit Policy Configuration] → [DS Access] →「Audit Directory Service Changes」を成功+失敗で有効化。 | AD 上の テンプレート変更の痕跡(例:Event 5136)を残せる。 ※4899/4900 の発生自体はCA の監査設定と EditFlags が主因。 |
| ⑦ テンプレート コンテナーに監査 SACL を付与(最終手段) | adsiedit.msc → CN=Configuration,…,CN=Public Key Services → CN=Certificate Templates を右クリック → [プロパティ] → [セキュリティ] → [詳細設定] → [監査] → Everyone / 成功 / Write all properties / このオブジェクトと子孫 を追加。 | 変更の検出・追跡を確実化するための保険。SACL なので権限付与ではないが、監査量が増える点に注意。 |
イベントの意味と確認ポイント
| イベント ID | 発生条件 | チェックポイント |
|---|---|---|
| 4900 – Certificate Services loaded a template | CA サービス起動時や certutil -pulse 時に、AD からテンプレート一覧を読み込む。 | certsvc 再起動や -pulse 実行直後に発生するか確認。 |
| 4899 – Certificate Services template was updated | テンプレートの属性が保存された時に発生。 | 既定テンプレートは直接編集不可の場合あり。複製→編集→保存が必要。AD レプリケーション後に CA が検知するため数分待つ。 |
ヒント
・現在のフラグ確認:certutil -getreg CA\AuditFilter/certutil -getreg CA\EditFlags
・マルチ DC 環境では、AD レプリケーション完了後に CA が変更を検知するため、テスト直後に 4899 が出ない場合は数分待機。
・テンプレート機能はエンタープライズ CA のみ有効。スタンドアロン CA では 4899/4900 は発生しない。
なぜ「有効化したはずの監査」が出ないのか(原因の分解)
高度な監査と旧来監査の競合
Server 2022 でも、旧来の「カテゴリ単位(例:オブジェクト アクセス)」設定が残っていると、サブカテゴリの詳細設定が無効化されます。「サブカテゴリ設定を上書きする」を有効にしない限り、Audit Certification Services を ON にしても効果が出ません。これは 2012 R2 時代からの鉄板の落とし穴です。
CA 側の EditFlags 未設定
テンプレート読み込みイベント(4900)は、CA の内部動作に対する「監査対象の明示」が必要です。CA\EditFlags に +EDITF_AUDITCERTTEMPLATELOAD を足すことで、テンプレート読み込み時の監査出力が行われます。単に Audit Policy 側を有効にするだけでは出ません。
テンプレート「編集」操作の誤解
Event 4899 は「テンプレート属性が保存された」時のみ発生します。プロパティを開いて閉じるだけでは出ません。さらに、既定テンプレートは GUI 上で直接編集できないものがあるため、複製してからプロパティ(発行要件、有効期間、セキュリティなど)を変更し、[OK] を押して保存してください。
サービス再起動や AD レプリケーション待機の不足
ポリシーやレジストリの変更は、CA サービスの再起動が必要です。また、テンプレート更新(4899)の検知は AD レプリケーションに依存します。「再起動 → 数分待つ → Security ログ確認」の順序が大切です。
Security ログのサイズ・フィルタ
Security ログがローテーション済み、あるいはフィルタ条件により非表示になっていることもあります。ログサイズの拡張(例:4096~8192KB 以上)や、イベント ID での直接フィルタ(4899, 4900)で見落としを防ぎます。
確認コマンド集(そのまま実行して差分確認)
| 目的 | コマンド | 期待ポイント |
|---|---|---|
| サブカテゴリの実効状態 | auditpol /get /subcategory:"Certification Services" | Success と Failure が Enabled。 |
| サブカテゴリ一覧から該当を探す | auditpol /list /subcategory:* | findstr /I "Certification Services" | ロケール差異がある環境でも発見しやすい。 |
| CA 側のフラグ確認 | certutil -getreg CA\EditFlags | EDITF_AUDITCERTTEMPLATELOAD が含まれる。 |
| CA 監査カテゴリ確認 | certutil -getreg CA\AuditFilter | 最小限の監査カテゴリが有効。 |
| テンプレート再読み込み促進 | certutil -pulse | 即時に 4900 が出力されることが多い。 |
| サービス再起動 | Restart-Service certsvc | 再起動直後に 4900。 |
PowerShell ワンショット検証(コピー&ペースト用)
$ErrorActionPreference = 'Stop'
Write-Host "=== Audit Policy (Certification Services) ==="
auditpol /get /subcategory:"Certification Services"
Write-Host "`n=== CA Registry (EditFlags / AuditFilter) ==="
certutil -getreg CA\EditFlags
certutil -getreg CA\AuditFilter
Write-Host "`n=== Force reload / Check events ==="
Restart-Service certsvc -Force
Start-Sleep -Seconds 5
wevtutil qe Security /q:"*[System[(EventID=4900 or EventID=4899) and TimeCreated[timediff(@SystemTime) <= 600000]]]" /f:text /c:8
「それでも出ない」時のトラブルシュート フロー
- サーバー種別の確認:該当 CA が エンタープライズ CA であること(スタンドアロン CA では 4899/4900 は対象外)。
certutil -getreg CA\CATypeで種別を把握。 - GPO の実効性:該当サーバーで
gpresult /h c:\gp.htmlを取得し、GPO の適用状態・WMI フィルタ・優先順位を確認。 - 監査の優先設定:①の「サブカテゴリ優先」が 必ず有効になっているか再確認。
- 監査サブカテゴリの実値:
auditpol /get /subcategory:"Certification Services"で Success/Failure が Enabled。 - EditFlags の値:
certutil -getreg CA\EditFlags出力にEDITF_AUDITCERTTEMPLATELOADが含まれる。含まれなければ-setregを再実施。 - Security ログの健全性:ログが一杯、あるいは厳しすぎるフィルタで隠れていないか。
- テンプレート操作の正当性:複製 → 編集 → 保存を確実に実施。編集なしや表示のみでは 4899 は出ない。
- レプリケーション確認:複数 DC 環境では 1~数分待機。必要なら
repadmin /syncallを活用(権限に注意)。 - adsiedit の SACL 追加(最終手段):⑦の手順を一時的に適用し、検知の確実性を上げる。
安全な変更手順(ロールバック前提)
本番 CA は組織の 信頼の根 です。変更は可逆にし、元の状態に戻せるよう準備します。
- 事前バックアップ:
certutil -getreg CA\EditFlags > C:\CA_EditFlags_before.txt、certutil -getreg CA\AuditFilter > C:\CA_AuditFilter_before.txt - 変更:
certutil -setreg CA\EditFlags +EDITF_AUDITCERTTEMPLATELOAD - ロールバック:必要時は
certutil -setreg CA\EditFlags -EDITF_AUDITCERTTEMPLATELOADで除去可能。
よくある誤解と落とし穴
- 「AuditFilter に +128 でよい」:テンプレート読み込み(4900)の監査は EditFlags の対象です。AuditFilter 側の調整だけでは出ない場合があります。
→ まず EditFlags にシンボリック名で付与し、AuditFilter は既存の基準(開始/停止・発行/失敗など)を維持。 - 「テンプレートを開いたのに 4899 が出ない」:保存を伴う属性変更が必要。既定テンプレートは直接変更できないことが多く、複製して編集します。
- 「スタンドアロン CA でも見えるはず」:テンプレートは AD 機能です。エンタープライズ CA 専用のイベントである点に注意。
- 「ポリシーはリンクしたから大丈夫」:GPO のリンク順、継承ブロック、WMI フィルタ、同名設定の上書きなどで実効値が変わります。auditpol と gpresult で実測確認が最重要。
イベント確認のコツ(Event Viewer)
- ログの場所:Windows ログ > セキュリティ。ソースは Microsoft-Windows-Security-Auditing、タスクのカテゴリは Certificate Services。
- フィルタ:イベント ID に 4899, 4900 をカンマ区切りで指定。
- 相関確認:テンプレート保存(4899)→ サービス再読み込み(4900)→ 発行/失敗(4886/4887/4888 等)と時系列で並べると把握しやすい。
動作確認のためのテンプレート編集例
- certtmpl.msc を開く。
- 任意の既定テンプレート(例:User)を右クリック → テンプレートの複製。
- [全般] で判別しやすい表示名に変更(例:User-AuditTest)。
- [有効期間] を 1 日→2 日に変更するなど、必ず差分が出る変更を行い [OK]。
- 数分待機(複数 DC の場合はレプリケーション)。
- Event Viewer の Security ログで 4899 を確認。
- CA サーバーで
certutil -pulseを実行し、4900 を確認。
ポリシー・レジストリの「正しい組み合わせ」早見表
| 層 | 設定 | 目的 |
|---|---|---|
| GPO(セキュリティ オプション) | サブカテゴリ設定の強制(カテゴリ設定を上書き) | 高度な監査ポリシーを有効化。 |
| GPO(高度な監査) | Object Access > Audit Certification Services(成功+失敗) | CA 監査イベント全般の前提。 |
| CA レジストリ | EditFlags + EDITF_AUDITCERTTEMPLATELOAD | テンプレート読み込み(4900)の監査を明示。 |
| (任意)DC 監査 | DS Access > Audit Directory Service Changes | AD 側の変更痕跡を追跡(5136 等)。 |
セキュリティ運用上のベストプラクティス
- Security ログの容量増加・保全:テンプレート更新は頻度が低いが、発行系のイベントは多い。容量拡張と「上書きする前にアーカイブ」を推奨。
- 最小権限の原則:テンプレートの DACL は最小に。証明書管理者・テンプレート管理者の役割分離を徹底。
- 変更管理:テンプレートの変更手続きを標準化し、4899 を変更記録のカギとして運用帳票に紐づける。
- 監査の見える化:4899/4900 をトリガーに SIEM やアラートを設定し、予期せぬテンプレート改変に即応。
トラブル再発防止チェックリスト
- サブカテゴリ優先(セキュリティ オプション)が「有効」になっている。
- Audit Certification Services(成功+失敗)が Enabled(
auditpol検証済み)。 - CA\EditFlags に
EDITF_AUDITCERTTEMPLATELOADが含まれる(certutil -getreg検証済み)。 - certsvc 再起動後に 4900 を確認済み。
- テンプレートの 編集→保存で 4899 を確認済み。
- Security ログは容量・保持ポリシーが適切。
- 対象 CA はエンタープライズ CA である。
よくある質問(FAQ)
Q1:AuditFilter は何もしなくていいの?
A:AuditFilter は CA の監査カテゴリ(開始/停止、発行、失敗、バックアップ/復元、構成変更など)を制御します。既に組織としての監査方針があるなら、それを尊重してください。ただし4899/4900 の前提は EditFlags 側にある点を押さえてください。
Q2:テンプレートを見ただけでイベントは出る?
A:出ません。保存(属性の永続化)が条件です。既定テンプレートは複製して編集しましょう。
Q3:DS 監査を有効にしないと 4899 は出ない?
A:4899/4900 の出力は主に CA 側の監査設定・EditFlags に依存します。DS 監査は AD 側の変更履歴を残すための補助です。
Q4:すぐに 4899 が出ないのはなぜ?
A:AD レプリケーションや CA の AD 監視タイミングのためです。数分待つ、あるいは certutil -pulse を実行してください。
まとめ
Server 2022 の AD CS で 4899/4900 が出ない場合、(1)サブカテゴリ優先の監査設定、(2)Audit Certification Services の有効化、(3)CA\EditFlags によるテンプレート読み込み監査の付与、(4)サービス再起動、(5)実際のテンプレート編集→保存、(6)AD レプリケーション待機の順に整えることで、ほぼ確実に解決します。加えて、運用では 4899/4900 をアラート化し、テンプレート変更や CA の動作変化を素早く検出できる仕組みを整えると安全性が高まります。
参考となる実践シナリオ(完全手順)
- GPMC で CA サーバーにリンクされた GPO を編集。サブカテゴリ優先を「有効」。
- 同 GPO の Object Access 内で Audit Certification Services(成功+失敗)を有効化。
- CA サーバーで
gpupdate /force。 - 管理者として次を実行:
certutil -setreg CA\EditFlags +EDITF_AUDITCERTTEMPLATELOAD
(必要に応じてcertutil -getregで値を控える) Restart-Service certsvc。Security ログに 4900 が出ることを確認。- certtmpl.msc でテンプレートを複製→プロパティを変更→保存。
- 数分待機後、Security ログに 4899 を確認。必要なら
certutil -pulse。
補足:数値ではなくシンボリック名を使う理由
レジストリ フラグは OS バージョン差や資料の表記揺れで数値が紛れやすい領域です。+EDITF_AUDITCERTTEMPLATELOAD のようにシンボリック名を使えば、安全に意図したビットだけを加減算できます。ロールバックも -EDITF_AUDITCERTTEMPLATELOAD で明確です。
最後に(チェックの一行)
auditpol /get /subcategory:"Certification Services"; certutil -getreg CA\EditFlags; Restart-Service certsvc; wevtutil qe Security /q:"*[System[(EventID=4900 or EventID=4899)]]" /c:4 /f:text

コメント