Azure Kubernetes Service (AKS) の Azure マネージド ディスクでの Bring Your Own Key (BYOK)

Azure では、保存中のマネージド ディスク内のすべてのデータが暗号化されます。 規定では、データは Microsoft のマネージド キーで暗号化されます。 暗号化キーの制御を強化するために、AKS クラスターの OS ディスクとデータ ディスクの両方の暗号化に使用する目的でカスタマーマネージド キーを提供できます。

LinuxWindows のカスタマー マネージド キーについて学習してください。

前提条件

  • Key Vault を使用してマネージド ディスクを暗号化する場合、Azure Key Vault の論理的な削除と消去保護を有効にする必要があります。
  • Azure CLI バージョン 2.11.1 以降を必要とします。
  • データ ディスク暗号化とカスタマー マネージド キーは、Kubernetes バージョン 1.24 以降でサポートされています。
  • キーを定期的にローテーション (変更) することを選ぶ場合、詳細については、カスタマー マネージド キーと Azure マネージド ディスクの暗号化に関する記事を参照してください。

制限事項

  • カスタマー マネージド キーによる OS ディスクの暗号化は、AKS クラスターの作成時にのみ、有効にできます。

  • 仮想ノードはサポートされていません。

  • カスタマー マネージド キーを使用してエフェメラル OS ディスク対応ノード プールを暗号化する場合に、Azure Key Vault でキーをローテーションするには、次のことが必要です。

    • ノード プール数を 0 にスケールダウンする
    • キーのローテーション
    • ノード プールを元の数にスケールアップします。

Azure Key Vault インスタンスを作成する

キーを格納するには、Azure Key Vault インスタンスを使用します。 必要に応じて、Azure portal を使用して、Azure Key Vault でカスタマーマネージド キーを構成できます

新しい "リソース グループ" を作成します。次に、新しい Key Vault インスタンスを作成し、論理的な削除と消去保護を有効にします。 各コマンドで同じリージョン名とリソース グループ名を使用するようにしてください。

# Optionally retrieve Azure region short names for use on upcoming commands
az account list-locations
# Create new resource group in a supported Azure region
az group create --location myAzureRegionName --name myResourceGroup

# Create an Azure Key Vault resource in a supported Azure region
az keyvault create --name myKeyVaultName --resource-group myResourceGroup --location myAzureRegionName  --enable-purge-protection true

DiskEncryptionSet のインスタンスを作成する

myKeyVaultName は、実際のキー コンテナーの名前に置き換えます。 また、次の手順を完了するには、Azure Key Vault に格納されたキーも必要です。 前の手順で作成したキー コンテナーに既存のキーを格納するか、新しいキーを生成して、myKeyName を実際のキーの名前に置き換えます。

# Retrieve the Key Vault Id and store it in a variable
keyVaultId=$(az keyvault show --name myKeyVaultName --query "[id]" -o tsv)

# Retrieve the Key Vault key URL and store it in a variable
keyVaultKeyUrl=$(az keyvault key show --vault-name myKeyVaultName --name myKeyName --query "[key.kid]" -o tsv)

# Create a DiskEncryptionSet
az disk-encryption-set create --name myDiskEncryptionSetName --location myAzureRegionName --resource-group myResourceGroup --source-vault $keyVaultId --key-url $keyVaultKeyUrl

重要

DiskEncryptionSet が AKS クラスターと同じリージョンにあり、AKS クラスター ID が DiskEncryptionSet への読み取りアクセス権を持っていることを確認します。

DiskEncryptionSet にキー コンテナーへのアクセス権を付与する

前の手順で作成した DiskEncryptionSet とリソース グループを使用し、DiskEncryptionSet リソースに Azure Key Vault へのアクセス権を付与します。

# Retrieve the DiskEncryptionSet value and set a variable
desIdentity=$(az disk-encryption-set show --name myDiskEncryptionSetName --resource-group myResourceGroup --query "[identity.principalId]" -o tsv)

