次の方法で共有


2 セットの認証資格情報を持つリソースのシークレットのローテーションを自動化する

Azure サービスに対して認証を行う最善の方法は マネージド ID を使用することですが、オプションではないシナリオがいくつかあります。 このような場合は、アクセス キーまたはパスワードが使用されます。 アクセス キーとパスワードは頻繁にローテーションする必要があります。

このチュートリアルでは、2 セットの認証資格情報を使用するデータベースとサービスのシークレットの定期的なローテーションを自動化する方法について説明します。 さまざまな資産の種類にわたる自動ローテーションの概念と利点の包括的な概要については、「 Azure Key Vault の自動ローテーションについて」を参照してください。

具体的には、このチュートリアルでは、Azure Key Vault に格納されている Azure Storage アカウント キーをシークレットとしてローテーションする方法について説明します。 Azure Event Grid 通知によってトリガーされる関数を使用します。

ストレージ アカウント サービスの場合は、Microsoft Entra ID を使用して要求を承認することをお勧めします。 詳しくは、Microsoft Entra ID を使用した BLOB へのアクセスの認可に関する記事をご覧ください。 アクセス キーを持つストレージ アカウント接続文字列を必要とするサービスがあります。 このシナリオでは、このソリューションをお勧めします。

このチュートリアルで説明する回転ソリューションを次に示します。

回転ソリューションを示す図。

このソリューションでは、Azure Key Vault はストレージ アカウントの個々のアクセス キーを同じシークレットのバージョンとして格納し、以降のバージョンではプライマリ キーとセカンダリ キーを交互に格納します。 1 つのアクセス キーが最新バージョンのシークレットに格納されると、代替キーが再生成され、シークレットの新しい最新バージョンとして Key Vault に追加されます。 このソリューションは、最新の再生成されたキーに更新するアプリケーションのローテーション サイクル全体を提供します。

  1. シークレットの有効期限日の 30 日前に、Key Vault は有効期限に近いイベントを Event Grid に発行します。
  2. Event Grid はイベント サブスクリプションをチェックし、HTTP POST を使用して、イベントをサブスクライブしている関数アプリ エンドポイントを呼び出します。
  3. 関数アプリは、(最新のキーではなく) 代替キーを識別し、ストレージ アカウントを呼び出して再生成します。
  4. 関数アプリは、新しい再生成されたキーをシークレットの新しいバージョンとして Azure Key Vault に追加します。

[前提条件]

  • Azure サブスクリプション。 無料で作成できます。
  • Azure Cloud Shell。 このチュートリアルでは、ポータル Cloud Shell と PowerShell env を使用しています
  • Azure Key Vault。
  • 2 つの Azure ストレージ アカウント。

共有ストレージ アカウント キーのローテーションでは、そのキーに基づいて生成されたアカウント レベルの Shared Access Signature (SAS) が取り消されます。 ストレージ アカウント キーのローテーション後、アプリケーションの中断を回避するために、アカウント レベルの SAS トークンを再生成する必要があります。

既存のキー コンテナーと既存のストレージ アカウントがない場合は、このデプロイ リンクを使用できます。

[Deploy to Azure]\(Azure へのデプロイ\) というラベルの付いたリンク。

  1. [リソース グループ] で、 [新規作成] を選択します。 グループ ボールトのローテーション に名前を付け、OK を選択します。

  2. [Review + create](レビュー + 作成) を選択します。

  3. を選択してを作成します。

    リソース グループを作成する方法を示すスクリーンショット。

これで、キー コンテナーと 2 つのストレージ アカウントが作成されます。 このセットアップは、Azure CLI または Azure PowerShell で次のコマンドを実行して確認できます。

az resource list -o table -g vaultrotation

結果は次の出力のようになります。

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
vaultrotation-kv         vaultrotation      westus      Microsoft.KeyVault/vaults
vaultrotationstorage     vaultrotation      westus      Microsoft.Storage/storageAccounts
vaultrotationstorage2    vaultrotation      westus      Microsoft.Storage/storageAccounts

キー ローテーション関数を作成してデプロイする

次に、他の必要なコンポーネントに加えて、システムマネージド ID を持つ関数アプリを作成します。 また、ストレージ アカウント キーのローテーション関数もデプロイします。

