如何轮换 Azure Stack Hub 上事件中心的机密

本文将向你演示如何轮换事件中心资源提供程序所使用的机密。

概述与先决条件

Note

目前,对于增值资源提供商(RPs),仅支持通过 PowerShell 实现机密轮换。 此外,由于当前不会自动生成管理类警报,你必须定期主动轮换增值型 RP 的密钥。

与 Azure Stack Hub 基础结构一样,增值资源提供程序同时使用内部和外部机密。 机密可以采用多种形式,包括密码和 X509 证书维护的加密密钥。 作为操作员,你负责:

  • 提供更新的外部机密,例如用于保护资源提供程序终结点的新 TLS 证书。
  • 定期管理资源供应商的密钥轮换。

为轮换过程做准备:

  1. 在获取/续订 X509 证书之前,请查看Azure Stack Hub公钥基础结构(PKI)证书要求,了解重要的先决条件信息,包括所需 PFX 格式的详细信息。 另请查看 “可选 PaaS 证书”部分中为特定增值资源提供程序指定的要求。

  2. 如果尚未安装, 请先安装适用于 Azure Stack Hub 的 PowerShell Az 模块 ,然后再继续作。 Azure Stack Hub 密钥轮换需要版本 2.0.2-preview 或更高版本。 有关详细信息,请参阅 从 AzureRM 迁移到 Azure Stack Hub 中的 Azure PowerShell Az。

准备新的 TLS 证书

接下来,创建或续订 TLS 证书来保护增值资源提供程序终结点:

  1. 完成为资源提供程序 生成证书签名请求(CSR)中的步骤,以便续订证书 。 使用Azure Stack Hub就绪情况检查器工具创建 CSR。 请务必在“为其他 Azure Stack Hub 服务生成证书请求”步骤中,运行适用于你的资源提供程序的正确 cmdlet。 例如,New-AzsHubEventHubsCertificateSigningRequest用于Azure 事件中心。 完成后,将生成的 .REQ 文件提交给您的证书颁发机构(CA),以申请新证书。

  2. 从 CA 收到证书文件后,请完成 准备证书以部署或轮换的步骤。 再次使用就绪情况检查器工具处理从 CA 返回的文件。

  3. 最后,完成 验证 Azure Stack Hub PKI 证书中的步骤。 再次使用就绪情况检查器工具对新证书执行验证测试。

轮换机密

最后,确定资源提供程序的最新部署属性,并使用它们来完成机密轮换过程。

确定部署属性

资源提供程序作为版本控制的产品包部署到Azure Stack Hub环境中。 软件包会被分配一个唯一的软件包 ID,格式为 '<product-id>.<installed-version>'。 其中 <product-id> 是表示资源提供程序的唯一字符串,并 <installed-version> 表示特定版本。 与每个包关联的机密存储在Azure Stack Hub 密钥保管库服务中。

