在 Azure Stack Hub 中輪替使用祕密

本文提供執行秘密輪替的指導,以協助維護與 Azure Stack Hub 基礎結構資源和服務的安全通訊。

概觀

Azure Stack Hub 使用秘密,來維護與基礎結構資源和服務的安全通訊。 為維護 Azure Stack Hub 基礎結構的完整性,操作員必須能夠輪替祕密,且輪替頻率需與其組織的安全性需求一致。

當秘密即將到期時,系統管理員入口網站會產生下列警示。 完成秘密輪替將會解決這些警示:

  • 待核准的服務帳戶密碼到期日
  • 待核准的內部憑證到期日
  • 擱置的外部憑證到期

警告

在秘密到期前,系統管理員入口網站會觸發 2 個階段的警示:

  • 到期前的 90 天會產生警告警示。
  • 到期前的 30 天會產生重要警示。

此警示非常重要,如果您收到這些通知,請務必完成秘密輪替。 如果未完成秘密輪替,則有可能導致工作負載遺失,且可能需自行支付重新佈署 Azure Stack Hub 的費用!

如需警示監視和補救的詳細資訊,請參閱 在 Azure Stack Hub 中監視健康情況和警示

注意

在 1811 之前版本的 Azure Stack Hub 環境中,可能會看到擱置中的內部憑證或祕密到期警示。 這些是不正確的警示,應該予以忽略而不需執行內部祕密輪替。 不正確的內部祕密到期警示是 1811 中已解決的已知問題。 內部秘密會在環境啟用兩年後才到期。

必要條件

  1. 強烈建議您執行支援的 Azure Stack Hub 版本,並針對實例正在執行的 Azure Stack Hub 版本套用最新的可用 Hotfix。 例如,如果您要執行 2008,請確定您已安裝 2008 可用的最新 Hotfix。

    重要

    針對 1811 之前的版本:

    • 如果已執行秘密輪替,請在再次執行祕密輪替之前,務必將版本更新至 1811 或更新的版本。 執行「祕密輪替」時,必須透過具有特殊權限的端點,且必須要有「Azure Stack Hub 操作員」認證。 如果您不確定秘密輪替是否已在環境上執行,則請在執行秘密輪替之前,將版本更新至 1811。
    • 您無須輪替祕密,即可新增延伸主機憑證。 您應該依照 Azure Stack Hub 的延伸主機準備一文中的指示,來新增延伸主機憑證。
  2. 向您的使用者通知已規劃的維護作業。 請盡可能將一般維護期間排程在非上班時間。 維護作業會影響使用者工作負載和入口網站作業。

  3. 產生 Azure Stack Hub 的憑證簽署要求

  4. 準備 Azure Stack Hub PKI 憑證

  5. 在秘密輪替期間,操作員可能會注意到警示開啟並自動關閉。 這是可預期的行為,可以忽略這類警示。 操作員可以使用 Test-AzureStack PowerShell Cmdlet,來驗證這些警示的有效性。 對於操作員,使用 System Center Operations Manager 監視 Azure Stack Hub 系統,將系統置於維護模式中,將會防止這些警示到達其 ITSM 系統。 不過,如果 Azure Stack Hub 系統變得無法連線,就會繼續出現警示。

輪替外部祕密

重要

外部祕密輪替的適用情形如下:

本節涵蓋用來保護對外服務憑證的輪替。 這些憑證是由 Azure Stack Hub 操作員提供,適用於下列服務:

  • 系統管理員入口網站
  • 公用連接埠
  • 系統管理員 Azure Resource Manager
  • 全域 Azure Resource Manager
  • 系統管理員 Key Vault
  • Key Vault
  • 管理員延伸主機
  • ACS (包含 blob、資料表及佇列儲存體)
  • ADFS1
  • 圖表1
  • Container Registry2

1適用於使用 Active Directory 同盟服務 (ADFS) 時。

2適用於使用 Azure Container Registry (ACR) 。

準備

