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

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

概述与先决条件

注意

目前仅支持通过 PowerShell 进行的增值资源提供程序 (RP) 的机密轮换。 此外,你必须定期主动轮换增值 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 或更高版本。 有关详细信息,请参阅在 Azure Stack Hub 中从 AzureRM 迁移到 Azure PowerShell Az

准备新的 TLS 证书

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

  1. 完成为资源提供程序的证书续订生成证书签名请求 (CSR) 中的步骤。 在这里,可使用 Azure Stack Hub 就绪性检查器工具来创建 CSR。 请确保在“为其他 Azure Stack Hub 服务生成证书请求”步骤中为资源提供程序运行正确的 cmdlet。 例如,New-AzsHubEventHubsCertificateSigningRequest 用于事件中心。 完成后,将生成的 .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 Key Vault 服务中。

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

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

  2. 运行 Get-AzsProductDeployment cmdlet 可检索最新资源提供程序部署的列表。 对于每个已部署的资源提供程序,返回的 "value" 集合都包含一个对应的元素。 找到相关的资源提供程序,并且记下这些属性的值:

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

    在下面的示例中,请注意集合中第一个元素的事件中心 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 集合中,查找包含 "properties"."secretKind" 属性的值 "Certificate" 的元素。 此元素包含 RP 证书密钥的属性。 记下分配给此证书机密的名称,该名称由 "name" 属性的最后一段标识,就在 "properties" 上方。

    在以下示例中,为事件中心 RP 返回的机密集合包含名为 aseh-ssl-gateway-pfx"Certificate" 机密。

    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 将新证书导入到 Key Vault,该新证书将由轮换过程使用。 在运行脚本之前,请相应地替换变量占位符值:

    占位符 说明 示例值
    <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 来轮换内部机密和外部机密:

    注意

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

    Invoke-AzsProductRotateSecretsAction -ProductId $productId
    

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

    secret-rotation-progress

疑难解答

机密轮换应成功完成,且不发生错误。 如果在管理员门户中遇到以下任何情况,可以提交支持请求获取帮助:

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

后续步骤

若要详细了解如何轮换 Azure Stack Hub 基础结构机密,请访问在 Azure Stack Hub 中轮换机密