関数アプリのローテーション関数には、次のコンポーネントと構成が必要です。

  • Azure App Service プラン
  • 関数アプリ トリガーを管理するためのストレージ アカウント
  • Key Vault 内のシークレットにアクセスするためのアクセス ポリシー
  • ストレージ アカウント アクセス キーにアクセスできるように、関数アプリに割り当てられたストレージ アカウント キー オペレーター サービス ロール
  • イベント トリガーと HTTP トリガーを含むキー ローテーション関数 (オンデマンド ローテーション)
  • SecretNearExpiry イベントの Event Grid イベント サブスクリプション
  1. Azure テンプレートのデプロイ リンクを選択します。

    Azure テンプレートのデプロイ リンク。

  2. リソース グループの一覧で、vaultrotationを選択します。

  3. [ ストレージ アカウント RG ] ボックスに、ストレージ アカウントが配置されているリソース グループの名前を入力します。 ストレージ アカウントが、キー ローテーション関数をデプロイするのと同じリソース グループに既に存在する場合は、既定値 [resourceGroup().name] をそのまま使用します。

  4. [ ストレージ アカウント名] ボックスに、ローテーションするアクセス キーを含むストレージ アカウントの名前を入力します。 前提条件で作成したストレージ アカウントを使用する場合 は、既定値 [concat(resourceGroup().name, 'storage')] のままに します

  5. [ Key Vault RG ] ボックスに、キー コンテナーが配置されているリソース グループの名前を入力します。 キー ローテーション関数をデプロイするのと同じリソース グループにキー コンテナーが既に存在する場合は、既定値 [resourceGroup().name] のままにします。

  6. [ キー コンテナー名 ] ボックスに、キー コンテナーの名前を入力します。 前提条件で作成したキー コンテナーを使用する場合は、既定値 [concat(resourceGroup().name, '-kv')] をそのまま使用してください。

  7. [ App Service プランの種類 ] ボックスで、[ホスティング プラン] を選択します。 Premium プラン は、キー コンテナーがファイアウォールの内側にある場合にのみ必要です。

  8. [ 関数アプリ名 ] ボックスに、関数アプリの名前を入力します。

  9. [ シークレット名] ボックスに、アクセス キーを格納するシークレットの名前を入力します。

  10. [ Repo URL ] ボックスに、関数コードの GitHub の場所を入力します。 このチュートリアルでは、 https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git を使用できます。

  11. [Review + create](レビュー + 作成) を選択します。

  12. を選択してを作成します。

    関数を作成してデプロイする方法を示すスクリーンショット。

上記の手順を完了すると、ストレージ アカウント、サーバー ファーム、関数アプリ、Application Insights が作成されます。 デプロイが完了すると、次のページが表示されます。

[デプロイが完了しました] ページを示すスクリーンショット。

エラーが発生した場合は、[ 再デプロイ ] を選択してコンポーネントのデプロイを完了できます。

ローテーション関数のデプロイ テンプレートとコードについては、 Azure サンプルを参照してください

ストレージ アカウントのアクセス キーを Key Vault シークレットに追加する

まず、アクセス ポリシーを設定して、 管理シークレットの アクセス許可をユーザー プリンシパルに付与します。

az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list

ストレージ アカウントのアクセス キーを値として使用して、新しいシークレットを作成できるようになりました。 また、ストレージ アカウントのリソース ID、シークレットの有効期間、およびキー ID をシークレットに追加して、ローテーション関数がストレージ アカウント内のキーを再生成できるようにする必要もあります。

ストレージ アカウントのリソース ID を決定します。 この値は、 id プロパティにあります。

az storage account show -n vaultrotationstorage

キー値を取得できるように、ストレージ アカウントのアクセス キーを一覧表示します。

az storage account keys list -n vaultrotationstorage

有効期間が 60 日間のキー コンテナーにシークレットを追加し、ストレージ アカウント リソース ID を使用して、有効期限を明日にすぐに設定してローテーションをトリガーするデモンストレーションを目的としています。 key1ValuestorageAccountResourceIdの取得した値を使用して、次のコマンドを実行します。

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

このシークレットは、数分以内 SecretNearExpiry イベントをトリガーします。 このイベントにより、有効期限が 60 日に設定されたシークレットをローテーションする関数がトリガーされます。 この構成では、'SecretNearExpiry' イベントは 30 日 (有効期限の 30 日前) ごとにトリガーされ、ローテーション関数は key1 と key2 の間のローテーションを交互に行います。

アクセス キーが再生成されたことを確認するには、ストレージ アカウント キーと Key Vault シークレットを取得して比較します。