在輪替外部秘密之前:

  1. 使用 -group SecretRotationReadiness 參數,來執行 Test-AzureStack PowerShell Cmdlet,以在輪替秘密前確認所有測試輸出皆為良好狀態。

  2. 準備一組新的替代外部憑證:

    • 新的一組憑證必須符合 Azure Stack Hub PKI 憑證需求中所述的憑證規格。

    • 產生憑證簽署要求 (CSR),以提交至您的憑證授權單位 (CA)。 針對使用準備 PKI 憑證步驟的 Azure Stack Hub 環境,準備好使用產生憑證簽署要求中所述的步驟。 Azure Stack Hub 在下列內容中,支援來自新憑證授權單位 (CA) 的外部憑證秘密輪替:

      從 CA 輪替 輪替至 CA Azure Stack Hub 版本支援
      自我簽署 Enterprise 1903 & 更新版本
      自我簽署 自我簽署 不支援
      自我簽署 公開* 1803 & 更新版本
      Enterprise Enterprise 1803 & 更新版本;如果部署時使用的相同企業 CA,則為 1803-1903
      Enterprise 自我簽署 不支援
      Enterprise 公開* 1803 & 更新版本
      公開* Enterprise 1903 & 更新版本
      公開* 自我簽署 不支援
      公開* 公開* 1803 & 更新版本

      *此為 Windows 受信任的根程式一部分。

    • 請務必使用驗證 PKI 憑證中所述的步驟,來驗證您準備的憑證

    • 請確定密碼中沒有特殊字元,例如 $*#@or

    • 確定 PFX 加密是 TripleDES-SHA1。 如果發生問題,請參閱修復 Azure Stack Hub PKI 憑證的常見問題

  3. 將用於輪替的憑證備份儲存在安全的備份位置。 如果執行輪替時發生失敗,您可以使用備份副本取代檔案共用中的憑證,然後再重新執行輪替。 請將備份副本保存在安全的備份位置。

  4. 建立可以從 ERCS VM 存取的檔案共用。 必須讓 CloudAdmin 身分識別可讀取和寫入檔案共用。

  5. 從您可存取檔案共用的電腦中開啟 PowerShell ISE 主控台。 瀏覽至檔案共用,其為您在其中建立目錄來放置外部憑證的位置。

  6. 在名為 Certificates的檔案共享中建立資料夾。 在憑證資料夾內,根據中樞所使用的識別提供者,建立名為 AADADFS的子資料夾。 例如. \Certificates\AAD.\Certificates\ADFS。 此處不應建立憑證資料夾和識別提供者子資料夾以外的其他資料夾。

  7. 將步驟 2 中建立的新取代外部憑證集複製到步驟 6 中建立的 .\Certificates\<IdentityProvider> 資料夾。 如上所述,您的識別提供者子資料夾必須是 AADADFS。 請確定取代外部憑證) 的 SAN (主體別名遵循 cert.<regionName>.<externalFQDN>Azure Stack Hub 公鑰基礎結構中指定的格式, (PKI) 憑證需求

    以下是 Microsoft Entra 識別提供者的資料夾結構範例:

        <ShareName>
            │
            └───Certificates
                  └───AAD
                      ├───ACSBlob
                      │       <CertName>.pfx
                      │
                      ├───ACSQueue
                      │       <CertName>.pfx
                      │
                      ├───ACSTable
                      │       <CertName>.pfx
                      │
                      ├───Admin Extension Host
                      │       <CertName>.pfx
                      │
                      ├───Admin Portal
                      │       <CertName>.pfx
                      │
                      ├───ARM Admin
                      │       <CertName>.pfx
                      │
                      ├───ARM Public
                      │       <CertName>.pfx
                      │
                      ├───Container Registry*
                      │       <CertName>.pfx
                      │
                      ├───KeyVault
                      │       <CertName>.pfx
                      │
                      ├───KeyVaultInternal
                      │       <CertName>.pfx
                      │
                      ├───Public Extension Host
                      │       <CertName>.pfx
                      │
                      └───Public Portal
                              <CertName>.pfx
    

*適用於針對 Microsoft Entra標識碼和ADFS使用 Azure Container Registry (ACR) 。

注意

如果您要輪替外部 Container Registry 憑證,則必須在識別提供者子資料夾中手動建立 Container Registry 子資料夾。 此外,您必須在此手動建立的子資料夾中儲存對應的 .pfx 憑證。

旋轉

完成下列步驟來輪替外部秘密:

  1. 使用下列 PowerShell 指令碼來輪替秘密。 指令碼需要存取具特殊權限端點 (PEP) 的工作階段。 PEP 裝載於虛擬機器 (VM) 上,並在其中透過遠端 PowerShell 工作階段進行存取。 如果您使用整合式系統,則會有三個 PEP 執行個體,每個都在不同主機上的 VM 內執行 (Prefix-ERCS01、Prefix-ERCS02 或 Prefix-ERCS03)。 指令碼會執行下列步驟:

    • 使用 CloudAdmin 帳戶建立具特殊權限端點的 PowerShell 工作階段,並將其儲存為變式。 在下一個步驟中,此變數會用來作為參數。

    • 執行 Invoke-Command,並將 PEP 工作階段變數作為 -Session 參數傳遞。

    • 在 PEP 工作階段中執行 Start-SecretRotation,並使用下列參數。 如需詳細資訊,請參閱 Start-SecretRotation 參考:

      參數 變數 描述
      -PfxFilesPath $CertSharePath 憑證根資料夾的網路路徑 (如準備區段的步驟 6 所述,例如 \\<IPAddress>\<ShareName>\Certificates)。
      -PathAccessCredential $CertShareCreds 向共用進行認證的 PSCredential 物件。
      -CertificatePassword $CertPassword 密碼的安全字串,用於所有建立的 pfx 憑證檔案。
    # Create a PEP session
    winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
    $PEPCreds = Get-Credential
    $PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS_Machine> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    # Run secret rotation
    $CertPassword = ConvertTo-SecureString '<Cert_Password>' -AsPlainText -Force
    $CertShareCreds = Get-Credential
    $CertSharePath = "<Network_Path_Of_CertShare>"
    Invoke-Command -Session $PEPsession -ScriptBlock {
        param($CertSharePath, $CertPassword, $CertShareCreds )
        Start-SecretRotation -PfxFilesPath $CertSharePath -PathAccessCredential $CertShareCreds -CertificatePassword $CertPassword
    } -ArgumentList ($CertSharePath, $CertPassword, $CertShareCreds)
    Remove-PSSession -Session $PEPSession
    
  2. 外部祕密輪替需要大約一小時的時間。 成功完成之後,您的主控台會顯示一則ActionPlanInstanceID ... CurrentStatus: Completed訊息,後面接著 Action plan finished with status: 'Completed'。 從準備區段中建立的共用移除憑證,並將其儲存在安全的備份位置。

    注意

    如果祕密輪替失敗,請遵循錯誤訊息中的指示,並使用 -ReRun 參數,重新執行 Start-SecretRotation

    Start-SecretRotation -ReRun
    

    如果秘密輪替重複失敗,請聯絡支援人員。

  3. (選擇性)若要確認已輪替所有外部憑證,請使用下列指令碼執行 Test-AzureStack 驗證工具

    Test-AzureStack -Include AzsExternalCertificates -DetailedResults -debug
    

輪替內部秘密

內部秘密包含由 Azure Stack Hub 基礎結構使用的憑證、密碼、安全字串及金鑰 (無須 Azure Stack Hub 操作員介入)。 只有您懷疑某個秘密遭到入侵,或收到到期警示時,才需要進行內部秘密輪替。

1811 之前的部署可能會看到擱置中內部憑證,或秘密到期的警示。 這些警示不正確,應予以忽略,且為 1811 中已解決的已知問題。

完成下列步驟來輪替內部秘密:

  1. 執行下列 PowerShell 指令碼。 請注意,針對內部秘密輪替,「執行秘密輪替」區段僅會使用 Start-SecretRotation Cmdlet-Internal 參數:

    # Create a PEP Session
    winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
    $PEPCreds = Get-Credential
    $PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS_Machine> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    # Run Secret Rotation
    Invoke-Command -Session $PEPSession -ScriptBlock {
        Start-SecretRotation -Internal
    }
    Remove-PSSession -Session $PEPSession
    

    注意

    1811 之前的版本不需要 -Internal 旗標。

  2. 成功完成之後,您的主控台會顯示一則ActionPlanInstanceID ... CurrentStatus: Completed訊息,後面接著 Action plan finished with status: 'Completed'

    注意

    如果祕密輪替失敗,請依照錯誤訊息中的指示操作,並使用 -Internal-ReRun 參數重新執行 Start-SecretRotation

    Start-SecretRotation -Internal -ReRun
    

    如果秘密輪替重複失敗,請聯絡支援人員。

輪替 Azure Stack Hub 根憑證

Azure Stack Hub 根憑證會在部署期間佈建,五年到期。 從 2108 開始,內部秘密輪替也會輪替根憑證。 標準密碼到期警示會識別根憑證的到期日,並在 90 (警告) 和 30 (重大) 天產生警示。

若要輪替根憑證,您必須將系統更新為 2108,並執行內部秘密輪替

下列程式碼片段會使用具有特殊權限的端點列出根憑證的到期日:

$pep = New-PSSession -ComputerName <ip address> -ConfigurationName PrivilegedEndpoint -Credential $cred -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) 
 
