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 に追加されます。 このソリューションは、最新の再生成されたキーに更新するアプリケーションのローテーション サイクル全体を提供します。
- シークレットの有効期限日の 30 日前に、Key Vault は有効期限に近いイベントを Event Grid に発行します。
- Event Grid はイベント サブスクリプションをチェックし、HTTP POST を使用して、イベントをサブスクライブしている関数アプリ エンドポイントを呼び出します。
- 関数アプリは、(最新のキーではなく) 代替キーを識別し、ストレージ アカウントを呼び出して再生成します。
- 関数アプリは、新しい再生成されたキーをシークレットの新しいバージョンとして Azure Key Vault に追加します。
[前提条件]
- Azure サブスクリプション。 無料で作成できます。
- Azure Cloud Shell。 このチュートリアルでは、ポータル Cloud Shell と PowerShell env を使用しています
- Azure Key Vault。
- 2 つの Azure ストレージ アカウント。
注
共有ストレージ アカウント キーのローテーションでは、そのキーに基づいて生成されたアカウント レベルの Shared Access Signature (SAS) が取り消されます。 ストレージ アカウント キーのローテーション後、アプリケーションの中断を回避するために、アカウント レベルの SAS トークンを再生成する必要があります。
既存のキー コンテナーと既存のストレージ アカウントがない場合は、このデプロイ リンクを使用できます。
[リソース グループ] で、 [新規作成] を選択します。 グループ ボールトのローテーション に名前を付け、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 プラン
- 関数アプリ トリガーを管理するためのストレージ アカウント
- Key Vault 内のシークレットにアクセスするためのアクセス ポリシー
- ストレージ アカウント アクセス キーにアクセスできるように、関数アプリに割り当てられたストレージ アカウント キー オペレーター サービス ロール
- イベント トリガーと HTTP トリガーを含むキー ローテーション関数 (オンデマンド ローテーション)
- SecretNearExpiry イベントの Event Grid イベント サブスクリプション
Azure テンプレートのデプロイ リンクを選択します。
リソース グループの一覧で、vaultrotationを選択します。
[ ストレージ アカウント RG ] ボックスに、ストレージ アカウントが配置されているリソース グループの名前を入力します。 ストレージ アカウントが、キー ローテーション関数をデプロイするのと同じリソース グループに既に存在する場合は、既定値 [resourceGroup().name] をそのまま使用します。
[ ストレージ アカウント名] ボックスに、ローテーションするアクセス キーを含むストレージ アカウントの名前を入力します。 前提条件で作成したストレージ アカウントを使用する場合 は、既定値 [concat(resourceGroup().name, 'storage')] のままに します。
[ Key Vault RG ] ボックスに、キー コンテナーが配置されているリソース グループの名前を入力します。 キー ローテーション関数をデプロイするのと同じリソース グループにキー コンテナーが既に存在する場合は、既定値 [resourceGroup().name] のままにします。
[ キー コンテナー名 ] ボックスに、キー コンテナーの名前を入力します。 前提条件で作成したキー コンテナーを使用する場合は、既定値 [concat(resourceGroup().name, '-kv')] をそのまま使用してください。
[ App Service プランの種類 ] ボックスで、[ホスティング プラン] を選択します。 Premium プラン は、キー コンテナーがファイアウォールの内側にある場合にのみ必要です。
[ 関数アプリ名 ] ボックスに、関数アプリの名前を入力します。
[ シークレット名] ボックスに、アクセス キーを格納するシークレットの名前を入力します。
[ Repo URL ] ボックスに、関数コードの GitHub の場所を入力します。 このチュートリアルでは、 https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git を使用できます。
[Review + create](レビュー + 作成) を選択します。
を選択してを作成します。
上記の手順を完了すると、ストレージ アカウント、サーバー ファーム、関数アプリ、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 を使用して、有効期限を明日にすぐに設定してローテーションをトリガーするデモンストレーションを目的としています。 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 <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
が再生成されていることに注意してください。
アクセス キーを取得して値を比較します。
az storage account keys list -n vaultrotationstorage
キーの value
は、キー コンテナー内のシークレットと同じであることに注意してください。
複数のストレージ アカウントに既存のローテーション関数を使用する
同じ関数アプリを再利用して、複数のストレージ アカウントのキーをローテーションできます。
ローテーションのためにストレージ アカウント キーを既存の関数に追加するには、次のものが必要です。
- ストレージ アカウント アクセス キーにアクセスできるように、関数アプリに割り当てられたストレージ アカウント キー オペレーター サービス ロール。
- SecretNearExpiry イベントの Event Grid イベント サブスクリプション。
Azure テンプレートのデプロイ リンクを選択します。
リソース グループの一覧で、vaultrotationを選択します。
[ ストレージ アカウント RG ] ボックスに、ストレージ アカウントが配置されているリソース グループの名前を入力します。 ストレージ アカウントが、キー ローテーション関数をデプロイするのと同じリソース グループに既に存在する場合は、既定値 [resourceGroup().name] をそのまま使用します。
[ ストレージ アカウント名] ボックスに、ローテーションするアクセス キーを含むストレージ アカウントの名前を入力します。
[ Key Vault RG ] ボックスに、キー コンテナーが配置されているリソース グループの名前を入力します。 キー ローテーション関数をデプロイするのと同じリソース グループにキー コンテナーが既に存在する場合は、既定値 [resourceGroup().name] のままにします。
[ キー コンテナー名 ] ボックスに、キー コンテナーの名前を入力します。
[ 関数アプリ名 ] ボックスに、関数アプリの名前を入力します。
[ シークレット名] ボックスに、アクセス キーを格納するシークレットの名前を入力します。
[Review + create](レビュー + 作成) を選択します。
を選択してを作成します。
Key Vault シークレットにストレージ アカウント アクセス キーを追加する
ストレージ アカウントのリソース ID を決定します。 この値は、 id
プロパティにあります。
az storage account show -n vaultrotationstorage2
key2 値を取得できるように、ストレージ アカウントのアクセス キーを一覧表示します。
az storage account keys list -n vaultrotationstorage2
有効期間が 60 日間のキー コンテナーにシークレットを追加し、ストレージ アカウント リソース ID を使用して、有効期限を明日にすぐに設定してローテーションをトリガーするデモンストレーションを目的としています。 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 <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate
次のコマンドを使用して、シークレット情報を取得します。
az keyvault secret show --vault-name vaultrotation-kv --name storageKey2
CredentialId
が代替keyName
に更新され、value
が再生成されていることに注意してください。
アクセス キーを取得して値を比較します。
az storage account keys list -n vaultrotationstorage
キーの value
は、キー コンテナー内のシークレットと同じであることに注意してください。
シークレットのローテーションを無効にする
シークレットの Event Grid サブスクリプションを削除するだけで、シークレットのローテーションを無効にすることができます。 Azure PowerShell Remove-AzEventGridSubscription コマンドレットまたは Azure CLI az event grid event--subscription delete コマンドを使用します。
Key Vault の 2 セットの資格情報のローテーション機能
資格情報の2セットに対応する循環関数テンプレートと、すぐに使用できるいくつかの関数。
注
これらのローテーション関数は、Microsoft ではなくコミュニティのメンバーによって作成されます。 コミュニティ機能は、Microsoft サポート プログラムまたはサービスではサポートされておらず、いかなる種類の保証もなく、AS IS で利用できます。