Active Directory 中的 CA 恢复

Active Directory 中的 CA 恢复

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

我们正在运行两个 Windows 2016 域控制器 (VM),其中一个充当证书服务器的角色。我们每天执行系统状态备份并将其卸载到远程位置。如果出于某种原因,需要完全重建具有 CA 的域控制器,我假设我可以使用最新的系统状态备份进行非权威性还原以恢复 CA,并且现有域控制器将使用所有其他 AD 信息更新重建的服务器。这是正确的假设吗?还是我应该实施特定于 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
#>

我已经在实验室中测试了大部分内容,并让每日运行一段时间,然后删除一两个服务器并尝试恢复。如果有人有任何其他建议,我将不胜感激。

答案1

这就是为什么强烈建议你不要在域控制器上运行 CA。我现在在旧域中的 DC 上有一个 CA,这是一个可维护性的噩梦,当另一个服务依赖关系被解决时,它将被删除。当然,DC 和 CA 服务器非常关键,如果一个功能失败而另一个功能正常,处理起来就会复杂得多。

我强烈建议实施单独的维护计划,通过计划任务备份您的 CA 数据库。此维护计划还应包括流程(certutil 或 PKPSI Powershell),以定期删除旧的被拒绝或待处理的证书请求以及过期的证书。这不仅有助于您迁移或在其他地方恢复 CA,还应该像任何数据库一样定期备份以清理事务日志并确保一切都已提交。

要开始备份,请将 CA(包括 CA 密钥)完整备份到没有 CA 数据库的本地卷上的目录中。将该目录命名为 CABackup 之类的名称,然后创建一个子目录,内容类似于“初始备份”。将您的第一个备份定位在那里。CA 私钥应存档在安全的地方,并记录用于保存它的密码。还将注册表项导出HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\[CAName]到您的备份文件夹。

对于定期维护,我们有一个脚本,每次运行时都会在“CABackup”父文件夹下创建一个新的备份文件夹 - 每次备份时该目录都必须为空。它仅备份 CA 数据库。当然,CA 备份目录及其内容与其余常规文件系统备份一起存档到磁带上。如果本地备份成功,同一脚本还会执行陈旧的 REQ 和过期证书的清理。

您应该有一个删除旧备份的流程 - 我们保留最后 5 个可用备份 - 但不要删除您的初始备份文件夹。当然,如果您出于某种原因更改了 CA 密钥,请对 DB 和 CA 密钥进行新的初始备份。

在 CA 和 DC 共存的域中,如果整个域需要恢复,我不会使用托管 CA 的 DC 作为恢复目标。任何备用 DC 都是更好的选择。如果实际域运行正常,但共享服务器上的 ADDS 出现问题,我只需删除 ADDS 并构建另一个 DC。

如果 CA 需要恢复,但 DC 不需要,我会借此机会迁移 CA。导出的注册表项有助于加快该过程,但请确保在注册表中使用新的服务器 FQDN 配置恢复的 CA 实例。这迁移 CA 的流程描述过程。当然,还要在隔离环境中测试 CA 恢复过程。

使用系统状态恢复来恢复 DC 和 CA 可能完全没问题,但说实话,其中一个本身就已经够麻烦的了。很久以前,我自己只在一个只有“一切”DC/CA/文件服务器的环境中这样做过一次。

不过,我建议您尽快迁移 CA,以免承担更多“技术债务”。如果您对可以拥有的系统数量有限制,它可以与其他一些不太重要的角色共存,例如 KMS 服务器或 WSUS。如果您不受限制,则应进行两层脱机根加中间 CA 设置。上面链接的迁移文章值得一读,即使只是为了您的信息 - 基本迁移并不是一个非常困难的过程。

此外,如果您暂时保留当前配置,您一定要做的是尽快在隔离环境中尝试系统状态恢复,包括向恢复的域添加至少一个新 DC,并确保 CA 可以向其当前所颁发的客户端颁发证书。这应该有助于澄清任何潜在的痛点。

相关内容