打开提升权限的 PowerShell 控制台,并完成以下步骤以确定轮换资源提供程序的机密所需的属性:

  1. 使用操作员凭据登录到 Azure Stack Hub 环境。 请参阅 使用 PowerShell 连接到 Azure Stack Hub 的登录脚本。 请务必使用 PowerShell Az cmdlet(而不是 AzureRM),并替换所有占位符值,例如终结点 URL 和目录租户名称。

  2. 运行 Get-AzsProductDeployment cmdlet 以检索最新资源提供程序部署的列表。 返回的 "value" 集合包含每个已部署资源提供者的一个元素。 查找感兴趣的资源提供程序并记下这些属性的值:

    • "name" - 包含值第二段中的资源提供程序产品 ID。
    • "properties"."deployment"."version" - 包含当前部署的版本号。

    在以下示例中,请注意集合中的第一个元素里的 Event Hubs RP 部署,其产品 ID 为 "microsoft.eventhub",版本为 "1.2003.0.0":

    PS C:\WINDOWS\system32> Get-AzsProductDeployment -AsJson
    VERBOSE: GET https://adminmanagement.myregion.mycompany.com/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Deployment.Admin/locations/global/productDeployments?api-version=2019-01-01 with 0-char payload
    VERBOSE: Received 2656-char response, StatusCode = OK
    {
        "value":  [
                      {
                          "id":  "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Deployment.Admin/locations/global/productDeployments/microsoft.eventhub",
                          "name":  "global/microsoft.eventhub",
                          "type":  "Microsoft.Deployment.Admin/locations/productDeployments",
                          "properties":  {
                                             "status":  "DeploymentSucceeded",
                                             "subscriptionId":  "bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f",
                                             "deployment":  {
                                                                "version":  "1.2003.0.0",
                                                                "actionPlanInstanceResourceId":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Deployment.Admin/locations/global/actionplans/cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a",
                                                                "parameters":  {
    
                                                                               }
                                                            },
                                             "lastSuccessfulDeployment":  {
                                                                              "version":  "1.2003.0.0",
                                                                              "actionPlanInstanceResourceId":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Deployment.Admin/locations/global/actionplans/cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a",
                                                                              "parameters":  {
    
                                                                                             }
                                                                          },
                                             "provisioningState":  "Succeeded"
                                         }
                      },
                      {
                      ...
                      }
                  ]
    }
    
  3. 通过连接资源提供程序产品 ID 和版本来生成资源提供程序的包 ID。 例如,使用在上一步派生的值时,事件中心 RP 包 ID 为 microsoft.eventhub.1.2003.0.0。

  4. 使用上一步派生的包 ID,运行 Get-AzsProductSecret -PackageId 以检索资源提供程序使用的机密类型列表。 在返回的value集合中,查找属性"Certificate"的值为"properties"."secretKind"的元素。 此元素包含 RP 证书机密的属性。 记下此证书密钥的名称,它由属性中的最后一段 "name" 标识,位于 "properties" 的上方。

    在以下示例中,为事件中心 RP 返回的机密集合包含一个名为 的 机密。

    PS C:\WINDOWS\system32> Get-AzsProductSecret -PackageId 'microsoft.eventhub.1.2003.0.0' -AsJson
    VERBOSE: GET
    https://adminmanagement.myregion.mycompany.com/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Deployment.Admin/locations/global/productPackages/microsoft.eventhub.1.2003.0.0/secrets?api-version=2019-01-01 with 0-char payload
    VERBOSE: Received 617-char response, StatusCode = OK
    {
        "value":  [
                        {
                            "id":  "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Deployment.Admin/locations/global/productPackages/microsoft.eventhub.1.2003.0.0/secrets/aseh-ssl-gateway-pfx",
                            "name":  "global/microsoft.eventhub.1.2003.0.0/aseh-ssl-gateway-pfx",
                            "type":  "Microsoft.Deployment.Admin/locations/productPackages/secrets",
                            "properties":  {
                                            "secretKind":  "Certificate",
                                            "description":  "Event Hubs gateway SSL certificate.",
                                            "expiresAfter":  "P730D",
                                            "secretDescriptor":  {
    
                                                                    },
                                            "secretState":  {
                                                                "status":  "Deployed",
                                                                "rotationStatus":  "None",
                                                                "expirationDate":  "2022-03-31T00:16:05.3068718Z"
                                                            },
                                            "provisioningState":  "Succeeded"
                                        }
                        },
                        ...
                    ]
    }
    

轮换机密

  1. 使用 Set-AzsProductSecret cmdlet 将新证书导入 密钥保管库,该证书将由轮换过程使用。 在运行脚本之前,请相应地替换变量占位符值:

    Placeholder Description 示例值
    <product-id> 最新资源提供程序部署的产品 ID。 microsoft.eventhub
    <installed-version> 最新资源提供程序部署的版本。 1.2003.0.0
    <cert-secret-name> 用于存储证书机密的名称。 aseh-ssl-gateway-pfx
    <cert-pfx-file-path> 证书 PFX 文件的路径。 C:\dir\eh-cert-file.pfx
    <pfx-password> 分配给您证书 .PFX 文件的密码。 strong@CertSecret6
    $productId = '<product-id>'
    $packageId = $productId + '.' + '<installed-version>'
    $certSecretName = '<cert-secret-name>' 
    $pfxFilePath = '<cert-pfx-file-path>'
    $pfxPassword = ConvertTo-SecureString '<pfx-password>' -AsPlainText -Force   
    Set-AzsProductSecret -PackageId $packageId -SecretName $certSecretName -PfxFileName $pfxFilePath -PfxPassword $pfxPassword -Force
    
  2. 最后,使用 Invoke-AzsProductRotateSecretsAction cmdlet 轮换内部和外部机密:

    Note

    完成轮换过程大约需要 3.5 - 4 小时。

    Invoke-AzsProductRotateSecretsAction -ProductId $productId
    

    可以通过在 PowerShell 控制台或管理员门户中选择市场服务中的资源提供程序来监视机密轮换进度:

    secret-rotation-progress

Troubleshooting

机密轮换应顺利完成,不应出现错误。 如果在管理员门户中遇到以下任一条件, 请提出支持请求 以获取帮助:

  • 身份验证问题,包括连接事件中心资源提供程序时出现的问题。
  • 无法升级资源提供程序或编辑配置参数。
  • 未显示使用情况指标。
  • 帐单未生成。
  • 未执行备份。

后续步骤

有关轮换Azure Stack Hub基础结构机密的详细信息,请访问Azure Stack Hub轮换机密。