$stampInfo = Invoke-Command -Session $pep -ScriptBlock { Get-AzureStackStampInformation }

$rootCert = $stampInfo.RootCACertificates| Sort-Object -Property NotAfter | Select-Object -Last 1
"The Azure Stack Hub Root Certificate expires on {0}" -f $rootCert.NotAfter.ToString("D") | Write-Host -ForegroundColor Cyan

更新 BMC 認證

基礎板管理控制器會監視伺服器的實體狀態。 請洽詢您的原始設備製造商 (OEM) 硬體廠商,以取得更新 BMC 的使用者帳戶名稱和密碼的指示。

注意

您的 OEM 可能會提供額外的管理應用程式。 更新其他管理應用程式的使用者名稱或密碼,並不會影響 BMC 的使用者名稱或密碼。

  1. 依照您的 OEM 指示,更新 Azure Stack Hub 實體伺服器上的 BMC。 您環境中每個 BMC 的使用者名稱與密碼都必須相同。 BMC 使用者名稱不能超過 16 個字元。
  1. 您不再需要依照您的 OEM 指示,先更新 Azure Stack Hub 實體伺服器上的 BMC 認證。 環境中每個 BMC 的使用者名稱與密碼都必須相同,且不可超過 16 個字元。
  1. 在 Azure Stack Hub 工作階段中開啟具有特殊權限的端點。 如需相關指示,請參閱使用 Azure Stack Hub 中具有特殊權限的端點

  2. 開啟具有特殊權限端點的工作階段後,請執行下列其中一個 PowerShell 指令碼,其會使用 Invoke-Command 來執行 Set-BmcCredential。 如果您使用選擇性的 -BypassBMCUpdate 參數搭配 Set-BMCCredential,則不會更新 BMC 中的認證。 只會更新 Azure Stack Hub 內部資料存放區。 將具有特殊權限的端點工作階段變數當作參數傳送。

    下列為 PowerShell 指令碼的範例,其會針對使用者名稱和密碼進行提示:

    # Interactive Version
    $PEPIp = "<Privileged Endpoint IP or Name>" # You can also use the machine name instead of IP here.
    $PEPCreds = Get-Credential "<Domain>\CloudAdmin" -Message "PEP Credentials"
    $NewBmcPwd = Read-Host -Prompt "Enter New BMC password" -AsSecureString
    $NewBmcUser = Read-Host -Prompt "Enter New BMC user name"
    
    $PEPSession = New-PSSession -ComputerName $PEPIp -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    Invoke-Command -Session $PEPSession -ScriptBlock {
        # Parameter BmcPassword is mandatory, while the BmcUser parameter is optional.
        Set-BmcCredential -BmcPassword $using:NewBmcPwd -BmcUser $using:NewBmcUser
    }
    Remove-PSSession -Session $PEPSession
    

    您也可以在變數中針對使用者名稱和密碼來進行編碼,這可能比較不安全:

    # Static Version
    $PEPIp = "<Privileged Endpoint IP or Name>" # You can also use the machine name instead of IP here.
    $PEPUser = "<Privileged Endpoint user for example Domain\CloudAdmin>"
    $PEPPwd = ConvertTo-SecureString '<Privileged Endpoint Password>' -AsPlainText -Force
    $PEPCreds = New-Object System.Management.Automation.PSCredential ($PEPUser, $PEPPwd)
    $NewBmcPwd = ConvertTo-SecureString '<New BMC Password>' -AsPlainText -Force
    $NewBmcUser = "<New BMC User name>"
    
    $PEPSession = New-PSSession -ComputerName $PEPIp -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
    
    Invoke-Command -Session $PEPSession -ScriptBlock {
        # Parameter BmcPassword is mandatory, while the BmcUser parameter is optional.
        Set-BmcCredential -BmcPassword $using:NewBmcPwd -BmcUser $using:NewBmcUser
    }
    Remove-PSSession -Session $PEPSession
    

