シークレット ストア コンテナー ストレージ インターフェイス (CSI) ドライバー用の Azure Key Vault プロバイダーを使用すると、シークレット ストアとして Azure Key Vault を CSI ボリューム経由で Azure Kubernetes Service (AKS) クラスターと統合できます。
機能
- CSI ボリュームを使用してシークレット、キー、証明書をポッドにマウントします。
- CSI インライン ボリュームをサポートします。
- 複数のシークレット ストア オブジェクトを 1 つのボリュームとしてマウントすることがサポートされています。
-
SecretProviderClassカスタム リソース定義 (CRD) を使用してポッドの移植性をサポートします。 - Windows コンテナーがサポートされています。
- Kubernetes シークレットと同期します。
- マウントされたコンテンツと同期された Kubernetes シークレットの自動ローテーションがサポートされています。
制限事項
-
ConfigMapまたはSecretをsubPathボリューム マウントとして使用するコンテナーは、シークレットがローテーションされるときに自動更新を受け取りません。これは Kubernetes の制限事項です。 変更を有効にするには、アプリケーションでファイル システムの変更を監視するか、ポッドを再起動して、変更されたファイルを再読み込みする必要があります。 詳細については、Secrets Store CSI Driver の既知の制限事項に関するページを参照してください。 - アドオンは、ノード リソース グループ (
azurekeyvaultsecretsprovider-xxxxx) にMC_という名前のマネージド ID を作成し、仮想マシン スケール セットに自動的に割り当てます。 このマネージド ID または独自のマネージド ID を使用して、キー コンテナーにアクセスできます。 ID を作成できないようにすることはサポートされていません。
前提条件
- Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
- Azure CLI のバージョンが 2.30.0 以降であることを確認します。 以前のバージョンの場合は、最新バージョンをインストールします。
ネットワーク
- ネットワーク分離クラスターを使用する場合は、 Azure Key Vault にアクセスするようにプライベート エンドポイントを設定することをお勧めします。
- クラスターに送信の種類
userDefinedRoutingがあり、Azure Firewall などのドメイン名に基づいて送信トラフィックを制御できるファイアウォール デバイスを使用している場合 は、必要な送信ネットワーク規則と FQDN が許可されていることを確認します。 - イングレスをクラスターに制限している場合、ポート 9808 と 8095 が開いていることを確認します。
役割
- この記事では、 Key Vault Secrets Officer ロールを使用して、キー コンテナーにシークレットを作成するアクセス許可をアカウントに付与します。
-
Azure Key Vault へのアクセスを提供する記事では、
SecretProviderClassで使用される ID は、またはkeycertificateにアクセスするために Key Vault 証明書ユーザーと、secretにアクセスする Key Vault シークレット ユーザーが必要です。
AKS クラスターを作成する
シークレット ストア CSI ドライバーのサポート用に Azure Key Vault プロバイダーを使用して AKS クラスターを作成します。
コマンドで使用される変数を作成して、AKS クラスターと Key Vault を作成します。
export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM") export KEYVAULT_NAME=myKeyVault${RANDOM_STRING} export RESOURCE_GROUP=myResourceGroup export CLUSTER_NAME=myAKSCluster export LOCATION=eastus2Azure Key Vault の名前は、グローバルに一意である必要があります。英数字 (ハイフンを含む)、3 ~ 24 文字です。 キー コンテナー名は、
KEYVAULT_NAME変数のmyKeyVault値とRANDOM_STRING変数の 10 文字の文字列を連結します。az group createコマンドを使用して、Azure リソース グループを作成します。az group create --name $RESOURCE_GROUP --location $LOCATIONaz aks createコマンドと--enable-addons azure-keyvault-secrets-providerパラメーターを使って、シークレット ストア CSI ドライバー機能用に Azure Key Vault プロバイダーを含む AKS クラスターを作成します。--enable-addonsパラメーターは、キー コンテナーに対する認証に使用できるazurekeyvaultsecretsprovider-xxxxという名前のユーザー割り当てマネージド ID を作成します。 マネージド ID はノード リソース グループ (MC_) に格納され、仮想マシン スケール セットに自動的に割り当てられます。 このマネージド ID または独自のマネージド ID を使用して、キー コンテナーにアクセスできます。 ID を作成できないようにすることはサポートされていません。az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --enable-addons azure-keyvault-secrets-provider \ --generate-ssh-keysヒント
Microsoft Entra ワークロード ID を使用する場合は、
az aks createコマンドに--enable-oidc-issuerパラメーターと--enable-workload-identityパラメーターを含める必要があります。
AKS クラスターを作成する
次の構成で main.tf ファイルを作成し、Secrets Store CSI Driver サポート用の Azure Key Vault プロバイダーを持つ AKS クラスターを作成します。
Terraform 構成を作成します。
terraform { required_version = ">= 1.6.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } } } provider "azurerm" { features {} } data "azurerm_client_config" "current" {} resource "azurerm_resource_group" "rg" { name = "aks-rg" location = "East US" }AKS クラスターを作成します。
resource "azurerm_kubernetes_cluster" "aks" { name = "aks-cluster" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name dns_prefix = "akscsi" default_node_pool { name = "system" node_count = 1 vm_size = "Standard_DS2_v2" } identity { type = "SystemAssigned" } key_vault_secrets_provider { secret_rotation_enabled = false } }構成をデプロイします。 Bash セッションを形成し、次のコマンドを実行してリソースをデプロイします。
terraform init terraform validate terraform plan terraform apply
既存の AKS クラスターを更新する
シークレット ストア CSI ドライバーのサポートのために、Azure Key Vault プロバイダーを使用して既存の AKS クラスターを更新します。
コマンドで使用される変数を作成します。 既存の AKS クラスターまたは Key Vault を更新するために必要に応じて値を置き換えます。
たとえば、既存のキー コンテナーを使用している場合は、
KEYVAULT_NAME変数を使用せずに、RANDOM_STRING変数の値を置き換えます。キー コンテナーがない場合、Azure Key Vault の名前はグローバルに一意で、ハイフンを含む英数字、3 から 24 文字である必要があります。 キー コンテナー名は、
KEYVAULT_NAME変数のmyKeyVault値とRANDOM_STRING変数の 10 文字の文字列を連結します。 キー ボールトは、この記事の後半で作成できます。export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM") export KEYVAULT_NAME=myKeyVault${RANDOM_STRING} export RESOURCE_GROUP=myResourceGroup export CLUSTER_NAME=myAKSCluster export LOCATION=eastus2az aks enable-addonsコマンドを使用して、Azure Key Vault プロバイダー for Secrets Store CSI Driver 機能を使用して既存の AKS クラスターを更新し、azure-keyvault-secrets-providerアドオンを有効にします。 このアドオンでは、キー コンテナーの認証に使用できるユーザー割り当てマネージド ID が作成されます。az aks enable-addons \ --addons azure-keyvault-secrets-provider \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPAzure Key Vault シークレット プロバイダーを有効にすると、AKS によって
azurekeyvaultsecretsprovider-xxxxという名前のマネージド ID が作成され、キー コンテナーに対する認証に使用できます。 マネージド ID はノード リソース グループ (MC_) に格納され、仮想マシン スケール セットに自動的に割り当てられます。 このマネージド ID または独自のマネージド ID を使用して、キー コンテナーにアクセスできます。 ID を作成できないようにすることはサポートされていません。
既存の AKS クラスターを更新する
次の構成を使用して main.tf ファイルを作成し、Secrets Store CSI Driver サポート用の Azure Key Vault プロバイダーを使用して既存の AKS クラスターを更新します。
既存の AKS クラスターを更新します。
resource "azurerm_kubernetes_cluster" "aks" { name = "<existing-cluster>" resource_group_name = "<resource-group>" key_vault_secrets_provider { secret_rotation_enabled = false } }構成をデプロイします。 Bash セッションを形成し、次のコマンドを実行して構成をデプロイします。
Run the following commands to apply the updates: terraform init terraform validate terraform plan terraform apply
マネージド ID とキー コンテナー プロバイダーのインストールを確認する
Terraform を使用して新しいクラスターを作成したり、既存のクラスターを更新したりした場合は、次のコマンドの $CLUSTER_NAME のような変数を、Terraform 構成で使用した値に置き換える必要があります。
マネージド ID を確認する
次の手順を使用して、マネージド ID が作成され、クラスターの仮想マシン スケール セットに割り当てられていることを確認します。
az aks showコマンドを使用して、マネージド ID が作成され、クラスターに割り当てられたかどうかを確認します。az aks show \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --query addonProfiles{ "azureKeyvaultSecretsProvider": { "config": { "enableSecretRotation": "false", "rotationPollInterval": "2m" }, "enabled": true, "identity": { "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444", "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster" } } }resourceIdプロパティには、リソース グループと ID の名前azurekeyvaultsecretsprovider-myaksclusterが表示されます。マネージド ID がノード リソース グループの仮想マシン スケール セットに割り当てられていることを確認します。
NODE_RG=$(az aks show \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP \ --query nodeResourceGroup --output tsv) VMSS_NAME=$(az vmss list \ --resource-group $NODE_RG \ --query [].name --output tsv) az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'この出力には、仮想マシン スケール セット
Microsoft.Compute/virtualMachineScaleSetsリソース ID と、ID が仮想マシン スケール セットに割り当てられていることを確認するuserAssignedIdentitiesのリソース ID を持つazurekeyvaultsecretsprovider-myaksclusterプロパティが表示されます。
Secrets Store CSI Driver 用 Azure Key Vault プロバイダーのインストールを確認する
az aks get-credentialsコマンドを使用して、AKS クラスターの資格情報を取得します。az aks get-credentials \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUPkubectl get podsコマンドを使用してインストールが完了したことを確認します。このコマンドでは、secrets-store-csi-driverとsecrets-store-provider-azureラベルを持つすべてのポッドがkube-system名前空間に一覧表示されます。kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wide-o wideフラグを使用すると、各ポッドが実行されているノードが出力に含まれます。出力は次の出力例のようになります。
NAME READY STATUS RESTARTS AGE NODE aks-secrets-store-csi-driver-4vpkj 3/3 Running 2 4m25s aks-nodepool1-12345678-vmss000002 aks-secrets-store-csi-driver-ctjq6 3/3 Running 2 4m21s aks-nodepool1-12345678-vmss000001 aks-secrets-store-csi-driver-tlvlq 3/3 Running 2 4m24s aks-nodepool1-12345678-vmss000000 aks-secrets-store-provider-azure-5p4nb 1/1 Running 0 4m21s aks-nodepool1-12345678-vmss000000 aks-secrets-store-provider-azure-6pqmv 1/1 Running 0 4m24s aks-nodepool1-12345678-vmss000001 aks-secrets-store-provider-azure-f5qlm 1/1 Running 0 4m25s aks-nodepool1-12345678-vmss000002
新しいキー コンテナーを作成する
az keyvault create コマンドを実行して、Azure RBAC が有効になっている新しいキー コンテナーを作成します。
az keyvault create \
--name $KEYVAULT_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--enable-rbac-authorization
--enable-rbac-authorization パラメーターを含めない場合でも、新しいキー コンテナーを作成すると、Azure RBAC は既定で有効になります。
key vaultアクセス許可モデルとAzure RBAC の詳細については、「ロールベースのアクセス制御を使用した Azure Key Vault キー、証明書、シークレットへのアクセスの準備」を参照してください。
既存のキーボールトを更新する
az keyvault update コマンドを実行して、Azure ロールベースのアクセス制御 (Azure RBAC) を使用して、既存のキーコンテナーを更新します。
--enable-rbac-authorization パラメーターは、AZURE RBAC が無効になっている既存のキー コンテナーを更新するときに、Azure RBAC を有効にするために必要です。
az keyvault update \
--name $KEYVAULT_NAME \
--resource-group $RESOURCE_GROUP \
--enable-rbac-authorization
キー コンテナーのアクセス許可モデルと Azure RBAC の詳細については、「Azure ロールベースのアクセス制御を使用して Key Vault キー、証明書、シークレットへのアクセスを提供する」を参照してください。
ロールの割り当てとシークレットをキー コンテナーに追加する
az keyvault showコマンドを実行して、キー コンテナーで Azure RBAC が有効になっていることを確認します。az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.enableRbacAuthorization出力は
trueする必要があります。次の手順でキー コンテナー シークレットを追加できるように、
az role assignment createコマンドを使用して、ユーザー アカウントのロールの割り当てをキー コンテナー スコープに追加します。一意識別子 を持つ
b86a8fe4-44ce-4948-aee5-eccb2c155cd7ロールが追加され、名前または一意識別子のいずれかを使用できます。 ロール名が変更された場合の問題を防ぐために、一意の識別子を使用することをお勧めします。KEYVAULT_ID=$(az keyvault show \ --name $KEYVAULT_NAME \ --resource-group $RESOURCE_GROUP \ --query id -o tsv) MYID=$(az ad signed-in-user show --query id --output tsv) az role assignment create \ --assignee-object-id $MYID \ --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \ --scope $KEYVAULT_ID \ --assignee-principal-type Userロールの割り当てが有効になるまで数分かかる場合があります。 ロールの割り当てが作成されたことを確認するには、次のコマンドを使用します。
az role assignment list \ --assignee-object-id $MYID \ --scope $KEYVAULT_ID \ --query '[].{Role:roleDefinitionName, Scope:scope}' \ --output tableExampleSecretコマンドを使用して、キー コンテナーにaz keyvault secret setという名前のプレーンテキスト シークレットを作成します。キー コンテナーには、キー、シークレット、証明書を格納できます。
valueパラメーターは、RANDOM_STRING変数を使用してシークレットの一意の値を作成します。az keyvault secret set \ --vault-name $KEYVAULT_NAME \ --name ExampleSecret \ --value MyAKSExampleSecret${RANDOM_STRING}[
az keyvault secret show][az-keyvault-secret-show] コマンドを使用して、シークレットがキー コンテナーに追加されたことを確認します。az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
新しいキー コンテナーを作成する
main.tf ファイルを更新して、ロールベースのアクセス制御 (Azure RBAC) が有効になっている新しいキー コンテナー Azure作成します。
Azure RBAC が有効になっている新しいキー コンテナーを作成します。
data "azurerm_client_config" "current" {} resource "random_string" "suffix" { length = 5 special = false upper = false } resource "azurerm_key_vault" "kv" { name = "akskv${random_string.suffix.result}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" enable_rbac_authorization = true }Key Vault Secrets Officer ロールを割り当てます。
resource "azurerm_role_assignment" "kv_role" { scope = azurerm_key_vault.kv.id role_definition_name = "Key Vault Secrets Officer" principal_id = data.azurerm_client_config.current.object_id }キー コンテナーに ExampleSecret を作成します。
resource "azurerm_key_vault_secret" "example" { name = "ExampleSecret" value = "MyAKSExampleSecret" key_vault_id = azurerm_key_vault.kv.id }構成をデプロイします。 Bash セッションを形成し、次のコマンドを実行して更新された構成をデプロイします。
terraform plan terraform apply[
az keyvault secret show][az-keyvault-secret-show] コマンドを使用して、ExampleSecret がキー コンテナーに追加されたことを確認します。<keyvault-name>を、Terraform 構成で作成したキー ボールトの名前に置き換えます。az keyvault secret show \ --vault-name <keyvault-name> \ --name ExampleSecret
既存のキーボールトを更新する
main.tf ファイルを更新して、ロールベースのアクセス制御 (Azure RBAC) が有効になっている既存のキー コンテナー Azure更新します。
既存のキー コンテナーを更新して、Azure RBAC を有効にします。
resource "azurerm_key_vault" "kv" { name = "<existing-kv>" resource_group_name = "<resource-group>" enable_rbac_authorization = true }ロールを割り当ててシークレットを追加します。
resource "azurerm_role_assignment" "kv_role" { scope = azurerm_key_vault.kv.id role_definition_name = "Key Vault Secrets Officer" principal_id = data.azurerm_client_config.current.object_id } resource "azurerm_key_vault_secret" "example" { name = "ExampleSecret" value = "MyAKSExampleSecret" key_vault_id = azurerm_key_vault.kv.id }構成をデプロイします。 Bash セッションを形成し、次のコマンドを実行して更新された構成をデプロイします。
terraform plan terraform apply
リソースをクリーンアップする
次の記事に進み、これらのリソースが必要な場合は、次の手順を無視してください。 それ以外の場合は、完了し、次の記事に進む予定がない場合は、不要なコストを回避するために、この記事で作成したリソースを削除する必要があります。
ローカルの .kube/config ファイルからクラスターの資格情報を削除します。
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXTMC_コマンドを使用して、ノード リソース グループ (az group delete) 内のリソースを含む、リソース グループとその中のすべてのリソースを削除します。az group delete --name $RESOURCE_GROUP --yes --no-wait
terraform destroy コマンドは、現在の Terraform 構成および状態ファイルで定義されているすべてのリソースを削除します。 このコマンドは、この記事で使用されている作業ディレクトリからのみ実行してください。
Warnung
既存のリソースまたは運用リソースを使用している場合は、実行する前に実行プランを慎重に確認してください。
terraform plan -destroy
削除しても安全である場合を除き、共有またはインポートされたインフラストラクチャに対して terraform destroy を実行しないでください。 詳細については、Terraform destroy コマンドの Terraform ドキュメントを参照してください。
ローカルの .kube/config ファイルからクラスターの資格情報を削除します。
KUBE_CONTEXT=$(kubectl config current-context) kubectl config delete-context $KUBE_CONTEXT次のコマンドを実行して、この記事で作成したリソースを削除します。
terraform destroy
次のステップ
この記事では、AKS クラスターで Secrets Store CSI Driver 用 Azure Key Vault プロバイダーを使う方法について説明しました。 Azure キー コンテナーにアクセスする ID を指定する必要があります。 その方法については、次の記事に進んでください。