Azure Kubernetes Service (AKS) の Azure マネージド ディスクでの Bring Your Own Key (BYOK)
Azure では、保存中のマネージド ディスク内のすべてのデータが暗号化されます。 規定では、データは Microsoft のマネージド キーで暗号化されます。 暗号化キーの制御を強化するために、AKS クラスターの OS ディスクとデータ ディスクの両方の暗号化に使用する目的でカスタマーマネージド キーを提供できます。
Linux と Windows のカスタマー マネージド キーについて学習してください。
前提条件
- 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
次のステップ
Azure Kubernetes Service