參考:Start-SecretRotation Cmdlet

Start-SecretRotation Cmdlet 會輪替 Azure Stack Hub 系統的基礎結構祕密。 此 Cmdlet 僅能針對 Azure Stack Hub 具特殊權限的端點執行,方法是在 -Session 參數中,使用 Invoke-Command 指令碼區塊來傳遞 PEP 工作階段。 根據預設,其只會輪替所有外部網路基礎結構端點的憑證。

參數 類型 必要 位置 預設 描述
PfxFilesPath String False 已命名 None \Certificates 根資料夾的檔案共用路徑包含所有外部網路端點的憑證。 僅在輪替外部密碼時才需要。 路徑必須以 \Certificates 資料夾結尾,例如 \\<IPAddress>\<ShareName>\Certificates
CertificatePassword SecureString False 已命名 None -PfXFilesPath 中所提供所有憑證的密碼。 如果 PfxFilesPath 是在輪替外部密碼時提供,則為必要值。
Internal String False 已命名 None 每當 Azure Stack Hub 操作員想要輪替內部基礎結構祕密時,都必須使用 Internal 旗標。
PathAccessCredential PSCredential False 已命名 None \Certificates 目錄檔案共用的 PowerShell 認證包含所有外部網路端點的憑證。 僅在輪替外部密碼時才需要。
ReRun SwitchParameter False 已命名 None 在嘗試失敗之後,每當想重新嘗試秘密輪替時都必須使用。

