本文提供了用于执行机密轮换的指南,以帮助维护与 Azure Stack Hub 基础结构资源和服务的安全通信。
概述
Azure Stack Hub 使用机密来维护与基础结构资源和服务之间的安全通信。 为维护 Azure Stack Hub 基础结构的完整性,操作员需要能够轮换机密,轮换频率应与其组织的安全要求一致。
当机密即将过期时,会在管理员门户中生成以下警报。 完成密钥轮换可解决以下警报:
- 挂起的服务帐户密码过期
- 挂起的内部证书过期
- 挂起的外部证书过期
警告
在过期之前,管理员门户中触发的警报有 2 个阶段:
- 在过期之前 90 天时,会生成警告性警报。
- 在过期之前 30 天时,会生成关键警报。
如果收到这些通知请务必完成秘密轮换。 如果不这样做,可能会导致工作负荷丢失,并可能需要自行承担费用重新部署 Azure Stack Hub。
有关警报监控和补救的更多信息, 看看 在 Azure Stack Hub 中监控健康状况和警报.
先决条件
- 建议运行受支持的 Azure Stack Hub 版本,并为正在运行实例的 Azure Stack Hub 版本应用最新的可用修补程序。 例如,如果运行的是 2501,请确保已安装可用于 2501 的最新修补程序 。
- 向用户通知计划内维护操作。 将普通的维护时间段尽量安排在非营业时间。 维护操作可能会影响用户工作负荷和门户操作。
- 为 Azure Stack Hub 生成证书签名请求。
- 准备 Azure Stack Hub PKI 证书。
- 在秘密轮换期间,操作员可能会注意到警报会打开然后自动关闭。 此行为是预期行为,可以忽略警报。 操作员可以使用 Test-AzureStack PowerShell cmdlet 来验证这些警报的有效性。 对于使用 System Center Operations Manager 监视 Azure Stack Hub 系统的操作员而言,将系统置于维护模式可以防止这些警报发送到其 ITSM 系统。 但是,如果 Azure Stack Hub 系统不可访问,警报将继续出现。
轮换外部机密
重要
以下项的外部机密轮换:
- 非证书机密(如安全密钥和字符串):必须由管理员手动完成。 这包括用户和管理员帐户密码,以及网络交换机密码。
- 增值资源提供程序 (RP) 机密将在单独的指南中介绍:
- 轮换基板管理控制器 (BMC) 凭据是一个手动过程,本文稍后将予以介绍。
- 轮换 Azure 容器注册表外部证书是一个手动过程,本文稍后将予以介绍。
本部分介绍用于保护对外服务的证书的轮换。 这些证书由 Azure Stack Hub 操作员提供,用于以下服务:
- 管理员门户
- 公共门户
- 管理员 Azure 资源管理器
- 全局 Azure 资源管理器
- 管理员 Key Vault
- Key Vault(密钥保管库)
- 管理扩展主机
- ACS(包括 Blob、表和队列存储)
- ADFS1
- 图1
- 容器注册表2
1使用 Active Directory 联合身份验证服务 (ADFS) 时适用。
2使用 Azure 容器注册表 (ACR) 时适用。
准备工作
在轮换外部机密之前:
- 在轮换机密之前使用 - Test-AzureStack参数运行- -group SecretRotationReadinessPowerShell cmdlet,以确认所有测试输出正常。
- 准备新的替换性的外部证书集: - 新集必须与 Azure Stack Hub PKI 证书要求中所述的证书规范匹配。 
- 生成要提交到证书颁发机构 (CA) 的证书签名请求 (CSR)。 使用生成证书签名请求中概述的步骤进行操作,并使用准备 PKI 证书中的步骤来准备它们,以便在 Azure Stack Hub 环境中使用。 在以下上下文中,Azure Stack Hub 支持对新证书颁发机构 (CA) 颁发的外部证书进行机密轮换: - 从 CA 轮换 - 轮换到 CA - Azure Stack Hub 版本支持 - 自签名 - 企业 - 1903 及更高版本 - 自签名 - 自签名 - 不支持 - 自签名 - 公共* - 1803 及更高版本 - 企业 - 企业 - 1803 及更高版本;如果企业 CA 与部署时使用的相同,则为 1803-1903 - 企业 - 自签名 - 不支持 - 企业 - 公共* - 1803 及更高版本 - 公共* - 企业 - 1903 及更高版本 - 公共* - 自签名 - 不支持 - 公共* - 公共* - 1803 及更高版本 - * Windows 受信任根计划的一部分。 
- 请务必使用验证 PKI 证书中概述的步骤来验证准备的证书 
- 确保密码中没有特殊字符,例如 - $,- *,- #,- @,- or)`。
- 请确保 PFX 加密为 TripleDES-SHA1。 如果遇到问题,请参阅修复 Azure Stack Hub PKI 证书的常见问题。 
 
