AKS(Azure Kubernetes Service) 클러스터에서 KMS 데이터 암호화 사용(미리 보기)

이 문서에서는 AKS(Azure Kubernetes Service)에서 Kubernetes 비밀에 KMS(키 관리 서비스) 데이터 암호화를 사용하도록 설정하는 방법을 보여 줍니다. KMS 암호화는 Azure Key Vault 키를 사용하여 etcd에 저장된 Kubernetes 비밀을 암호화합니다.

AKS는 다음 두 가지 주요 관리 옵션을 지원합니다.

  • PMK(플랫폼 관리형 키) : AKS는 암호화 키를 자동으로 만들고 관리합니다. 이 옵션은 자동 키 회전을 사용하여 가장 간단한 설정을 제공합니다.
  • CMK(고객 관리형 키) : 사용자 고유의 Azure Key Vault 및 암호화 키를 만들고 관리합니다. 이 옵션은 키 수명 주기에 대한 모든 권한을 제공하고 고객 관리형 키를 의무화하는 규정 준수 요구 사항을 충족합니다.

암호화 개념 및 키 옵션에 대한 자세한 내용은 AKS에 대한 미사용 데이터 암호화 개념을 참조하세요.

중요합니다

AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

필수 조건

  • 이 문서에는 Azure CLI 버전 2.73.0 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
  • Azure CLI 확장 버전 aks-preview 이상이 필요합니다.
    • 아직 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 명령을 사용하여 등록 상태를 확인합니다. 상태가 Registered로 표시되는 데 몇 분 정도 걸립니다.

    az feature show --namespace Microsoft.ContainerService --name KMSPMKPreview
    
  3. 상태가 등록됨으로 표시되면 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 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 명령이 ReconcileAzureKeyVaultKmsError 오류를 반환하는 경우 다음 명령을 실행하여 기존 비밀을 읽고 쓸 수 있는지 확인합니다.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

이 명령이 실패하는 경우(예: 웹후크 거부 또는 리소스를 찾을 수 없음) 문제를 해결하고 업데이트 명령을 다시 실행하세요. '개체가 수정되었습니다'라는 메시지는 별도의 조치가 필요하지 않으며, 성공으로 간주하면 됩니다.

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. 키 볼트에 키를 만듭니다. encrypt 및 decrypt 키 작업이 사용 가능하도록 설정되어 있는지 확인합니다.

    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. 신뢰할 수 있는 서비스 우회와 함께 키 볼트 방화벽을 사용하도록 설정합니다.

    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 명령이 ReconcileAzureKeyVaultKmsError 오류를 반환하는 경우 다음 명령을 실행하여 기존 비밀을 읽고 쓸 수 있는지 확인합니다.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

이 명령이 실패하는 경우(예: 웹후크 거부 또는 리소스를 찾을 수 없음) 문제를 해결하고 업데이트 명령을 다시 실행하세요. '개체가 수정되었습니다'라는 메시지는 별도의 조치가 필요하지 않으며, 성공으로 간주하면 됩니다.

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. 키 볼트에 키를 만듭니다. encrypt 및 decrypt 키 작업이 사용 가능하도록 설정되어 있는지 확인합니다.

    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 명령이 ReconcileAzureKeyVaultKmsError 오류를 반환하는 경우 다음 명령을 실행하여 기존 비밀을 읽고 쓸 수 있는지 확인합니다.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

이 명령이 실패하는 경우(예: 웹후크 거부 또는 리소스를 찾을 수 없음) 문제를 해결하고 업데이트 명령을 다시 실행하세요. '개체가 수정되었습니다'라는 메시지는 별도의 조치가 필요하지 않으며, 성공으로 간주하면 됩니다.

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를 설정한 다음 업데이트 명령을 실행합니다.

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는 정기적으로 새 키 버전을 검색합니다. 새 키 버전을 만든 후 이전 키 버전을 삭제하기 전까지 최소 7일을 기다립니다.

비고

레거시 KMS 환경과 달리 이 새로운 구현을 사용하면 키 회전 후 비밀을 수동으로 다시 암호화할 필요가 없습니다. 플랫폼은 이를 자동으로 처리합니다.

새 키 버전을 만든 직후에는 이전 키 버전을 삭제하거나 만료하지 마세요.