この記事では、Azure Kubernetes Service (AKS) で Kubernetes シークレットのキー管理サービス (KMS) データ暗号化を有効にする方法について説明します。 KMS 暗号化では、Azure Key Vault キーを使用して etcd に格納されている Kubernetes シークレットが暗号化されます。
AKS では、次の 2 つの主要な管理オプションがサポートされています。
- プラットフォームマネージド キー (PMK):AKS によって暗号化キーが自動的に作成および管理されます。 このオプションでは、キーの自動ローテーションを使用した最も簡単な設定が提供されます。
- カスタマー マネージド キー (CMK): 独自の Azure Key Vault と暗号化キーを作成および管理します。 このオプションでは、キーのライフサイクルを完全に制御でき、カスタマー マネージド キーを要求するコンプライアンス要件を満たします。
暗号化の概念とキー オプションの詳細については、 AKS の保存時のデータ暗号化の概念に関する説明を参照してください。
Important
AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は運用環境での使用を目的としていません。 詳細については、次のサポート記事を参照してください。
[前提条件]
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。
CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事では、Azure CLI のバージョン 2.73.0 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
-
aks-previewAzure CLI 拡張機能バージョン 19.0.0b13 以降が必要です。- まだ
aks-preview拡張機能をインストールしていない場合は、az extension addコマンドを使用してインストールします。az extension add --name aks-preview - 既に
aks-preview拡張機能をインストールしている場合は、az extension updateコマンドを使用して最新バージョンであることを確認するために更新します。az extension update --name aks-preview
- まだ
-
kubectlCLI ツールがインストールされています。
機能フラグを登録する
プラットフォーム マネージド キーで KMS データ暗号化を使用するには、サブスクリプションに KMSPMKPreview 機能フラグを登録します。
az feature registerコマンドを使用して機能フラグを登録します。az feature register --namespace Microsoft.ContainerService --name KMSPMKPreviewaz feature showコマンドを使用して、登録の状態を確認します。 状態が [登録済み] と表示されるまでに数分かかります。az feature show --namespace Microsoft.ContainerService --name KMSPMKPreview状態が [登録済み] と表示されたら、 コマンドを使用して
az provider registerリソース プロバイダーの登録を更新します。az provider register --namespace Microsoft.ContainerService
環境変数を設定する
デプロイの環境変数を設定します。 プレースホルダーの値を独自の値に置き換えます。
# Set environment variables
export SUBSCRIPTION_ID="<your-subscription-id>"
export RESOURCE_GROUP="<your-resource-group>"
export LOCATION="<your-location>"
export CLUSTER_NAME="<your-cluster-name>"
# Set subscription
az account set --subscription $SUBSCRIPTION_ID
# Create resource group if it doesn't exist
az group create --name $RESOURCE_GROUP --location $LOCATION
プラットフォームで管理されるキー暗号化を有効にする
プラットフォームマネージド キーを使用すると、AKS は Azure Key Vault と暗号化キーを自動的に作成および管理します。 キーのローテーションは、プラットフォームによって自動的に処理されます。
プラットフォームマネージド キーを使用して新しい AKS クラスターを作成する
プラットフォームマネージド キーを使用して、KMS 暗号化を使用して新しい AKS クラスターを作成します。
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kubernetes-version 1.33.0 \
--kms-infrastructure-encryption Enabled \
--generate-ssh-keys
既存のクラスターでプラットフォームマネージド キーを有効にする
既存の AKS クラスターでプラットフォームマネージド キーを使用して KMS 暗号化を有効にします。
注
クラスターで Kubernetes バージョン 1.33 以降が実行されている必要があります。
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kms-infrastructure-encryption Enabled
KMS の構成を確認する
KMS 暗号化を有効にした後、構成を確認します。
az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query 'securityProfile'
出力には、KMS 構成が含まれます。
{
"kubernetesResourceObjectEncryptionProfile": {
"infrastructureEncryption": "Enabled"
}
}
秘密キー コンテナーを使用してカスタマー マネージド キー暗号化を有効にする
セキュリティを強化するために、パブリック ネットワーク アクセスが無効になっている秘密キー コンテナーを使用できます。 AKS は、 信頼されたサービス ファイアウォール例外を介して秘密キー コンテナーにアクセスします。 このセクションでは、秘密キー コンテナーを使用してカスタマー マネージド キーを構成する方法について説明します。
信頼されたサービスへのアクセスを備えたキー コンテナーとキーを作成する
注
このセクションでは、最初にパブリック ネットワーク アクセスを使用してキー コンテナーを作成し、信頼されたサービスバイパスを使用してファイアウォールを有効にする方法について説明します。 この方法は説明のみを目的としています。 運用環境では、最初からキー コンテナーをプライベートとして作成して管理する必要があります。 秘密キー コンテナーの管理に関するガイダンスについては、 Azure Key Vault のネットワーク セキュリティに関するページを参照してください。
Azure RBAC が有効になっているキー コンテナーを作成します。
export KEY_VAULT_NAME="<your-key-vault-name>" az keyvault create \ --name $KEY_VAULT_NAME \ --resource-group $RESOURCE_GROUP \ --enable-rbac-authorization true \ --public-network-access Enabled # Get the key vault resource ID export KEY_VAULT_RESOURCE_ID=$(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id -o tsv)Key Vault Crypto Officer ロールを自分に割り当てて、キーを作成します。
az role assignment create \ --role "Key Vault Crypto Officer" \ --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \ --assignee-principal-type "User" \ --scope $KEY_VAULT_RESOURCE_IDキー ボールトにキーを作成します。
export KEY_NAME="<your-key-name>" az keyvault key create --name $KEY_NAME --vault-name $KEY_VAULT_NAME # Get the key ID (without version for automatic rotation) export KEY_ID=$(az keyvault key show --name $KEY_NAME --vault-name $KEY_VAULT_NAME --query 'key.kid' -o tsv) export KEY_ID_NO_VERSION=$(echo $KEY_ID | sed 's|/[^/]*$||')信頼されたサービス バイパスを使用して Key Vault ファイアウォールを有効にします。
az keyvault update \ --name $KEY_VAULT_NAME \ --resource-group $RESOURCE_GROUP \ --default-action Deny \ --bypass AzureServices--default-action Denyパラメーターはパブリック ネットワーク アクセスをブロックし、--bypass AzureServicesパラメーターを使用すると、信頼された Azure サービス (AKS を含む) がキー コンテナーにアクセスできるようになります。
ユーザー割り当てマネージド ID を作成する
クラスターのユーザー割り当てマネージド ID を作成します。
export IDENTITY_NAME="<your-identity-name>" az identity create --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP # Get the identity details export IDENTITY_OBJECT_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'principalId' -o tsv) export IDENTITY_RESOURCE_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'id' -o tsv)マネージド ID に必要なロールを割り当てます。
# Assign Key Vault Crypto User role for encrypt/decrypt operations az role assignment create \ --role "Key Vault Crypto User" \ --assignee-object-id $IDENTITY_OBJECT_ID \ --assignee-principal-type "ServicePrincipal" \ --scope $KEY_VAULT_RESOURCE_ID # Assign Key Vault Contributor role for key management az role assignment create \ --role "Key Vault Contributor" \ --assignee-object-id $IDENTITY_OBJECT_ID \ --assignee-principal-type "ServicePrincipal" \ --scope $KEY_VAULT_RESOURCE_ID
カスタマー マネージド キー (プライベート) を使用して新しい AKS クラスターを作成する
顧客が管理するキーを使用したプライベートキー ボールトで、KMS 暗号化を用いて新しい AKS クラスターを作成します。
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kubernetes-version 1.33.0 \
--kms-infrastructure-encryption Enabled \
--enable-azure-keyvault-kms \
--azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
--azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
--azure-keyvault-kms-key-vault-network-access Private \
--assign-identity $IDENTITY_RESOURCE_ID \
--generate-ssh-keys
既存のクラスターでカスタマー マネージド キーを有効にする (プライベート)
既存の AKS クラスターで秘密キー コンテナーを使用して、カスタマー マネージド キーを使用して KMS 暗号化を有効にします。
注
クラスターで Kubernetes バージョン 1.33 以降が実行されている必要があります。
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kms-infrastructure-encryption Enabled \
--enable-azure-keyvault-kms \
--azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
--azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
--azure-keyvault-kms-key-vault-network-access Private \
--assign-identity $IDENTITY_RESOURCE_ID
KMS の構成を確認する
KMS 暗号化を有効にした後、構成を確認します。
az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query 'securityProfile'
出力には、KMS 構成が含まれます。
{
"azureKeyVaultKms": {
"enabled": true,
"keyId": "https://<key-vault-name>.vault.azure.net/keys/<key-name>",
"keyVaultNetworkAccess": "Private",
"keyVaultResourceId": "<key-vault-resource-id>"
},
"kubernetesResourceObjectEncryptionProfile": {
"infrastructureEncryption": "Enabled"
}
}
公開キー コンテナーを使用してカスタマー マネージド キー暗号化を有効にする
カスタマー マネージド キーを使用すると、独自の Azure Key Vault と暗号化キーを作成および管理できます。 このセクションでは、公開キー コンテナーを使用してカスタマー マネージド キーを構成する方法について説明します。
キー コンテナーとキーを作成する
Azure RBAC が有効になっているキー コンテナーを作成します。
export KEY_VAULT_NAME="<your-key-vault-name>" az keyvault create \ --name $KEY_VAULT_NAME \ --resource-group $RESOURCE_GROUP \ --enable-rbac-authorization true \ --public-network-access Enabled # Get the key vault resource ID export KEY_VAULT_RESOURCE_ID=$(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id -o tsv)Key Vault Crypto Officer ロールを自分に割り当てて、キーを作成します。
az role assignment create \ --role "Key Vault Crypto Officer" \ --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \ --assignee-principal-type "User" \ --scope $KEY_VAULT_RESOURCE_IDキー ボールトにキーを作成します。
export KEY_NAME="<your-key-name>" az keyvault key create --name $KEY_NAME --vault-name $KEY_VAULT_NAME # Get the key ID (without version for automatic rotation) export KEY_ID=$(az keyvault key show --name $KEY_NAME --vault-name $KEY_VAULT_NAME --query 'key.kid' -o tsv) export KEY_ID_NO_VERSION=$(echo $KEY_ID | sed 's|/[^/]*$||')
ユーザー割り当てマネージド ID を作成する
クラスターのユーザー割り当てマネージド ID を作成します。
export IDENTITY_NAME="<your-identity-name>" az identity create --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP # Get the identity details export IDENTITY_OBJECT_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'principalId' -o tsv) export IDENTITY_RESOURCE_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'id' -o tsv)マネージド ID に必要なロールを割り当てます。
# Assign Key Vault Crypto User role for encrypt/decrypt operations az role assignment create \ --role "Key Vault Crypto User" \ --assignee-object-id $IDENTITY_OBJECT_ID \ --assignee-principal-type "ServicePrincipal" \ --scope $KEY_VAULT_RESOURCE_ID # Assign Key Vault Contributor role for key management az role assignment create \ --role "Key Vault Contributor" \ --assignee-object-id $IDENTITY_OBJECT_ID \ --assignee-principal-type "ServicePrincipal" \ --scope $KEY_VAULT_RESOURCE_ID
カスタマー マネージド キーを使用して新しい AKS クラスターを作成する
カスタマー マネージド キーを使用して、KMS 暗号化を使用して新しい AKS クラスターを作成します。
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kubernetes-version 1.33.0 \
--kms-infrastructure-encryption Enabled \
--enable-azure-keyvault-kms \
--azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
--azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
--azure-keyvault-kms-key-vault-network-access Public \
--assign-identity $IDENTITY_RESOURCE_ID \
--generate-ssh-keys
既存のクラスターでカスタマー マネージド キーを有効にする
既存の AKS クラスターでカスタマー マネージド キーを使用して KMS 暗号化を有効にします。
注
クラスターで Kubernetes バージョン 1.33 以降が実行されている必要があります。
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kms-infrastructure-encryption Enabled \
--enable-azure-keyvault-kms \
--azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
--azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
--azure-keyvault-kms-key-vault-network-access Public \
--assign-identity $IDENTITY_RESOURCE_ID
KMS の構成を確認する
KMS 暗号化を有効にした後、構成を確認します。
az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query 'securityProfile'
出力には、KMS 構成が含まれます。
{
"azureKeyVaultKms": {
"enabled": true,
"keyId": "https://<key-vault-name>.vault.azure.net/keys/<key-name>",
"keyVaultNetworkAccess": "Public",
"keyVaultResourceId": "<key-vault-resource-id>"
},
"kubernetesResourceObjectEncryptionProfile": {
"infrastructureEncryption": "Enabled"
}
}
キー管理オプション間の移行
プラットフォームで管理されるキーとカスタマー マネージド キーの間で移行できます。
プラットフォームで管理されるキーからカスタマー マネージド キーに移行する
プラットフォームマネージド キーからカスタマー マネージド キーに移行するには、まずカスタマー マネージド キー セクションで説明されているようにキー コンテナー、キー、マネージド ID を設定してから、update コマンドを実行します。
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kms-infrastructure-encryption Enabled \
--enable-azure-keyvault-kms \
--azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
--azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
--azure-keyvault-kms-key-vault-network-access Public \
--assign-identity $IDENTITY_RESOURCE_ID
カスタマー マネージド キーからプラットフォームマネージド キーへの移行
カスタマー マネージド キーからプラットフォームマネージド キーに移行するには:
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--kms-infrastructure-encryption Enabled \
--disable-azure-keyvault-kms
キーのローテーション
KMS データ暗号化では、キーのローテーションはキー管理オプションによって処理が異なります。
- プラットフォームで管理されるキー: キーのローテーションは自動的に行われます。 アクションは必要ありません。
- カスタマー マネージド キー: Azure Key Vault でキー バージョンをローテーションすると、KMS コントローラーは定期的に (6 時間ごとに) ローテーションを検出し、新しいキー バージョンを使用します。
注
従来の KMS エクスペリエンスとは異なり、この新しい実装では、キーのローテーション後にシークレットを手動で再暗号化する必要はありません。 プラットフォームはこれを自動的に処理します。