Azure Stack Hub で Event Hubs のシークレットをローテーションする方法

この記事では、Event Hubs リソース プロバイダーで使用されるシークレットをローテーションする方法について説明します。

概要と前提条件

Note

付加価値リソース プロバイダー (RP) に対するシークレットのローテーションは、現在、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 以降のバージョンが必要です。 詳細については、「Azure Stack Hub での AzureRM から Azure PowerShell Az への移行」を参照してください。

新しい TLS 証明書を準備する

次に、付加価値リソース プロバイダーのエンドポイントを保護するための TLS 証明書を作成または更新します。

  1. ご利用のリソース プロバイダーに対し、証明書更新のための証明書署名要求 (CSR) を生成する手順を実行します。 ここでは、Azure Stack Hub 適合性チェッカー ツールを使用して CSR を作成します。 "他の Azure Stack Hub サービスへの証明書要求を生成する" 手順では、必ず、ご利用のリソース プロバイダーに合った適切なコマンドレットを実行してください。 たとえば、Event Hubs には New-AzsHubEventHubsCertificateSigningRequest を使用します。 完了したら、生成された .REQ ファイルを証明機関 (CA) に送信して、新しい証明書を申請します。

  2. CA から証明書ファイルを受け取ったら、デプロイまたはローテーションのために証明書を準備する手順を実行します。 再度、適合性チェッカー ツールを使用して、CA から返されたファイルを処理します。

  3. 最後に、「Azure Stack Hub PKI 証明書の検証」の手順を実行します。 もう一度、適合性チェッカー ツールを使用して、新しい証明書の検証テストを実行します。

シークレットの切り替え

最後に、リソース プロバイダーの最新のデプロイ プロパティを決定し、それを使用してシークレットのローテーション プロセスを完了します。

デプロイ プロパティを確認する

リソース プロバイダーは、バージョン管理された製品パッケージとして、お使いの Azure Stack Hub 環境にデプロイされます。 パッケージには、'<product-id>.<installed-version>' の形式で一意のパッケージ ID が割り当てられます。 ここで <product-id> はリソース プロバイダーを表す一意の文字列で、<installed-version> は特定のバージョンを表します。 各パッケージに関連付けられているシークレットは、Azure Stack Hub Key Vault サービスに格納されます。

管理者特権の PowerShell コンソールを開き、次の手順を実行して、リソース プロバイダーのシークレットのローテーションに必要なプロパティを確認します。

  1. オペレーターの資格情報を使用して Azure Stack Hub 環境にサインインします。 PowerShell サインイン スクリプトについては、「PowerShell を使用して Azure Stack Hub に接続する」をご覧ください。 (AzureRM ではなく) PowerShell Az コマンドレットを使用して、エンドポイント URL やディレクトリ テナント名など、すべてのプレースホルダー値を置き換えます。

  2. Get-AzsProductDeployment コマンドレットを実行して、最新のリソース プロバイダー デプロイの一覧を取得します。 返された "value" コレクションには、デプロイされたリソース プロバイダーごとに要素が含まれます。 目的のリソース プロバイダーを見つけて、これらのプロパティの値をメモします。

    • "name" - 値の 2 番目のセグメント内にリソース プロバイダーの製品 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/ze22ca96-z546-zbc6-z566-z35f68799816/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/ze22ca96-z546-zbc6-z566-z35f68799816/providers/Microsoft.Deployment.Admin/locations/global/productDeployments/microsoft.eventhub",
                          "name":  "global/microsoft.eventhub",
                          "type":  "Microsoft.Deployment.Admin/locations/productDeployments",
                          "properties":  {
                                             "status":  "DeploymentSucceeded",
                                             "subscriptionId":  "b37ae55a-a6c6-4474-ba97-81519412adf5",
                                             "deployment":  {
                                                                "version":  "1.2003.0.0",
                                                                "actionPlanInstanceResourceId":"/subscriptions/ze22ca96-z546-zbc6-z566-z35f68799816/providers/Microsoft.Deployment.Admin/locations/global/actionplans/abcdfcd3-fef0-z1a3-z85d-z6ceb0f31e36",
                                                                "parameters":  {
    
                                                                               }
                                                            },
                                             "lastSuccessfulDeployment":  {
                                                                              "version":  "1.2003.0.0",
                                                                              "actionPlanInstanceResourceId":"/subscriptions/ze22ca96-z546-zbc6-z566-z35f68799816/providers/Microsoft.Deployment.Admin/locations/global/actionplans/abcdfcd3-fef0-z1a3-z85d-z6ceb0f31e36",
                                                                              "parameters":  {
    
                                                                                             }
                                                                          },
                                             "provisioningState":  "Succeeded"
                                         }
                      },
                      {
                      ...
                      }
                  ]
    }
    
  3. リソース プロバイダーの製品 ID とバージョンを連結して、リソース プロバイダーのパッケージ ID とバージョンを作成します。 たとえば、前の手順の派生した値を使用すると、Event Hubs RP パッケージ ID は microsoft.eventhub.1.2003.0.0 です。

  4. 前の手順の派生したパッケージ ID を使用して、Get-AzsProductSecret -PackageId を実行し、リソース プロバイダーによって使用されているシークレットの種類の一覧を取得します。 返された value コレクションで、"properties"."secretKind" プロパティの "Certificate" の値を含む要素を見つけます。 この要素には、RP の証明書シークレットのプロパティが含まれています。 この証明書のシークレットに割り当てられている名前をメモしておきます。これは、"properties" のすぐ上にある "name" プロパティの最後のセグメントによって特定されます。

    次の例では、Event Hubs 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/ze22ca96-z546-zbc6-z566-z35f68799816/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/ze22ca96-z546-zbc6-z566-z35f68799816/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 コマンドレットを使用して、新しい証明書を 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 コマンドレットを使用して、内部および外部のシークレットをローテーションします。

    Note

    ローテーション プロセスを完了するには、約 3.5 時間から 4 時間かかります。

    Invoke-AzsProductRotateSecretsAction -ProductId $productId
    

    PowerShell コンソールまたは管理者ポータルでシークレット ローテーションの進行状況を監視するには、Marketplace サービスでリソース プロバイダーを選択します。

    secret-rotation-progress

トラブルシューティング

シークレットのローテーションは、エラーが発生することなく正常に完了する必要があります。 管理者ポータルで次のいずれかの症状が発生した場合は、サポート リクエストを開いてください。

  • 認証の問題 (Event Hubs リソース プロバイダーへの接続の問題を含む)。
  • リソース プロバイダーをアップグレードできない、または構成パラメーターを編集できない。
  • 使用状況のメトリックが表示されない。
  • 請求書が生成されない。
  • バックアップが実行されない。

次のステップ

Azure Stack Hub インフラストラクチャのシークレットのローテーションについて詳しくは、「Azure Stack Hub でシークレットをローテーションする」を参照してください。