Điểm:1

CA Recovery in Active Directory

lá cờ in

I think I understand, but I want to be sure.

We are running two Windows 2016 domain controllers (VMs), one of which is performing the role of a certificate server. We perform system state backups daily and offload them to a remote location. If, for whatever reason, the Domain Controller with the CA needs to be completely rebuilt, I assume I can do a non-authoritative restore using the most recent system state backup to recover the CA and the existing domain controller will update the rebuilt server with all other AD information. Is this a correct assumption or should I implement a CA specific recovery plan?

Additional Information: I am working on a baseline for a system deployed in 50+ disconnected environments. Adding another server to each site is not an option for me at this point. I plan on implementing both system state and a CA specific backup plan to aid in recovery, here are a few scripts I scrapped together to aid in manual checks and automated daily processes.

#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
#>

I have tested most of this out in a lab and am letting the dailies run for a bit before I delete a server or two and attempt restoration. If anyone has any additional advice it would be greatly appreciated.

Điểm:2
lá cờ cn

Đây là một trong những lý do tại sao chúng tôi khuyên bạn nên đừng có CA đang chạy trên bộ điều khiển miền. Hiện tại tôi có một tài khoản trên DC trong miền kế thừa và đó là một cơn ác mộng về khả năng bảo trì và nó sẽ bị xóa khi một phụ thuộc dịch vụ khác được sắp xếp. Tất nhiên, các máy chủ DC và CA rất quan trọng, và nếu bạn có một chức năng bị lỗi trong khi chức năng kia vẫn ổn, thì việc xử lý sẽ phức tạp hơn nhiều.

Tôi thực sự khuyên bạn nên triển khai một kế hoạch bảo trì riêng để sao lưu cơ sở dữ liệu CA của mình thông qua tác vụ đã lên lịch. Kế hoạch bảo trì này cũng nên bao gồm các quy trình (certutil hoặc PKPSI Powershell) để thường xuyên xóa các yêu cầu chứng chỉ cũ bị từ chối hoặc đang chờ xử lý cùng với các chứng chỉ đã hết hạn. Nó không chỉ hữu ích nếu bạn muốn di chuyển hoặc khôi phục CA ở nơi khác, bạn nên thực hiện sao lưu thường xuyên giống như bất kỳ cơ sở dữ liệu nào để xóa nhật ký giao dịch và đảm bảo mọi thứ được cam kết.

Để thực hiện một lần, hãy sao lưu toàn bộ CA - bao gồm cả khóa CA - vào một thư mục trên ổ đĩa cục bộ không có cơ sở dữ liệu CA trên đó.Gọi thư mục đó là CABackup, sau đó tạo một thư mục con có nội dung như "Sao lưu ban đầu". Nhắm mục tiêu sao lưu đầu tiên của bạn ở đó. Khóa riêng của CA phải được lưu trữ ở một nơi an toàn với bản ghi mật khẩu được sử dụng để lưu khóa đó. Đồng thời xuất khoá đăng ký HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\[CAName] vào thư mục sao lưu của bạn.

Để bảo trì thường xuyên, chúng tôi có một tập lệnh tạo thư mục sao lưu mới bên dưới thư mục mẹ "CABackup" mỗi khi nó chạy - thư mục phải trống cho mỗi lần sao lưu. Nó chỉ sao lưu cơ sở dữ liệu CA. Đương nhiên, thư mục sao lưu CA và nội dung của nó được lưu trữ vào băng với phần còn lại của bản sao lưu hệ thống tệp thông thường. Tập lệnh tương tự cũng thực hiện việc dọn sạch các REQ cũ và chứng chỉ hết hạn nếu sao lưu cục bộ thành công.

Bạn nên có một quy trình để xóa các bản sao lưu cũ - chúng tôi giữ lại 5 bản sao lưu cuối cùng - nhưng không xóa thư mục Sao lưu ban đầu của bạn. Tất nhiên, nếu bạn thay đổi khóa CA vì lý do nào đó, hãy thực hiện Sao lưu ban đầu mới cho cả khóa DB và CA.