# Update security policy settings
az keyvault set-policy --name myKeyVaultName --resource-group myResourceGroup --object-id $desIdentity --key-permissions wrapkey unwrapkey get

新しい AKS クラスターを作成し、OS ディスクを暗号化する

新しいリソース グループを作成するか、他の AKS クラスターをホストしている既存のリソース グループを選択してから、ネットワークに接続された OS ディスクまたはエフェメラル OS ディスクのどちらかを使用し、キーを使用して暗号化します。 既定では、クラスターは、可能な場合は VM サイズおよび OS ディスク サイズと組み合わせて、エフェメラル OS ディスクを使用します。

次のコマンドを実行して DiskEncryptionSet 値を取得し、変数を設定します。

diskEncryptionSetId=$(az disk-encryption-set show --name mydiskEncryptionSetName --resource-group myResourceGroup --query "[id]" -o tsv)

クラスターの新しいリソース グループを作成する場合は、次のコマンドを実行します。

az group create --name myResourceGroup --location myAzureRegionName

キーで暗号化されたネットワークに接続された OS ディスクを使用して通常のクラスターを作成するには、--node-osdisk-type=Managed 引数を指定します。

az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

キーで暗号化されたエフェメラル OS ディスクを使用してクラスターを作成するには、 --node-osdisk-type=Ephemeral 引数を指定します。 また、既定の VM サイズが小さすぎて、エフェメラル OS ディスクがサポートされないため、引数 --node-vm-size も指定する必要があります。

az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Ephemeral --node-vm-size Standard_DS3_v2

クラスターに新しいノード プールが追加されると、作成プロセス時に提供されたカスタマー マネージド キーが OS ディスクの暗号化に使用されます。 次の例は、エフェメラル OS ディスクを使用して新しいノード プールをデプロイする方法を示しています。

az aks nodepool add --cluster-name $CLUSTER_NAME --resource-group $RG_NAME --name $NODEPOOL_NAME --node-osdisk-type Ephemeral

AKS クラスターのデータ ディスクを暗号化する

クラスターの作成時にディスク暗号化セットを既に指定している場合は、同じディスク暗号化セットを使用してデータ ディスクを暗号化することが既定のオプションです。 したがって、この手順は省略可能です。 ただし、別のディスク暗号化セットを使用してデータ ディスクを暗号化する場合は、次の手順を実行できます。

重要

適切な AKS 資格情報を持っていることを確認します。 マネージド ID は、diskencryptionset がデプロイされているリソース グループへの共同作成者アクセス権を保持している必要があります。 そうしないと、マネージド ID にアクセス許可がないことを示すエラーが表示されます。

AKS クラスター ID に diskencryptionset の共同作成者ロールを割り当てるには、次のコマンドを実行します:

aksIdentity=$(az aks show --resource-group $RG_NAME --name $CLUSTER_NAME --query "identity.principalId")
az role assignment create --role "Contributor" --assignee $aksIdentity --scope $diskEncryptionSetId

次の情報を含む byok-azure-disk.yaml というファイルを作成します。 "myAzureSubscriptionId"、"myResourceGroup"、"myDiskEncrptionSetName" をご使用の値に置き換え、yaml を適用します。 必ず、DiskEncryptionSet がデプロイされているリソース グループを使用してください。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: byok
provisioner: disk.csi.azure.com # replace with "kubernetes.io/azure-disk" if aks version is less than 1.21
parameters:
  skuname: StandardSSD_LRS
  kind: managed
  diskEncryptionSetID: "/subscriptions/{myAzureSubscriptionId}/resourceGroups/{myResourceGroup}/providers/Microsoft.Compute/diskEncryptionSets/{myDiskEncryptionSetName}"

次に、次のコマンドを実行して AKS クラスターを更新します。

# Get credentials
az aks get-credentials --name myAksCluster --resource-group myResourceGroup --output table

# Update cluster
kubectl apply -f byok-azure-disk.yaml

次のステップ

AKS クラスターのセキュリティに関するベスト プラクティスを確認する