語法

針對外部祕密輪替

Start-SecretRotation [-PfxFilesPath <string>] [-PathAccessCredential <PSCredential>] [-CertificatePassword <SecureString>]  

針對內部祕密輪替

Start-SecretRotation [-Internal]  

針對外部祕密輪替的重新執行

Start-SecretRotation [-ReRun]

針對內部祕密輪替的重新執行

Start-SecretRotation [-ReRun] [-Internal]

範例

僅輪替內部基礎結構祕密

此命令必須透過您 Azure Stack Hub 環境的具特殊權限端點來執行。

PS C:\> Start-SecretRotation -Internal

此命令會輪替對 Azure Stack Hub 內部網路公開的所有基礎結構秘密。

僅輪替外部基礎結構祕密

# Create a PEP Session
winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
$PEPCreds = Get-Credential
$PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)

# Create Credentials for the fileshare
$CertPassword = ConvertTo-SecureString '<CertPasswordHere>' -AsPlainText -Force
$CertShareCreds = Get-Credential
$CertSharePath = "<NetworkPathOfCertShare>"
# Run Secret Rotation
Invoke-Command -Session $PEPsession -ScriptBlock {
    param($CertSharePath, $CertPassword, $CertShareCreds )
    Start-SecretRotation -PfxFilesPath $CertSharePath -PathAccessCredential $CertShareCreds -CertificatePassword $CertPassword
} -ArgumentList ($CertSharePath, $CertPassword, $CertShareCreds)
Remove-PSSession -Session $PEPSession

此命令會輪替用於 Azure Stack Hub 外部網路基礎結構端點的 TLS 憑證。

輪替內部和外部基礎結構密碼 (僅限 1811 之前的版本)

重要

這個命令僅適用於 Azure Stack Hub 1811 之前的版本,因為已為內部和外部憑證分割輪替。

從 1811+ 版開始,您無法再同時輪替內部和外部憑證!

# Create a PEP Session
winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
$PEPCreds = Get-Credential
$PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
# Create Credentials for the fileshare
$CertPassword = ConvertTo-SecureString '<CertPasswordHere>' -AsPlainText -Force
$CertShareCreds = Get-Credential
$CertSharePath = "<NetworkPathOfCertShare>"
# Run Secret Rotation
Invoke-Command -Session $PEPSession -ScriptBlock {
    Start-SecretRotation -PfxFilesPath $using:CertSharePath -PathAccessCredential $using:CertShareCreds -CertificatePassword $using:CertPassword
}
Remove-PSSession -Session $PEPSession

此命令會輪替向 Azure Stack Hub 內部網路公開的基礎結構祕密,以及用於 Azure Stack Hub 外部網路基礎結構端點的 TLS 憑證。 Start-SecretRotation 會輪替所有堆疊產生的秘密,且因為有提供認證,外部端點憑證也會輪替。

後續步驟

深入了解 Azure Stack Hub 安全性