次のコマンドを使用して、シークレット情報を取得します。

az keyvault secret show --vault-name vaultrotation-kv --name storageKey

CredentialIdが代替keyNameに更新され、valueが再生成されていることに注意してください。

最初のストレージ アカウントの A Z keyvault secret show コマンドの出力を示すスクリーンショット。

アクセス キーを取得して値を比較します。

az storage account keys list -n vaultrotationstorage 

キーの value は、キー コンテナー内のシークレットと同じであることに注意してください。

最初のストレージ アカウントの A Z ストレージ アカウント キー リスト コマンドの出力を示すスクリーンショット。

複数のストレージ アカウントに既存のローテーション関数を使用する

同じ関数アプリを再利用して、複数のストレージ アカウントのキーをローテーションできます。

ローテーションのためにストレージ アカウント キーを既存の関数に追加するには、次のものが必要です。

  • ストレージ アカウント アクセス キーにアクセスできるように、関数アプリに割り当てられたストレージ アカウント キー オペレーター サービス ロール。
  • SecretNearExpiry イベントの Event Grid イベント サブスクリプション。
  1. Azure テンプレートのデプロイ リンクを選択します。

    Azure テンプレートのデプロイ リンク。

  2. リソース グループの一覧で、vaultrotationを選択します。

  3. [ ストレージ アカウント RG ] ボックスに、ストレージ アカウントが配置されているリソース グループの名前を入力します。 ストレージ アカウントが、キー ローテーション関数をデプロイするのと同じリソース グループに既に存在する場合は、既定値 [resourceGroup().name] をそのまま使用します。

  4. [ ストレージ アカウント名] ボックスに、ローテーションするアクセス キーを含むストレージ アカウントの名前を入力します。

  5. [ Key Vault RG ] ボックスに、キー コンテナーが配置されているリソース グループの名前を入力します。 キー ローテーション関数をデプロイするのと同じリソース グループにキー コンテナーが既に存在する場合は、既定値 [resourceGroup().name] のままにします。

  6. [ キー コンテナー名 ] ボックスに、キー コンテナーの名前を入力します。

  7. [ 関数アプリ名 ] ボックスに、関数アプリの名前を入力します。

  8. [ シークレット名] ボックスに、アクセス キーを格納するシークレットの名前を入力します。

  9. [Review + create](レビュー + 作成) を選択します。

  10. を選択してを作成します。

    追加のストレージ アカウントを作成する方法を示すスクリーンショット。

Key Vault シークレットにストレージ アカウント アクセス キーを追加する

ストレージ アカウントのリソース ID を決定します。 この値は、 id プロパティにあります。

az storage account show -n vaultrotationstorage2

key2 値を取得できるように、ストレージ アカウントのアクセス キーを一覧表示します。

az storage account keys list -n vaultrotationstorage2

有効期間が 60 日間のキー コンテナーにシークレットを追加し、ストレージ アカウント リソース ID を使用して、有効期限を明日にすぐに設定してローテーションをトリガーするデモンストレーションを目的としています。 key2ValuestorageAccountResourceIdの取得した値を使用して、次のコマンドを実行します。

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

次のコマンドを使用して、シークレット情報を取得します。

az keyvault secret show --vault-name vaultrotation-kv --name storageKey2

CredentialIdが代替keyNameに更新され、valueが再生成されていることに注意してください。

2 つ目のストレージ アカウントの A Z keyvault secret show コマンドの出力を示すスクリーンショット。

アクセス キーを取得して値を比較します。

az storage account keys list -n vaultrotationstorage 

キーの value は、キー コンテナー内のシークレットと同じであることに注意してください。

2 番目のストレージ アカウントの A Z ストレージ アカウント キー リスト コマンドの出力を示すスクリーンショット。

シークレットのローテーションを無効にする

シークレットの Event Grid サブスクリプションを削除するだけで、シークレットのローテーションを無効にすることができます。 Azure PowerShell Remove-AzEventGridSubscription コマンドレットまたは Azure CLI az event grid event--subscription delete コマンドを使用します。

Key Vault の 2 セットの資格情報のローテーション機能

資格情報の2セットに対応する循環関数テンプレートと、すぐに使用できるいくつかの関数。

これらのローテーション関数は、Microsoft ではなくコミュニティのメンバーによって作成されます。 コミュニティ機能は、Microsoft サポート プログラムまたはサービスではサポートされておらず、いかなる種類の保証もなく、AS IS で利用できます。

次のステップ