在 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 版本应用最新发布的修补程序。 例如,如果运行的是 2008,请确保已安装可用于 2008 的最新修补程序。

    重要

    对于 1811 之前的版本:

    • 如果已执行机密轮换,必须在再次执行机密轮换之前将版本更新为 1811 或更高版本。 必须通过特权终结点执行机密轮换,且需要有 Azure Stack Hub 操作员凭据。 如果你不知道是否已在环境中运行过机密轮换,在执行机密轮换之前,请先更新到 1811。
    • 无需轮换机密即可添加扩展主机证书。 应该按照准备 Azure Stack Hub 的扩展主机一文中的说明添加扩展主机证书。
  2. 向用户通知计划内维护操作。 将普通的维护时间段尽量安排在非营业时间。 维护操作可能会同时影响用户工作负荷和门户操作。

  3. 在机密轮换期间,操作员可能会注意到警报在打开后又自动关闭。 此行为是预期行为,可以忽略警报。 操作员可以使用 Test-AzureStack PowerShell cmdlet 来验证这些警报的有效性。 对于使用 System Center Operations Manager 监视 Azure Stack Hub 系统的操作人员来说,将系统置于维护模式会阻止这些警报到达其 ITSM 系统,但如果 Azure Stack Hub 系统变得无法访问,则会继续发出警报。

轮换外部机密

重要

以下项的外部机密轮换:

本部分介绍用于保护对外服务的证书的轮换。 这些证书由 Azure Stack Hub 操作员提供,用于以下服务:

  • 管理员门户
  • 公共门户
  • 管理员 Azure 资源管理器
  • 全局 Azure 资源管理器
  • 管理员 Key Vault
  • 密钥保管库
  • 管理扩展主机
  • ACS(包括 Blob、表和队列存储)
  • ADFS*
  • 图形*

*使用 Active Directory 联合身份验证服务 (AD FS) 时适用。

准备工作

在轮换外部机密之前:

  1. 在轮换机密之前使用 -group SecretRotationReadiness 参数运行 Test-AzureStack PowerShell cmdlet,以确认所有测试输出正常。

  2. 准备新的替换性的外部证书集:

    • 新集必须与 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 证书的常见问题

  3. 将用于轮换的证书备份存储在安全的备份位置。 如果运行轮换时失败,请使用备份副本替换文件共享中的证书,然后重新运行轮换。 将备份副本保存在安全的备份位置。

  4. 创建可从 ERCS VM 访问的文件共享。 该文件共享必须可供 CloudAdmin 标识读取和写入。

  5. 在可以访问该文件共享的计算机上打开 PowerShell ISE 控制台。 导航到你的文件共享,你将在其中创建目录来放置外部证书。

  6. CertDirectoryMaker.ps1 下载到网络文件共享,然后运行该脚本。 该脚本将创建一个符合“.\Certificates\AAD”或“.\Certificates\ADFS”的文件夹结构,具体取决于标识提供者。 网络文件共享下的文件夹结构必须以“\Certificates”文件夹开头,后面仅有“\AAD”或“\ADFS”文件夹。 其余所有子目录都会包含在前面的结构中。 例如:

    • Fileshare = \\<IPAddress>\<ShareName>
    • 文件共享中的证书根文件夹 = \\<IPAddress>\<ShareName>\Certificates
    • Azure AD 提供程序的证书文件夹的完整路径 = \\<IPAddress>\<ShareName>\Certificates\AAD
    • ADFS 提供程序的证书文件夹的完整路径 = \\<IPAddress>\<ShareName>\Certificates\ADFS

    重要

    稍后运行 Start-SecretRotation 时,请传递证书根文件夹的路径。 cmdlet 会验证文件夹结构,并会在其不合规的情况下引发以下错误:

    Cannot bind argument to parameter 'Path' because it is null.
    + CategoryInfo          : InvalidData: (:) [Test-Certificate], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Test-Certificate
    + PSComputerName        : xxx.xxx.xxx.xxx
    
  7. 将在步骤 2 中创建的一组新的替换外部证书复制到在步骤 6 中创建的“\Certificates\<IdentityProvider>”文件夹。 对于 <CertName>,请务必遵循 cert.<regionName>.<externalFQDN> 格式。

    下面是 Azure AD 标识提供者的文件夹结构示例:

        <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
                      │
                      ├───KeyVault
                      │       <CertName>.pfx
                      │
                      ├───KeyVaultInternal
                      │       <CertName>.pfx
                      │
                      ├───Public Extension Host
                      │       <CertName>.pfx
                      │
                      └───Public Portal
                              <CertName>.pfx
    
    

旋转

完成以下步骤来轮换外部机密:

  1. 使用以下 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
    
  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
    

    如果遇到反复的机密轮换失败,请联系技术支持。

更新 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 特权终结点执行,方法是使用 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 轮换堆栈生成的所有机密,由于提供了证书,因此也会轮换外部终结点证书。

后续步骤

详细了解 Azure Stack Hub 安全性