Active-Directory

Active Directory 中的 CA 恢復

  • October 21, 2021

我想我明白了,但我想確定一下。

我們正在執行兩個 Windows 2016 域控制器 (VM),其中一個正在執行證書伺服器的角色。我們每天執行系統狀態備份並將它們解除安裝到遠端位置。如果出於某種原因需要完全重建具有 CA 的域控制器,我假設我可以使用最新的系統狀態備份進行非權威性還原以恢復 CA,並且現有域控制器將更新重建的伺服器所有其他廣告資訊。這是一個正確的假設還是我應該實施 CA 特定的恢復計劃?

附加資訊:我正在為部署在 50 多個斷開連接的環境中的系統制定基線。在這一點上,向每個站點添加另一台伺服器不是我的選擇。我計劃同時實施系統狀態和特定於 CA 的備份計劃來幫助恢復,這裡有一些腳本是我拼湊起來的,以幫助手動檢查和自動化日常流程。

#CA Initial / Update Backup Script
$filedate = (Get-Date -format d).ToString().Replace(“/”,”-“)

#Backup / verify backup
IF ((Test-Path D:\CAbackup) -eq $False)
   {
   mkdir D:\CABackup
   mkdir D:\CABackup\InitialBackup
   Backup-CARoleService -KeyOnly D:\CABackup\InitialBackup -Password (read-host -Prompt "Assign a password for the CA Private Key" -AsSecureString)
   Backup-CARoleService -DatabaseOnly D:\CABackup\InitialBackup
   reg export HKLM\System\CurrentControlSet\Services\CertSvc\Configuration D:\CABackup\InitialBackUp\<filename>.reg
   }
ELSEIF ((Test-Path D:\CABackup\InitialBackup) -eq $False)
   {
   mkdir D:\CABackup\InitialBackup
   Backup-CARoleService -KeyOnly D:\CABackup\InitialBackup -Password (read-host -Prompt "Assign a password for the CA Private Key" -AsSecureString)
   Backup-CARoleService -DatabaseOnly D:\CABackup\InitialBackup
   reg export HKLM\System\CurrentControlSet\Services\CertSvc\Configuration D:\CABackup\InitialBackUp\<filename>.reg
   }
ELSE {
   IF ((Test-Path D:\CABackup\InitialBackup\database\<filename>.edb) -eq $false)
       {
       Backup-CARoleService -DatabaseOnly D:\CABackup\InitialBackup
       }
   ELSE {}
   IF ((Test-Path D:\CABackup\InitialBackup\<filename>.reg) -eq $false)
       {
       reg export HKLM\System\CurrentControlSet\Services\CertSvc\Configuration D:\CABackup\InitialBackUp\<filename>.reg
       }
   ELSE {}
   IF ((Test-Path D:\CABackup\InitialBackup\<filename>.p12) -eq $false)
       {
       Backup-CARoleService -KeyOnly D:\CABackup\InitialBackup -Password (read-host -Prompt "Assign a password for the CA Private Key" -AsSecureString)
       }
   ELSE
       {
       #Compare the backed up certificate thumbprint against the CA certificate thumbprint, if they do not match, archive the old cert and back up the current one
       $catpret = certutil -adca | Select-String "Cert Hash"
       $catp = $certret.Line.Substring(17)
       $archtp = (Get-PfxData -FilePath d:\cabackup\Prikey\<filename>.p12).EndEntityCertificates.Thumbprint
       IF ($catp -ne $archtp)
           {
           mv d:\cabackup\prikey\<filename>.p12 d:\cabackup\prikey\<filename>.p12.$filedate
           Backup-CARoleService -DatabaseOnly D:\CABackup\InitialBackup
           }
       ELSE {}
       }
   }

#List of certificates that will expire in next 120 days
$list=@()
$na =(get-date).addDays(120)
$listofexp = certutil -view -restrict "NotAfter<=$na" -out "RequestID,RequesterName,Request Common Name,NotAfter"
$total = ($listofexp.count -10)
$f=10
$e=13
While ($e -lt $total)
   {
   $list += ($listofexp[$f] + $listofexp[$f+1] + $listofexp[$f+2] + $listofexp[$e])
   $f = $f+6
   $e = $e+6
   } 


#Daily backup
$filedate = (Get-Date -format d).ToString().Replace(“/”,”-“)
mkdir D:\CABackup\$filedate
Backup-CARoleService -DatabaseOnly D:\CABackup\$filedate
reg export HKLM\System\CurrentControlSet\Services\CertSvc\Configuration D:\CABackup\$fildate\<filename>.reg

