我想我明白了,但我想确定一下。
我们正在运行两个 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 可以向它目前所做的客户类型颁发证书。这应该有助于澄清任何潜在的痛点。