キー管理サービス etcd 暗号化を Azure Kubernetes Service クラスターに追加する
この記事では、Azure Key Vault と キー管理サービス (KMS) プラグインを使用して、etcd キー値ストアで Azure Kubernetes Service (AKS) シークレットの保存時の暗号化を有効にする方法について説明します。 KMS プラグインを使用すると、次のことができます。
- etcd 暗号化には、キー コンテナー内のキーを使用します。
- 独自のキーを使用します。
- etcd に格納されているシークレットの保存時の暗号化を提供します。
- キー コンテナー内のキーをローテーションします。
KMS の使用の詳細については、「保存時のシークレット データの暗号化」を参照してください。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Azure CLI バージョン 2.39.0 以降。 バージョンを確認するには
az --version
を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールに関するページを参照してください。
警告
KMS では、Konnectivity または API Server VNet 統合 (プレビュー) がサポートされます。
結果を確認し、konnectivity-agent ポッドが実行されていることを示すために使用 kubectl get po -n kube-system
できます。 ポッドが実行されている場合、AKS クラスターでは Konnectivity が使用されます。 API Server VNet 統合を使用する場合は、コマンドを az aks show -g -n
実行して、設定が enableVnetIntegration
に true
設定されていることを確認できます。
制限事項
KMS etcd 暗号化を AKS と統合する場合、次の制限が適用されます。
- キー、キー コンテナー、または関連付けられている ID の削除はサポートされていません。
- KMS etcd 暗号化はシステム割り当てマネージド ID では機能しません。 この機能を有効にする前に、キー コンテナーのアクセス ポリシーを設定する必要があります。 システム割り当てマネージド ID は、クラスターが作成されるまで使用できません。 サイクルの依存関係について考えてみましょう。
- パブリック アクセスを許可するファイアウォールを備えた Azure Key Vault は、KMS プラグインからキー コンテナーへのトラフィックをブロックするため、サポートされていません。
- KMS が有効になっているクラスターでサポートされているシークレットの最大数は 2,000 です。 ただし、KMS v2 はこの制限によって制限されず、より多くのシークレットを処理できることに注意してください。
- 別のテナントからの Bring Your Own (BYO) Azure Key Vault はサポートされていません。
- KMS を有効にすると、関連付けられているキー コンテナー モード (パブリックモードとプライベートモード) を変更することはできません。 キー コンテナー モードを更新するには、最初に KMS をオフにしてから、もう一度有効にする必要があります。
- クラスターで KMS が有効になっていて、秘密キー コンテナーがあり、API Server VNet 統合トンネルを使用していない場合は、クラスターを停止してから起動することはできません。
- 仮想マシン スケール セット API を使用してクラスター内のノードをゼロにスケールダウンすると、ノードの割り当てが解除されます。 その後、クラスターがダウンし、回復不能になります。
- KMS をオフにした後は、キーを破棄できません。 キーを破棄すると、API サーバーが動作しなくなります。
KMS では、 公開キー コンテナーまたは秘密キー コンテナー が サポートされています。
公開キー コンテナーの KMS を有効にする
次のセクションでは、公開キー コンテナーの KMS を有効にする方法について説明します。
公開キー コンテナーとキーを作成する
警告
キーまたはキー コンテナーの削除はサポートされておらず、クラスター内のシークレットが回復不能になります。
キー コンテナーまたはキーを回復する必要がある場合は、論理的な削除と消去の保護による Azure Key Vault の回復管理に関するページを参照してください。
RBAC 以外の公開キー コンテナーのキー コンテナーとキーを作成する
Azure ロールベースのアクセス制御 (Azure RBAC) を使用せずにキー コンテナーを作成するために使用 az keyvault create
します。
az keyvault create --name MyKeyVault --resource-group MyResourceGroup
キーの作成に使用 az keyvault key create
します。
az keyvault key create --name MyKeyName --vault-name MyKeyVault
キー ID をエクスポートするために使用 az keyvault key show
します。
export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID
この例では、キー ID を KEY_ID
.
RBAC 公開キー コンテナーのキー コンテナーとキーを作成する
Azure RBAC を使用してキー コンテナーを作成するために使用 az keyvault create
します。
export KEYVAULT_RESOURCE_ID=$(az keyvault create --name MyKeyVault --resource-group MyResourceGroup --enable-rbac-authorization true --query id -o tsv)
キーを作成するためのアクセス許可を自分自身に割り当てます。
az role assignment create --role "Key Vault Crypto Officer" --assignee-object-id $(az ad signed-in-user show --query id --out tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID
キーの作成に使用 az keyvault key create
します。
az keyvault key create --name MyKeyName --vault-name MyKeyVault
キー ID をエクスポートするために使用 az keyvault key show
します。
export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID
この例では、キー ID を KEY_ID
.
公開キー コンテナーのユーザー割り当てマネージド ID を作成する
ユーザー割り当てマネージド ID を作成するために使用 az identity create
します。
az identity create --name MyIdentity --resource-group MyResourceGroup
ID オブジェクト ID を取得するために使用 az identity show
します。
IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID
前の例では、ID オブジェクト ID IDENTITY_OBJECT_ID
の値を .
ID リソース ID を取得するために使用 az identity show
します。
IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID
この例では、ID リソース ID IDENTITY_RESOURCE_ID
の値を格納します。
公開キー コンテナーの暗号化を解除して暗号化するためのアクセス許可を割り当てる
次のセクションでは、秘密キー コンテナーの暗号化解除と暗号化のアクセス許可を割り当てる方法について説明します。
RBAC 以外の公開キー コンテナーのアクセス許可を割り当てる
キー コンテナーが設定 --enable-rbac-authorization
されていない場合は、Azure Key Vault ポリシーの作成に使用 az keyvault set-policy
できます。
az keyvault set-policy -n MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID
RBAC 公開キー コンテナーのアクセス許可を割り当てる
キー コンテナーが設定 --enable-rbac-authorization
されている場合は、キー コンテナーの暗号化ユーザー ロールを割り当てて、暗号化解除と暗号化のアクセス許可を付与します。
az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID
公開キー コンテナーを持つ AKS クラスターを作成し、KMS etcd 暗号化を有効にする
KMS etcd 暗号化を有効にするには、az aks create コマンドを使用して AKS クラスターを 作成 します。 とパラメーターaz aks create
を--enable-azure-keyvault-kms
--azure-keyvault-kms-key-vault-network-access
--azure-keyvault-kms-key-id
使用できます。
az aks create --name myAKSCluster --resource-group MyResourceGroup --assign-identity $IDENTITY_RESOURCE_ID --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID
既存の AKS クラスターを更新して、公開キー コンテナーの KMS etcd 暗号化を有効にする
既存のクラスターの KMS etcd 暗号化を有効にするには、az aks update コマンドを使用します。 とパラメーターaz-aks-update
を--enable-azure-keyvault-kms
--azure-keyvault-kms-key-vault-network-access
--azure-keyvault-kms-key-id
使用できます。
az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID
次のコマンドを使用して、すべてのシークレットを更新します。 このコマンドを実行しない場合、以前に作成されたシークレットは暗号化されなくなります。 大規模なクラスターでは、名前空間によってシークレットを分割したり、更新スクリプトを作成したりできます。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
公開キー コンテナー内の既存のキーをローテーションする
キー ID を変更した後 (キー名またはキーバージョンの変更を含む)、az aks update コマンドを使用できます。 とパラメーターaz-aks-update
を--enable-azure-keyvault-kms
--azure-keyvault-kms-key-vault-network-access
--azure-keyvault-kms-key-id
使用して、KMS 内の既存のキーを回転させることができます。
警告
キーのローテーション後は、必ずすべてのシークレットを更新してください。 すべてのシークレットを更新しない場合、以前に作成されたキーが存在しないか、機能しなくなった場合、シークレットにアクセスできません。
キーをローテーションした後も、前のキー (key1) は引き続きキャッシュされるため、削除しないでください。 直前のキー (key1) をすぐに削除する場合は、キーを 2 回ローテーションする必要があります。 その後、key2 と key3 がキャッシュされ、key1 は既存のクラスターに影響を与えずに削除できます。
az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $NEW_KEY_ID
次のコマンドを使用して、すべてのシークレットを更新します。 このコマンドを実行しない場合でも、以前に作成されたシークレットは前のキーで暗号化されます。 大規模なクラスターでは、名前空間によってシークレットを分割したり、更新スクリプトを作成したりできます。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
秘密キー コンテナーの KMS を有効にする
秘密キー コンテナーに対して KMS を有効にすると、AKS によって、ノード リソース グループにプライベート エンドポイントとプライベート リンクが自動的に作成されます。 キー コンテナーには、AKS クラスターとのプライベート エンドポイント接続が追加されます。
秘密キー コンテナーとキーを作成する
警告
キーまたはキー コンテナーの削除はサポートされておらず、クラスター内のシークレットが回復不能になります。
キー コンテナーまたはキーを回復する必要がある場合は、論理的な削除と消去の保護による Azure Key Vault の回復管理に関するページを参照してください。
秘密キー コンテナーを作成するために使用 az keyvault create
します。
az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled
プライベート エンドポイントを持たない秘密キー コンテナーでのキーの作成または更新はサポートされていません。 秘密キー コンテナーを管理する方法については、「Azure Private Link を使用してキー コンテナーを統合する」を参照してください。
秘密キー コンテナーのユーザー割り当てマネージド ID を作成する
ユーザー割り当てマネージド ID を作成するために使用 az identity create
します。
az identity create --name MyIdentity --resource-group MyResourceGroup
ID オブジェクト ID を取得するために使用 az identity show
します。
IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID
前の例では、ID オブジェクト ID IDENTITY_OBJECT_ID
の値を .
ID リソース ID を取得するために使用 az identity show
します。
IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID
この例では、ID リソース ID IDENTITY_RESOURCE_ID
の値を格納します。
秘密キー コンテナーの暗号化を解除して暗号化するためのアクセス許可を割り当てる
次のセクションでは、秘密キー コンテナーの暗号化解除と暗号化のアクセス許可を割り当てる方法について説明します。
RBAC 以外の秘密キー コンテナーのアクセス許可を割り当てる
Note
秘密キー コンテナーを使用する場合、AKS は ID のアクセス許可を検証できません。 KMS を有効にする前に、キー コンテナーにアクセスするためのアクセス許可が ID に付与されていることを確認します。
キー コンテナーが設定 --enable-rbac-authorization
されていない場合は、Azure でキー コンテナー ポリシーを作成するために使用 az keyvault set-policy
できます。
az keyvault set-policy -n MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID
RBAC 秘密キー コンテナーのアクセス許可を割り当てる
キー コンテナーが設定 --enable-rbac-authorization
されている場合は、暗号化解除と暗号化のアクセス許可を含む Azure RBAC ロールを割り当てます。
az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID
アクセス許可を割り当ててプライベート リンクを作成する
秘密キー コンテナーの場合、秘密キー コンテナーとクラスターの間にプライベート リンクを作成するには、Key Vault 共同作成者ロールが必要です。
az role assignment create --role "Key Vault Contributor" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID
秘密キー コンテナーを持つ AKS クラスターを作成し、KMS etcd 暗号化を有効にする
秘密キー コンテナーの KMS etcd 暗号化を有効にするには、az aks create コマンドを使用して AKS クラスターを 作成 します。 で、、、--azure-keyvault-kms-key-vault-network-access
、およびパラメーターを--azure-keyvault-kms-key-vault-resource-id
az-aks-create
使用--enable-azure-keyvault-kms
--azure-keyvault-kms-key-id
できます。
az aks create --name myAKSCluster --resource-group MyResourceGroup --assign-identity $IDENTITY_RESOURCE_ID --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID
既存の AKS クラスターを更新して、秘密キー コンテナーの KMS etcd 暗号化を有効にする
秘密キー コンテナーを持つ既存のクラスターで KMS etcd 暗号化を有効にするには、az aks update コマンドを使用します。 で、、、--azure-keyvault-kms-key-vault-network-access
、およびパラメーターを--azure-keyvault-kms-key-vault-resource-id
az-aks-update
使用--enable-azure-keyvault-kms
--azure-keyvault-kms-key-id
できます。
az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID
次のコマンドを使用して、すべてのシークレットを更新します。 このコマンドを実行しない場合、以前に作成されたシークレットは暗号化されません。 大規模なクラスターでは、名前空間によってシークレットを分割したり、更新スクリプトを作成したりできます。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
秘密キー コンテナー内の既存のキーをローテーションする
キー ID (キー名とキー バージョンを含む) を変更した後は、az aks update コマンドを使用できます。 、、--azure-keyvault-kms-key-id
、--azure-keyvault-kms-key-vault-network-access
および--azure-keyvault-kms-key-vault-resource-id
パラメーターaz-aks-update
を--enable-azure-keyvault-kms
使用して、KMS の既存のキーを回転させることができます。
警告
キーのローテーション後は、必ずすべてのシークレットを更新してください。 すべてのシークレットを更新しない場合、以前に作成されたキーが存在しないか、機能しなくなった場合、シークレットにアクセスできません。
キーをローテーションした後も、前のキー (key1) は引き続きキャッシュされるため、削除しないでください。 直前のキー (key1) をすぐに削除する場合は、キーを 2 回ローテーションする必要があります。 その後、key2 と key3 がキャッシュされ、key1 は既存のクラスターに影響を与えずに削除できます。
az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID
次のコマンドを使用して、すべてのシークレットを更新します。 すべてのシークレットを更新しない場合、以前に作成されたシークレットは前のキーで暗号化されます。 大規模なクラスターでは、名前空間によってシークレットを分割したり、更新スクリプトを作成したりできます。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
キー コンテナー モードを更新する
Note
異なるモード (パブリックまたはプライベート) を使用して別のキー コンテナーを変更するには、直接実行 az aks update
できます。 アタッチされたキー コンテナーのモードを変更するには、最初に KMS をオフにしてから、新しいキー コンテナー ID を使用して再度有効にする必要があります。
次のセクションでは、アタッチされた公開キー コンテナーをプライベート モードに移行する方法について説明します。
クラスターで KMS をオフにする
既存のクラスターで KMS をオフにし、キー コンテナーを解放します。
az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms
キー コンテナー モードを変更する
キー コンテナーをパブリックからプライベートに更新します。
az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled
更新されたキー コンテナーを使用してクラスターの KMS を有効にする
更新された秘密キー コンテナーを使用して KMS を有効にします。
az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID
KMS を設定したら、キー コンテナーの診断設定を有効にして、暗号化ログをチェックできます。
KMS をオフにする
KMS をオフにする前に、次の Azure CLI コマンドを使用して、KMS が有効になっているかどうかをチェックできます。
az aks list --query "[].{Name:name, KmsEnabled:securityProfile.azureKeyVaultKms.enabled, KeyId:securityProfile.azureKeyVaultKms.keyId}" -o table
結果で KMS がオンであることが確認された場合は、次のコマンドを実行して、クラスターで KMS をオフにします。
az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms
次のコマンドを使用して、すべてのシークレットを更新します。 このコマンドを実行しない場合でも、以前に作成したシークレットは以前のキーで暗号化され、キー コンテナーに対する暗号化と暗号化解除のアクセス許可は引き続き必要です。 大規模なクラスターでは、名前空間によってシークレットを分割したり、更新スクリプトを作成したりできます。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
KMS v2 のサポート
AKS バージョン 1.27 以降では、KMS 機能を有効にすると KMS v2 が構成されます。 KMS v2 では、以前のバージョンでサポートされている 2,000 個のシークレットに制限されません。 詳細については、「KMS V2 の機能強化」を参照してください。
KMS v2 への移行
クラスターのバージョンが 1.27 より後で、既に KMS を有効にしている場合、KMS 1.27 以降へのアップグレードはブロックされます。 KMS v2 に移行するには、次の手順に従います。
- クラスターで KMS をオフにします。
- ストレージの移行を実行します。
- クラスターをバージョン 1.27 以降にアップグレードします。
- クラスターで KMS を有効にします。
- ストレージの移行を実行します。
KMS をオフにしてストレージを移行する
既存のクラスターで KMS をオフにするには、次のコマンドを az aks update
引数と共に --disable-azure-keyvault-kms
使用します。
az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms
ストレージを移行する
すべてのシークレットを更新するには、引数と共に kubectl get secrets
コマンドを --all-namespaces
使用します。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
AKS クラスターのアップグレード
AKS クラスターをアップグレードするには、コマンドを az aks upgrade
使用します。 引数を使用して、バージョンを 1.27.x
それ以降に --kubernetes-version
設定します。
az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <AKS version>
次に例を示します。
az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version 1.27.1
ストレージ移行後に KMS を有効にする
クラスターの KMS 機能をもう一度有効にして、シークレットを暗号化できます。 その後、AKS クラスターでは KMS v2 が使用されます。 KMS v2 に移行しない場合は、KMS が有効になっているバージョン 1.27 以降の新しいクラスターを作成できます。
KMS v2 のストレージを移行する
KMS v2 のすべてのシークレットを再暗号化するには、次のコマンドを kubectl get secrets
引数と共に --all-namespaces
使用します。
kubectl get secrets --all-namespaces -o json | kubectl replace -f -