#Clear 2 week and older cert requests
$list=@()
$setpurge = (get-date).AddDays(-14)
$purgedate = Get-date $setpurge -Format "MM/dd/yy"
$listofpend = certutil -view -restrict "Request Submission Date<=$purgedate,Request Disposition=9" -out "Request ID, Request Submission  Date, Request Common Name"
$total = ($listofpend.count -9)
$f=9
$e=11
While ($e -lt $total)
{
$list += ($listofpend[$f] -replace '.*\(' -replace '\),*')
$f = $f+5
$e = $e+5
}
foreach ($item in $list)
{
certutil -deleterow $item
}

<#Original purge process replaced by above
$setpurge = (get-date).AddDays(-14)
   $purgedate = Get-date $setpurge -Format "MM/dd/yy"
   certutil -deleterow $purgedate request
#>

我已經在實驗室中測試了其中的大部分內容,並在我刪除一兩個伺服器並嘗試恢復之前讓樣片執行一段時間。如果有人有任何額外的建議,將不勝感激。

這就是強烈建議您不要在域控制器上執行 CA 的原因之一。我現在在遺留域中的 DC 上有一個,這是一個可維護性的噩夢,當另一個服務依賴項被整理出來時,它將被刪除。當然,DC 和 CA 伺服器非常關鍵,如果您有一個功能失敗而另一個功能正常,則處理起來會變得更加複雜。

我強烈建議實施單獨的維護計劃,以通過計劃任務備份您的 CA 數據庫。此維護計劃還應包括定期刪除舊的被拒絕或待處理的證書請求以及過期證書的程序(certutil 或 PKPSI Powershell)。如果您想在其他地方遷移或恢復 CA,它不僅會有所幫助,您還應該像任何數據庫一樣進行定期備份,以清理事務日誌並確保所有內容都已送出。

首先,將 CA(包括 CA 密鑰)完整備份到本地捲上沒有 CA 數據庫的目錄。將目錄命名為 CABackup 之類的名稱,然後創建一個子目錄,其中包含“初始備份”之類的內容。在那裡定位您的第一個備份。CA 私鑰應保存在安全的地方,並記錄用於保存它的密碼。還將系統資料庫項導出HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\[CAName]到您的備份文件夾。

對於定期維護,我們有一個腳本,每次執行時都會在“CABackup”父文件夾下創建一個新的備份文件夾 - 每次備份的目錄都必須為空。它僅備份 CA 數據庫。自然地,CA 備份目錄及其內容與正常文件系統備份的其餘部分一起歸檔到磁帶中。如果本地備份成功,相同的腳本還會執行陳舊的 REQ 和過期證書的清理。

您應該有一個刪除舊備份的過程 - 我們保留最後 5 個可用的備份 - 但不要刪除您的 Initial Backup 文件夾。當然,如果您出於某種原因更改了 CA 密鑰,請對 DB 和 CA 密鑰進行新的初始備份。

在 CA 和 DC 共存的域中,如果整個域都需要恢復,我不會將託管 CA 的 DC 用作恢復目標。任何替代 DC 都將是可取的。如果實際域是健康的,但共享伺服器上的 ADDS 出現問題,我會簡單地刪除 ADDS 並建構另一個 DC。

如果 CA 需要恢復,但 DC 不需要,我會藉此機會遷移 CA。導出的 reg 密鑰有助於加快該過程,但請確保您使用系統資料庫中的新伺服器 FQDN 配置恢復的 CA 實例。此遷移 CA 的過程描述了該過程。此外,自然地,在隔離環境中測試 CA 恢復過程。

通過系統狀態恢復來恢復 DC 和 CA 可能非常好,但老實說,其中一個或另一個本身就足夠有壓力了。很久以前,我在一個只有一個“一切”DC/CA/文件伺服器的環境中自己做過一次。

不過,我確實建議您盡快移動您的 CA,以免招致更多“技術債務”。如果您對可以擁有的系統數量有限制,它可以與其他一些不太重要的角色共存,例如 KMS 伺服器或 WSUS。如果您不受限制,您應該進行兩層離線根和中間 CA 設置。上面連結的遷移文章值得一讀,即使只是為了您的資訊 - 基本遷移並不是一個非常困難的過程。

此外,如果您保留目前配置(一段時間),您絕對應該做的是盡快嘗試在隔離環境中恢復系統狀態,包括向恢復的域添加至少一個新 DC 並確保 CA 可以向它目前所做的客戶類型頒發證書。這應該有助於澄清任何潛在的痛點。

引用自:https://serverfault.com/questions/1080571