- 将用于轮换的证书备份存储在安全的备份位置。 如果运行轮换时失败,请使用备份副本替换文件共享中的证书,然后重新运行轮换。 将备份副本保存在安全的备份位置。 
- 创建可从 ERCS VM 访问的文件共享。 该文件共享必须可供 CloudAdmin 标识读取和写入。 
- 在可以访问该文件共享的计算机上打开 PowerShell ISE 控制台。 导航到你的文件共享,你将在其中创建目录来放置外部证书。 
- 在文件共享中创建一个名为 - Certificates的文件夹。 在 certificates 文件夹中,根据中心使用的标识提供者创建名为- AAD或- ADFS的子文件夹。 例如 .\Certificates\AAD 或 .\Certificates\ADFS。 在此处除了 certificates 文件夹和标识提供者子文件夹之外,不应创建其他文件夹。
- 将在步骤 2 中创建的一组新的替换外部证书复制到在步骤 6 中创建的 .\Certificates\<IdentityProvider> 文件夹。 如前所述,您的身份提供者子文件夹必须是 - AAD或- ADFS。 确保替换外部证书的主题备用名称(SANs)符合 Azure Stack Hub 公钥基础结构(PKI)证书要求中指定的- cert.<regionName>.<externalFQDN>格式。- 下面是 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
*适用于将 Azure 容器注册表用于 Microsoft Entra ID 和 AD FS。
注释
如果轮换外部容器注册表证书,则必须在标识提供者子文件夹中手动创建 容器注册表 子文件夹。 此外,还必须在此手动创建的子文件夹中存储相应的 .pfx 证书。
旋转
完成以下步骤来轮换外部机密:
- 使用以下 PowerShell 脚本来轮换机密。 此脚本要求访问特权终结点 (PEP) 会话。 可在托管 PEP 的虚拟机 (VM) 上通过远程 PowerShell 会话来访问 PEP。 如果使用集成系统,则有三个 PEP 实例,每个实例在不同主机上的 VM(Prefix-ERCS01、Prefix-ERCS02 或 Prefix-ERCS03)中运行。 此脚本执行以下步骤: - 使用 CloudAdmin 帐户创建具有特权终结点的 PowerShell 会话,并将会话存储为变量。 此变量在下一步用作参数。 
- 运行 Invoke-Command,将 PEP 会话变量作为 - -Session参数传递。
- 使用以下参数在 PEP 会话中运行 - Start-SecretRotation。 有关详细信息,请参阅 Start-SecretRotation 参考:- 参数 - 变量 - DESCRIPTION - -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
- 外部机密轮换需要大约一小时。 成功完成后,控制台会显示“ - ActionPlanInstanceID ... CurrentStatus: Completed”消息,后跟“- Action plan finished with status: 'Completed'”。 从共享(在“准备”部分创建)中删除证书,将其存储在安全的备份位置。- 注释 - 如果机密轮换失败,请按照错误消息中的说明操作,并使用 - Start-SecretRotation参数重新运行- -ReRun:- Start-SecretRotation -ReRun- 如果遇到反复的机密轮换失败,请联系技术支持。 
- (可选)若要确认是否已轮换所有外部证书,请使用以下脚本运行 Test-AzureStack 验证工具: - Test-AzureStack -Include AzsExternalCertificates -DetailedResults -debug
轮换内部机密
内部机密包括由 Azure Stack Hub 基础结构使用的证书、密码、安全字符串和密钥,无需 Azure Stack Hub 操作员的介入。 仅当你怀疑某个机密已泄露或收到机密过期的警报时,才需要轮换内部机密。
完成以下步骤来轮换内部机密:
- 运行以下 PowerShell 脚本。 对于内部秘密旋转,“运行秘密旋转 ”部分只使用了 - -Internal参数的 启动-SecretRotation cmdlet:- # 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
- 成功完成后,控制台会显示 - ActionPlanInstanceID ... CurrentStatus: Completed信息,然后是- Action plan finished with status: 'Completed'.- 注释 - 如果机密轮换失败,请按照错误消息中的说明操作,并使用 - Start-SecretRotation和- -Internal参数重新运行- -ReRun:- Start-SecretRotation -Internal -ReRun- 如果遇到反复的机密轮换失败,请联系技术支持。 
轮换 Azure Stack Hub 根证书
部署期间将预配 Azure Stack Hub 根证书,有效期为五年。 从 2108 开始,内部机密轮换操作也会轮换根证书。 标准机密过期警报会标识根证书的过期,并在 90 天(警告)和 30 天(严重)时生成警报。
若要轮换根证书,必须将系统更新到 2108,并执行内部机密轮换。
以下示例使用 Privileged Endpoint 列出根证书的到期日期:
$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 用户名或密码。
- 按照 OEM 说明在 Azure Stack Hub 的物理服务器上更新 BMC。 环境中每个 BMC 的用户名和密码必须相同。 BMC 用户名不能超过 16 个字符。
- 不再需要按照 OEM 的说明先在 Azure Stack Hub 物理服务器上更新 BMC 凭据。 环境中每个 BMC 的用户名和密码必须相同,并且不能超过 16 个字符。
- 在 Azure Stack Hub 会话中打开特权终结点。 有关说明,请参阅使用 Azure Stack Hub 中的特权终结点。 
- 打开特权端点会话后,运行下面的 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 特权终结点执行,方法是使用 Invoke-Command 脚本块在 -Session 参数中传递 PEP 会话。 默认情况下,它只轮换所有外部网络基础结构终结点的证书。
| 参数 | 类型 | 必选 | 位置 | 违约 | DESCRIPTION | 
|---|---|---|---|---|---|
| PfxFilesPath | 字符串 | 假 | 命名为 | 没有 | 包含所有外部网络终结点证书的 \Certificates 根文件夹的文件共享路径。 仅当轮换外部机密时才需要。 路径必须以 \Certificates 文件夹结尾,例如 \\IPAddress<\>ShareName<\Certificates。 | 
| CertificatePassword | 安全字符串 | 假 | 命名为 | 没有 | -PfXFilesPath 中提供的所有证书的密码。 如果在轮换外部机密时提供了 PfxFilesPath,则是必需的值。 | 
| Internal | 字符串 | 假 | 命名为 | 没有 | 每当 Azure Stack Hub 操作员想要轮换内部基础结构机密时,都必须使用 Internal 标志。 | 
| PathAccessCredential | PSCredential | 假 | 命名为 | 没有 | 包含所有外部网络终结点证书的 \Certificates 目录的文件共享的 PowerShell 凭据。 仅当轮换外部机密时才需要。 | 
| ReRun | 开关参数 | 假 | 命名为 | 没有 | 每当机密轮换尝试失败后重新进行尝试时,都必须使用此项。 | 
语法
对于外部机密轮换
Start-SecretRotation [-PfxFilesPath <string>] [-PathAccessCredential <PSCredential>] [-CertificatePassword <SecureString>]  
对于内部机密轮换
Start-SecretRotation [-Internal]  
对于外部机密轮换 rerun
Start-SecretRotation [-ReRun]
对于内部机密轮换 rerun
Start-SecretRotation [-ReRun] [-Internal]
例子
仅轮换内部基础结构机密
此命令必须通过 Azure Stack Hub 环境的特权终结点运行。
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 证书。