Azure Kubernetes Service クラスターにキー管理サービス etcd 暗号化を追加する

この記事では、Azure Key Vault とキー管理サービス (KMS) プラグインを使用して、etcd キー値ストア内で Azure Kubernetes Service (AKS) シークレットの保存時の暗号化を有効にする方法について説明します。 KMS プラグインを使用すると、次のことができます。

  • etcd 暗号化に、キー コンテナー内のキーを使用します。
  • 独自のキーを使用します。
  • etcd 内に保存されているシークレットの保存時の暗号化を提供します。
  • キー コンテナー内のキーをローテーションします。

KMS の使用の詳細については、「データ暗号化に KMS プロバイダーを使用する」を参照してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます
  • Azure CLI バージョン 2.39.0 以降。 バージョンを確認するには az --version を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールに関するページを参照してください。

警告

KMS では、公開キー コンテナー用として Konnectivity または API サーバー VNet 統合 (プレビュー) がサポートされています。

KMS では、秘密キー コンテナー用として API サーバー VNet 統合 (プレビュー) のみがサポートされます。

kubectl get po -n kube-system を使用して結果を確認し、konnectivity-agent ポッドが実行されていることを表示できます。 ポッドが実行されている場合、その AKS クラスターでは Konnectivity が使用されています。 API Server VNet 統合を使用する場合は、az aks show -g -n コマンドを実行して、enableVnetIntegration の設定が true に設定されていることを確認できます。

制限事項

KMS etcd 暗号化を AKS と統合する場合、次の制限が適用されます。

  • キー、キー コンテナー、または関連付けられた ID の削除はサポートされていません。
  • KMS etcd 暗号化はシステム割り当てマネージド ID では機能しません。 この機能を有効にする前に、キー コンテナーのアクセス ポリシーを設定する必要があります。 システム割り当てマネージド ID は、クラスターが作成されるまで使用できません。 このサイクルの依存関係を考慮してください。
  • [特定の仮想ネットワークと IP アドレスからのパブリック アクセスを許可する] または [パブリック アクセスを無効にする] ファイアウォール設定を備えた Azure Key Vault は、KMS プラグインからキー コンテナーへのトラフィックをブロックするため、サポートされていません。
  • KMS が有効なクラスターでサポートされているシークレットの最大数は 2,000 です。 ただし、KMS v2 はこの制限を受けず、さらに多くのシークレットを処理できることに注意するのが重要です。
  • 別のテナントからの Bring Your Own (BYO) の Azure キー コンテナーはサポートされていません。
  • KMS を有効にすると、関連付けられたキー コンテナー モード (公開か秘密) を変更することはできません。 キー コンテナー モードを更新するには、まず KMS を無効にしてから、もう一度有効にする必要があります。
  • クラスターで KMS が有効になっていて、秘密キー コンテナーがある場合は、API サーバー VNet 統合 (プレビュー) トンネルを使用する必要があります。 Konnectivity はサポートされていません。
  • Virtual Machine Scale Sets 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

az keyvault key show を使用して、キー ID をエクスポートします。

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 -o tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID

az keyvault key create を使用して、キーを作成します。

az keyvault key create --name MyKeyName --vault-name MyKeyVault

az keyvault key show を使用して、キー ID をエクスポートします。

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

この例では、キー ID を KEY_ID の中に格納しました。

公開キー コンテナーのユーザー割り当てマネージド ID を作成する

az identity create を使用して、ユーザー割り当てマネージド ID を作成します。

az identity create --name MyIdentity --resource-group MyResourceGroup

az identity show を使用して、ID オブジェクト ID を取得します。

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

前の例では、ID オブジェクト ID の値を IDENTITY_OBJECT_ID の中に格納しました。

az identity show を使用して、ID リソース ID を取得します。

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 で設定されていない場合は、az keyvault set-policy を使用して Azure キー コンテナー ポリシーを作成できます。

az keyvault set-policy --name 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 \
    --generate-ssh-keys

既存 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 内の既存キーをローテーションできます。

警告

キーのローテーション後は、必ずすべてのシークレットを更新してください。 すべてのシークレットを更新しない場合、以前に作成されたキーが存在しない、またはもう機能しなくなった場合に、それらのシークレットにアクセスできません。

