在 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 中得到解决。 除非环境处于活动状态的时间已达两年,否则内部机密不会过期。
先决条件
强烈建议你运行受支持的 Azure Stack Hub 版本,并为实例运行的 Azure Stack Hub 版本应用最新发布的修补程序。 例如,如果运行的是 2008,请确保已安装适用于 2008 的最新修补程序。
重要
对于 1811 之前的版本:
- 如果已执行机密轮换,必须在再次执行机密轮换之前将版本更新为 1811 或更高版本。 必须通过特权终结点执行机密轮换,且需要有 Azure Stack Hub 操作员凭据。 如果你不知道是否已在环境中运行过机密轮换,在执行机密轮换之前,请先更新到 1811。
- 无需轮换机密即可添加扩展主机证书。 应该按照准备 Azure Stack Hub 的扩展主机一文中的说明添加扩展主机证书。
向用户通知计划内维护操作。 将普通的维护时间段尽量安排在非营业时间。 维护操作可能会同时影响用户工作负荷和门户操作。
在机密轮换期间,操作员可能会注意到警报在打开后又自动关闭。 此行为是预期行为,可以忽略警报。 操作员可以使用 Test-AzureStack PowerShell cmdlet 来验证这些警报的有效性。 对于使用 System Center Operations Manager 监视 Azure Stack Hub 系统的操作员而言,将系统置于维护模式可以防止这些警报发送到其 ITSM 系统。 但是,如果 Azure Stack Hub 系统不可访问,警报将继续出现。
轮换外部机密
重要
以下项的外部机密轮换:
本部分介绍用于保护对外服务的证书的轮换。 这些证书由 Azure Stack Hub 操作员提供,用于以下服务:
- 管理员门户
- 公共门户
- 管理员 Azure 资源管理器
- 全局 Azure 资源管理器
- 管理员 Key Vault
- 密钥保管库
- 管理扩展主机
- ACS(包括 Blob、表和队列存储)
- ADFS1
- Graph1
- 容器注册表2
1使用 Active Directory 联合身份验证服务 (ADFS) 时适用。
2使用 Azure 容器注册表 (ACR) 时适用。
准备工作
在轮换外部机密之前:
在轮换机密之前使用
-group SecretRotationReadiness
参数运行Test-AzureStack
PowerShell cmdlet,以确认所有测试输出正常。准备新的替换性的外部证书集:
新集必须与 Azure Stack Hub PKI 证书要求中所述的证书规范匹配。
生成要提交到证书颁发机构 (CA) 的证书签名请求 (CSR)。 使用生成证书签名请求中概述的步骤进行操作,并使用准备 PKI 证书中的步骤来准备它们,以便在 Azure Stack Hub 环境中使用。 在以下上下文中,Azure Stack Hub 支持对新证书颁发机构 (CA) 颁发的外部证书进行机密轮换:
从 CA 轮换 轮换到 CA Azure Stack Hub 版本支持 自签名 企业 1903 及更高版本 自签名 自签名 不支持 自签名 公共* 1803 及更高版本 Enterprise Enterprise 1803 及更高版本;如果企业 CA 与部署时使用的相同,则为 1803-1903 企业 自签名 不支持 企业 公共* 1803 及更高版本 公共* Enterprise 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
。 请确保替换外部证书的使用者可选名称 (SAN) 遵循 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
*为 Microsoft Entra ID 和 ADFS 使用 Azure 容器注册表 (ACR) 时适用。
注意
如果你要轮换外部容器注册表证书,必须在标识提供者子文件夹中手动创建一个 Container Registry
子文件夹。 此外,必须将相应的 .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 参考:参数 变量 说明 -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'
”。 从共享(在“准备”部分创建)中删除证书,将其存储在安全的备份位置。注意
如果机密轮换失败,请按照错误消息中的说明操作,结合
-ReRun
参数重新运行Start-SecretRotation
。Start-SecretRotation -ReRun
如果遇到反复的机密轮换失败,请联系技术支持。
(可选)若要确认是否已轮换所有外部证书,请使用以下脚本运行 Test-AzureStack 验证工具:
Test-AzureStack -Include AzsExternalCertificates -DetailedResults -debug
轮换内部机密
内部机密包括由 Azure Stack Hub 基础结构使用的证书、密码、安全字符串和密钥,无需 Azure Stack Hub 操作员的介入。 仅当你怀疑某个机密已泄露或收到机密过期的警报时,才需要轮换内部机密。
在 1811 之前的部署中,你可能会看到内部证书挂起或机密过期的警报。 这些警报不准确,应该将其忽略,这是 1811 中已解决的已知问题。
完成以下步骤来轮换内部机密:
运行下面的 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
标志。成功完成后,控制台会显示“
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 用户名或密码。
- 按照 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 会话。 默认情况下,它只轮换所有外部网络基础结构终结点的证书。
参数 | 类型 | 必须 | 位置 | 默认 | 说明 |
---|---|---|---|---|---|
PfxFilesPath |
String | False | 名为 | 无 | 包含所有外部网络终结点证书的 \Certificates 根文件夹的文件共享路径。 仅当轮换外部机密时才需要。 路径必须以 \Certificates 文件夹结尾,例如 \\<IPAddress>\<ShareName>\Certificates。 |
CertificatePassword |
SecureString | False | 名为 | 无 | -PfXFilesPath 中提供的所有证书的密码。 如果在轮换外部机密时提供了 PfxFilesPath,则是必需的值。 |
Internal |
String | False | 名为 | 无 | 每当 Azure Stack Hub 操作员想要轮换内部基础结构机密时,都必须使用 Internal 标志。 |
PathAccessCredential |
PSCredential | False | 名为 | 无 | 包含所有外部网络终结点证书的 \Certificates 目录的文件共享的 PowerShell 凭据。 仅当轮换外部机密时才需要。 |
ReRun |
SwitchParameter | False | 名为 | 无 | 每当机密轮换尝试失败后重新进行尝试时,都必须使用此项。 |
语法
对于外部机密轮换
Start-SecretRotation [-PfxFilesPath <string>] [-PathAccessCredential <PSCredential>] [-CertificatePassword <SecureString>]
对于内部机密轮换
Start-SecretRotation [-Internal]
对于外部机密轮换 rerun
Start-SecretRotation [-ReRun]
对于内部机密轮换 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 轮换堆栈生成的所有机密,由于提供了证书,因此也会轮换外部终结点证书。