次の方法で共有


Azure Kubernetes Service (AKS) クラスターで KMS データ暗号化を有効にする (プレビュー)

この記事では、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-preview Azure 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
      
  • kubectl CLI ツールがインストールされています。

機能フラグを登録する

プラットフォーム マネージド キーで KMS データ暗号化を使用するには、サブスクリプションに KMSPMKPreview 機能フラグを登録します。

  1. az feature register コマンドを使用して機能フラグを登録します。

    az feature register --namespace Microsoft.ContainerService --name KMSPMKPreview
    
  2. az feature show コマンドを使用して、登録の状態を確認します。 状態が [登録済み] と表示されるまでに数分かかります。

    az feature show --namespace Microsoft.ContainerService --name KMSPMKPreview
    
  3. 状態が [登録済み] と表示されたら コマンドを使用して 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 のネットワーク セキュリティに関するページを参照してください。

  1. 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)
    
  2. 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
    
  3. キー ボールトにキーを作成します。

    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|/[^/]*$||')
    
  4. 信頼されたサービス バイパスを使用して 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 を作成する

  1. クラスターのユーザー割り当てマネージド 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)
    
  2. マネージド 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 と暗号化キーを作成および管理できます。 このセクションでは、公開キー コンテナーを使用してカスタマー マネージド キーを構成する方法について説明します。

キー コンテナーとキーを作成する

  1. 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)
    
  2. 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
    
  3. キー ボールトにキーを作成します。

    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 を作成する

  1. クラスターのユーザー割り当てマネージド 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)
    
  2. マネージド 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 エクスペリエンスとは異なり、この新しい実装では、キーのローテーション後にシークレットを手動で再暗号化する必要はありません。 プラットフォームはこれを自動的に処理します。