Share via


キー管理サービス 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 実行して、設定が enableVnetIntegrationtrue設定されていることを確認できます。

制限事項

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-idaz-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-idaz-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 に移行するには、次の手順に従います。

  1. クラスターで KMS をオフにします。
  2. ストレージの移行を実行します。
  3. クラスターをバージョン 1.27 以降にアップグレードします。
  4. クラスターで KMS を有効にします。
  5. ストレージの移行を実行します。

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 -