KMS では、2 つのキーが同時に使用されます。 最初のキー ローテーションの後、次のキー ローテーションまで古いキーと新しいキーの両方が期限切れになることなく有効であることを確認する必要があります。 2 番目のキー ローテーション後は、最も古いキーを安全に削除/期限切れにできます

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 クラスターとのプライベート エンドポイント接続に追加されます。

警告

KMS では、秘密キー コンテナー用として API サーバー VNet 統合 (プレビュー) のみがサポートされます。

秘密キー コンテナーとキーを作成する

警告

キーまたはキー コンテナーの削除はサポートされておらず、クラスター内のシークレットが復旧不能になります。

キー コンテナーまたはキーを復旧する必要がある場合は、「論理的な削除と消去保護を使用した Azure Key Vault の回復の管理」を参照してください。

az keyvault create を使用して、秘密キー コンテナーを作成します。

az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

プライベート エンドポイントを持たない秘密キー コンテナー内でのキーの作成または更新はサポートされていません。 秘密キー コンテナーを管理する方法については、「Key Vault を Azure Private Link と統合する」を参照してください。

秘密キー コンテナーのユーザー割り当てマネージド ID を作成する

az identity create を使用して、ユーザー割り当てマネージド ID を作成します。

az identity create --name MyIdentity --resource-group MyResourceGroup

az identity show を使用して、ID オブジェクト ID を取得します。

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

前の例では、ID オブジェクト ID の値を IDENTITY_OBJECT_ID の中に格納しました。

az identity show を使用して、ID リソース ID を取得します。

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 で設定されていない場合は、az keyvault set-policy を使用して Azure 内にキー コンテナー ポリシーを作成できます。

az keyvault set-policy --name 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 クラスターを作成します。 az-aks-create では、--enable-azure-keyvault-kms--azure-keyvault-kms-key-id--azure-keyvault-kms-key-vault-network-access--azure-keyvault-kms-key-vault-resource-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 \
    --generate-ssh-keys

既存 AKS クラスターを更新して、秘密キー コンテナーの KMS etcd 暗号化を有効にする

秘密キー コンテナーを持つ既存クラスター上で KMS etcd 暗号化を有効にするには、az aks update コマンドを使用します。 az-aks-update では、--enable-azure-keyvault-kms--azure-keyvault-kms-key-id--azure-keyvault-kms-key-vault-network-access--azure-keyvault-kms-key-vault-resource-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 コマンドを使用できます。 az-aks-update--enable-azure-keyvault-kms--azure-keyvault-kms-key-id--azure-keyvault-kms-key-vault-network-access--azure-keyvault-kms-key-vault-resource-id パラメーターを使用して、KMS 内の既存キーをローテーションできます。

警告

キーのローテーション後は、必ずすべてのシークレットを更新してください。 すべてのシークレットを更新しない場合、以前に作成されたキーが存在しない、またはもう機能しなくなった場合に、それらのシークレットにアクセスできません。

キーをローテーションした後も、前のキー (キー 1) は引き続きキャッシュされるため、削除しないでください。 前のキー (キー 1) をすぐに削除する場合は、そのキーを 2 回ローテーションする必要があります。 すると、キー 2 とキー 3 がキャッシュされ、既存クラスターに影響を与えずにキー 1 を削除できます。

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

プライベートからパブリック セットへ移行するには、上記のコマンドで --public-network-accessEnabled に設定します。

更新されたキー コンテナーを使用してクラスターの 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 Improvements を参照してください。

KMS v2 に移行する

クラスターのバージョンが 1.27 より古く、既に KMS が有効な場合、クラスター バージョン 1.27 以降へのアップグレードはブロックされます。 KMS v2 に移行するには、次の手順を実行します。

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

KMS を無効にしてストレージを移行する

既存クラスター上で KMS を無効にするには、--disable-azure-keyvault-kms 引数を指定して az aks update コマンドを使用します。

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

ストレージを移行する

すべてのシークレットを更新するには、--all-namespaces 引数を指定して kubectl get secrets コマンドを使用します。

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

AKS クラスターのアップグレード

AKS クラスターをアップグレードするには、az aks upgrade コマンドを使用します。 --kubernetes-version 引数を使用して、バージョンを 1.27.x 以降に設定します。

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 内のすべてのシークレットを再暗号化するには、--all-namespaces 引数を指定して kubectl get secrets コマンドを使用します。

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