Azure サービスに対して認証する最善の方法はマネージド ID を使用することですが、一部のシナリオでは引き続きアクセス キーまたはパスワードが必要です。 これらの資格情報を頻繁にローテーションして、リークの影響を軽減します。
このチュートリアルでは、2 セットの認証資格情報を使用するデータベースとサービスの定期的なシークレット ローテーションを自動化する方法について説明します。 さまざまな資産タイプにわたる自動ローテーションの概要については、「Azure Key Vaultの自動ローテーションについて」を参照してください。
具体的には、このチュートリアルでは、Azure Key Vault にシークレットとして格納されている Azure Storage アカウント キーをローテーションします。 Azure Event Grid通知によってトリガーされる関数を使用します。
Important
Azure Storageの場合は、共有アカウント キーよりもマネージド ID を使用したMicrosoft Entra ID承認を優先します。 コンプライアンスが許可されている場合は、 ストレージ アカウントで共有キーの承認を無効 にし、キーローテーションの必要性を完全に排除します。 このチュートリアルのパターンは、ワークロードにストレージ アカウント キーまたは接続文字列が必要な場合にのみ使用します。
このチュートリアルで説明する回転ソリューションを次に示します。
このソリューションでは、Azure Key Vaultは、各ストレージ アカウント アクセス キーを同じシークレットのバージョンとして格納し、連続するバージョンのプライマリ キーとセカンダリ キーを交互に格納します。 1 つのアクセス キーがシークレットの最新バージョンとして格納されると、代替キーが再生成され、新しい最新バージョンとしてKey Vaultに追加されます。 この設計により、新しく再生成されたキーを取得するための完全な回転サイクルがアプリケーションに与えられます。
- シークレットの有効期限の 30 日前に、Key Vaultは有効期限近くのイベントを Event Grid に発行します。
- Event Grid がイベント サブスクリプションを確認し、HTTP POST を使用して、このイベントをサブスクライブしている関数アプリ エンドポイントを呼び出します。
- 関数アプリは、(最新のキーではなく) 代替キーを識別し、ストレージ アカウントを呼び出して再生成します。
- 関数アプリは、再生成されたキーを新しいバージョンのシークレットとしてAzure Key Vaultに追加します。
[前提条件]
- Azure サブスクリプション。 無料で作成できます。
- Azure Cloud Shell。 このチュートリアルでは、PowerShell 環境でポータル Cloud Shellを使用します。
- Azure Key Vault。
- 2 つのAzureストレージ アカウント。
注
共有ストレージ アカウント キーをローテーションすると、そのキーから生成されたアカウント レベルの Shared Access Signature (SAS) が取り消されます。 ローテーション後、アカウント レベルの SAS トークンを再生成して、アプリケーションの中断を回避します。
既存のキー コンテナーと 2 つのストレージ アカウントがない場合は、次のデプロイ リンクを使用します。
[リソース グループ] で、 [新規作成] を選択します。 グループ ボールトのローテーション に名前を付け、OK を選択します。
[Review + create](レビュー + 作成) を選択します。
を選択してを作成します。
これで、キー コンテナーと 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 プラン。
- 関数アプリ トリガーを管理するためのストレージ アカウント。
- 関数アプリがキー コンテナー内のシークレットにアクセスできるようにするAzureロールの割り当て。
- 関数アプリに割り当てられたストレージ アカウント キー オペレーターのサービス ロールによって、ストレージ アカウントのアクセス キーにアクセスできます。
- Event Grid トリガーと HTTP トリガーを含むキー ローテーション関数 (オンデマンド ローテーション用)。
- SecretNearExpiry イベントの Event Grid イベント サブスクリプション。
Azure テンプレートのデプロイ リンクを選択します。
リソース グループの一覧で、vaultrotationを選択します。
ストレージ アカウント RG に、ストレージ アカウントが配置されているリソース グループの名前を入力します。 ストレージ アカウントがローテーション関数と同じリソース グループにある場合は、既定の
[resourceGroup().name]のままにします。[ ストレージ アカウント名] に、アクセス キーをローテーションするストレージ アカウントの名前を入力します。 前提条件からストレージ アカウントを使用する場合は、既定の
[concat(resourceGroup().name, 'storage')]のままに します。Key Vault RG に、key vaultが配置されているリソース グループの名前を入力します。 キー コンテナーがローテーション関数と同じリソース グループにある場合は、既定の
[resourceGroup().name]のままにします。Key Vault Name にキー コンテナー名を入力します。
[concat(resourceGroup().name, '-kv')]からキー コンテナーを使用する場合は、既定ののままにします。App Service プランの種類で、ホスティング プランを選択します。 Premium プラン は、キー コンテナーがファイアウォールの内側にある場合にのみ必要です。
[ 関数アプリ名] に、関数アプリ名を入力します。
[ シークレット名] に、アクセス キーを格納するシークレット名を入力します。
[Repo URL]\(リポジトリ URL\) に、関数コードのGitHubの場所 (
https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git) を入力します。[Review + create](レビュー + 作成) を選択します。
を選択してを作成します。
デプロイが完了すると、ストレージ アカウント、サーバー ファーム、関数アプリ、および Application Insights リソースが作成されます。
注
この ARM テンプレートでは、App Service ソース管理 (Kudu) デプロイを使用して、GitHubから関数コードをプルします。 本番ワークロードには、func azure functionapp publish や WEBSITE_RUN_FROM_PACKAGE を使用した zip デプロイ などのパッケージベースのデプロイをお勧めします。 デプロイが失敗した場合は、[ 再デプロイ ] を選択して再試行します。
ローテーション関数のデプロイ テンプレートとコードは、Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell にあります。
ストレージ アカウントのアクセス キーをKey Vaultシークレットに追加する
まず、コンテナー内のシークレットを管理できるように、Key Vault Secrets Officer ロールを自分自身に割り当てます。
az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/vaultrotation-kv
これで、ストレージ アカウントのアクセス キーの値を持つシークレットを作成できるようになりました。 値と共に、ストレージ アカウントのリソース ID、シークレットの有効期間、キー ID をタグとして追加して、ローテーション関数がストレージ アカウント内のキーを再生成できるようにします。
ストレージ アカウントのリソース ID を決定します。
idプロパティです。
az storage account show -n vaultrotationstorage
キー値を取得できるように、ストレージ アカウントのアクセス キーを一覧表示します。
az storage account keys list -n vaultrotationstorage
有効期間を 60 日に設定したシークレットをキー ボールトに追加し、(デモ用に)有効期限を明日に設定して、ローテーションがすぐにトリガーされるようにします。
key1ValueとstorageAccountResourceIdの取得した値を使用して、次のコマンドを実行します。
tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1-value> --tags "CredentialId=key1" "ProviderAddress=<storage-account-resource-id>" "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が再生成されていることに注意してください。
アクセス キーを取得して値を比較します。
az storage account keys list -n vaultrotationstorage
キーの値がキー コンテナー内のシークレットと一致していることに注意してください:
複数のストレージ アカウントに対して既存のローテーション関数を使用する
同じ関数アプリを再利用して、複数のストレージ アカウントのキーをローテーションできます。
既存のローテーション関数に別のストレージ アカウントのキーを追加するには、次のものが必要です。
- 関数アプリがストレージ アカウントのアクセス キーにアクセスできるように、その関数アプリに割り当てられたストレージ アカウント キー オペレーター サービス ロール。
- SecretNearExpiry イベントの Event Grid イベント サブスクリプション。
Azure テンプレートのデプロイ リンクを選択します。
リソース グループの一覧で、vaultrotationを選択します。
ストレージ アカウント RG に、ストレージ アカウントが配置されているリソース グループの名前を入力します。 ストレージ アカウントがローテーション関数と同じリソース グループにある場合は、既定の
[resourceGroup().name]のままにします。[ ストレージ アカウント名] に、アクセス キーをローテーションするストレージ アカウントの名前を入力します。
Key Vault RG に、key vaultが配置されているリソース グループの名前を入力します。 キー コンテナーがローテーション関数と同じリソース グループにある場合は、既定の
[resourceGroup().name]のままにします。キー コンテナー名 に、キー コンテナー名を入力します。
[ 関数アプリ名] に、関数アプリ名を入力します。
[ シークレット名] に、アクセス キーを格納するシークレット名を入力します。
[Review + create](レビュー + 作成) を選択します。
を選択してを作成します。
Key Vault シークレットにストレージ アカウント アクセス キーを追加する
ストレージ アカウントのリソース ID を決定します。 この値は、 id プロパティにあります。
az storage account show -n vaultrotationstorage2
key2 値を取得できるように、ストレージ アカウントのアクセス キーを一覧表示します。
az storage account keys list -n vaultrotationstorage2
有効期間を 60 日に設定したシークレットをキー ボールトに追加し、(デモ用に)有効期限を明日に設定して、ローテーションがすぐにトリガーされるようにします。
key2ValueとstorageAccountResourceIdの取得した値を使用して、次のコマンドを実行します。
tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2-value> --tags "CredentialId=key2" "ProviderAddress=<storage-account-resource-id>" "ValidityPeriodDays=60" --expires $tomorrowDate
次のコマンドを使用して、シークレット情報を取得します。
az keyvault secret show --vault-name vaultrotation-kv --name storageKey2
CredentialIdが代替keyNameに更新され、valueが再生成されていることに注意してください。
アクセス キーを取得して値を比較します。
az storage account keys list -n vaultrotationstorage2
キーの値が Key Vault 内のシークレットと一致していることを確認してください。
シークレットのローテーションを無効にする
シークレットのローテーションを無効にするには、そのシークレットの Event Grid サブスクリプションを削除します。 Azure PowerShell Remove-AzEventGridSubscription コマンドレットまたは Azure CLI az eventgrid event-subscription delete コマンドを使用します。
AI を使用して他のサービスのローテーション機能をカスタマイズする
このチュートリアルでは、Azure Storage アカウントのシークレット ローテーションについて説明しますが、デュアル資格情報を使用する他のAzure サービスにローテーション機能を適応させることができます。 GitHub Copilotは、サービスで動作するように PowerShell ローテーション関数コードを変更するのに役立ちます。
I'm using the Azure Key Vault dual-credential secret rotation tutorial for Storage accounts. Help me modify the PowerShell rotation function to work with Azure Cosmos DB instead. The function should:
1. Connect to Cosmos DB and regenerate the secondary key
2. Store the new key in Key Vault as a new secret version
3. Alternate between primary and secondary keys on each rotation
Show me the changes needed to the PowerShell function code, including the correct Cosmos DB PowerShell cmdlets.
GitHub Copilotは AI を活用しているため、驚きや間違いが起こりうる可能性があります。 詳細については、Copilot FAQ を参照してください。