Trong miền có CA và DC cùng tồn tại, trong trường hợp toàn bộ miền cần khôi phục, tôi sẽ không sử dụng DC lưu trữ CA làm mục tiêu khôi phục. Bất kỳ DC thay thế nào sẽ được ưu tiên hơn. Nếu miền thực tế vẫn hoạt động tốt nhưng đã xảy ra sự cố với ADDS trên máy chủ được chia sẻ, tôi chỉ cần xóa ADDS và xây dựng một DC khác.

Nếu CA yêu cầu khôi phục chứ không phải DC, tôi sẽ tận dụng cơ hội để di chuyển CA. Khóa reg đã xuất giúp đẩy nhanh quá trình nhưng đảm bảo bạn định cấu hình phiên bản CA đã khôi phục với máy chủ FQDN mới trong Sổ đăng ký. Cái này quy trình di chuyển một CA mô tả quá trình. Ngoài ra, một cách tự nhiên, hãy kiểm tra quy trình khôi phục CA trong một môi trường bị cô lập.

Có thể hoàn toàn ổn khi khôi phục cả DC và CA bằng khôi phục trạng thái hệ thống, nhưng thành thật mà nói, bản thân cái này hay cái khác đã đủ căng thẳng.Tôi chỉ tự mình làm điều đó một lần trong những ngày rất lâu trước đây trong một môi trường có một máy chủ tệp DC/CA/"mọi thứ" duy nhất.

Tuy nhiên, tôi khuyên bạn nên chuyển CA của mình càng sớm càng tốt trước khi bạn phải gánh thêm nhiều "nợ kỹ thuật". Nó có thể cùng tồn tại với một số vai trò ít quan trọng khác, như máy chủ KMS hoặc WSUS, nếu bạn có những hạn chế về số lượng hệ thống mà bạn có thể có. Nếu bạn không bị hạn chế, bạn nên thực hiện thiết lập gốc ngoại tuyến hai tầng cộng với thiết lập CA trung gian. Bài viết di chuyển được liên kết ở trên đáng để đọc ngay cả khi chỉ để biết thông tin của bạn - quá trình di chuyển cơ bản không phải là một quá trình quá khó khăn.

Ngoài ra, điều bạn chắc chắn nên làm, nếu bạn giữ cấu hình hiện tại của mình (trong một thời gian), hãy thử khôi phục trạng thái hệ thống trong một môi trường biệt lập, bao gồm thêm ít nhất một DC mới vào miền đã khôi phục và đảm bảo rằng CA có thể phát hành chứng chỉ cho loại khách hàng hiện tại. Điều đó sẽ giúp làm rõ bất kỳ điểm đau tiềm ẩn nào.

Rnet avatar
lá cờ in
Tôi đánh giá cao cái nhìn sâu sắc nó rất hữu ích, tôi đã thêm một số thông tin khác vào câu hỏi ban đầu của mình.
LeeM avatar
lá cờ cn
Bạn đang triển khai hơn 50 AD bị ngắt kết nối? Điều đó có vẻ như rất nhiều chi phí.Trong mọi trường hợp, tập lệnh có vẻ ổn, mặc dù tôi khuyên bạn nên thực hiện `certutil -view -restrict` để nhận các REQ cũ và các cert đã hết hạn, sau đó thực hiện `certutil -deleterow RowID` trên các kết quả. `certutil -deleterow Request`, v.v. có thể dễ dàng bị đình trệ khi DB phát triển. Tôi cũng thực sự khuyên bạn nên cài đặt PSPKI để thực hiện tất cả những thứ này thông qua powershell thay vì gọi `certutil`. Bài viết này (cả hai trang) rất hữu ích cho thông tin chi tiết và tập lệnh mẫu nếu bạn chưa xem: https://www.pkisolutions.com/adcsbackups/
Rnet avatar
lá cờ in
Vâng, 50 AD bị ngắt kết nối, đó là một nhiệm vụ thú vị. Tôi đã cập nhật tập lệnh để sử dụng quy trình bạn đã mô tả ở trên. Tôi sẽ thực hiện quy trình thanh lọc các bản sao lưu vì tôi không muốn gặp sự cố về lưu trữ. Cảm ơn bạn đã liên kết, tôi đang nghiên cứu thêm một chút về quy trình bảo trì CA và có khả năng sử dụng PSPKI vì nó dường như giúp cuộc sống dễ dàng hơn rất nhiều, đặc biệt là từ khía cạnh tự động hóa.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.