既存のクラスターで KMS を使用して Kubernetes シークレットを暗号化する - アマゾン EKS

このページの改善にご協力ください

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。

既存のクラスターで KMS を使用して Kubernetes シークレットを暗号化する

重要

この手順の対象となるのは、Kubernetes バージョン 1.27 以前を実行している EKS クラスターのみです。Kubernetes バージョン 1.28 以降を実行している場合、デフォルトでは Kubernetes シークレットはエンベロープ暗号化で保護されます。詳細については、「すべての Kubernetes API データを対象とするデフォルトのエンベロープ暗号化」を参照してください。

シークレット暗号化を有効にすると、選択した AWS KMS キーを使用して Kubernetes シークレットが暗号化されます。KMS キーは次の条件を満たす必要があります:

  • 対称

  • データの暗号化と復号が可能

  • クラスターと同じ AWS リージョンに作成

  • KMS キーが別のアカウントで作成された場合、IAM プリンシパルにはその KMS キーへのアクセス権が必要となります。

詳細については「AWS キーマネジメントサービス開発者ガイド」の「他のアカウントの IAM プリンシパルが KMS キーを使用することを許可する」を参照してください。

警告

一度有効化したシークレット暗号化は無効化できません。このアクションを元に戻すことはできません。

eksctl

この手順の対象となるのは、Kubernetes バージョン 1.27 以前を実行している EKS クラスターのみです。詳細については、「すべての Kubernetes API データを対象とするデフォルトのエンベロープ暗号化」を参照してください。

暗号化は次の 2 つの方法のいずれかで有効にできます:

  • 1 つのコマンドでクラスターに暗号化を追加します。

    シークレットを自動的に再暗号化するには次のコマンドを実行してください。

    eksctl utils enable-secrets-encryption \ --cluster my-cluster \ --key-arn arn:aws:kms:region-code:account:key/key

    シークレットの自動的な再暗号化をオプトアウトするには次のコマンドを実行してください。

    eksctl utils enable-secrets-encryption --cluster my-cluster \ --key-arn arn:aws:kms:region-code:account:key/key \ --encrypt-existing-secrets=false
  • kms-cluster.yaml ファイルを使用してクラスターに暗号化を追加します。

    apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code secretsEncryption: keyARN: arn:aws:kms:region-code:account:key/key

    シークレットに自動的な再暗号化をさせるには次のコマンドを実行してください。

    eksctl utils enable-secrets-encryption -f kms-cluster.yaml

    シークレットの自動的な再暗号化をオプトアウトするには次のコマンドを実行してください。

    eksctl utils enable-secrets-encryption -f kms-cluster.yaml --encrypt-existing-secrets=false
    AWS Management Console
    1. この手順の対象となるのは、Kubernetes バージョン 1.27 以前を実行している EKS クラスターのみです。詳細については、「すべての Kubernetes API データを対象とするデフォルトのエンベロープ暗号化」を参照してください。

    2. Amazon EKS コンソールを開きます。

    3. KMS 暗号化を追加するクラスターを選択してください。

    4. [Overview] (概要 タブを選択してください (これはデフォルトで選択されています)。

    5. [秘密の暗号化] (シークレットの暗号化 セクションまでスクロールダウンし、[Enable] (有効化 ボタンを選択してください。

    6. ドロップダウンリストからキーを選択し、[Enable] (有効化 ボタンを選択してください。キーが一覧表示されていない場合は最初にキーを作成する必要があります。詳細については「キーの作成」を参照してください。

    7. [Confirm] (確認) ボタンを選択して、指定したキーを使用します。

    AWS CLI
    1. この手順の対象となるのは、Kubernetes バージョン 1.27 以前を実行している EKS クラスターのみです。詳細については、「すべての Kubernetes API データを対象とするデフォルトのエンベロープ暗号化」を参照してください。

    2. 次の AWS CLI コマンドを使用して、シークレット暗号化設定をクラスターに関連付けます。値の例 は実際に使用する値に置き換えます。

      aws eks associate-encryption-config \ --cluster-name my-cluster \ --encryption-config '[{"resources":["secrets"],"provider":{"keyArn":"arn:aws:kms:region-code:account:key/key"}}]'

      出力例は次のとおりです。

      {   "update": {     "id": "3141b835-8103-423a-8e68-12c2521ffa4d",     "status": "InProgress",     "type": "AssociateEncryptionConfig",     "params": [       {         "type": "EncryptionConfig",         "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws:kms:region-code:account:key/key\"}}]"       }     ],     "createdAt": 1613754188.734,     "errors": []   } }
    3. 次のコマンドを使用すると、暗号化更新のステータスをモニタリングできます。前の出力で返された特定の cluster nameupdate ID を使用します。Successful ステータスが表示されると、更新は完了です。

      aws eks describe-update \ --region region-code \ --name my-cluster \ --update-id 3141b835-8103-423a-8e68-12c2521ffa4d

      出力例は次のとおりです。

      {   "update": {     "id": "3141b835-8103-423a-8e68-12c2521ffa4d",     "status": "Successful",     "type": "AssociateEncryptionConfig",     "params": [       {         "type": "EncryptionConfig",         "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws:kms:region-code:account:key/key\"}}]"       }     ],     "createdAt": 1613754188.734>,     "errors": []   } }
    4. クラスターで暗号化が有効になっていることを確認するにはdescribe-cluster コマンドを実行してください。レスポンスの内容は文字列 EncryptionConfig です。

      aws eks describe-cluster --region region-code --name my-cluster

クラスターで暗号化を有効にしたら、既存のすべてのシークレットを新しいキーで暗号化する必要があります:

注記

eksctl を使用する場合、シークレットを自動的に再暗号化することをオプトアウトした場合にのみ、次のコマンドを実行する必要があります。

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - kms-encryption-timestamp="time value"
警告

既存のクラスターでシークレット暗号化を有効にし、使用する KMS キーが削除されている場合はこのクラスターを復旧する手段はありません。KMS キーを削除すると、クラスターは永続的にパフォーマンスが低下した状態になります。詳細については「AWSKMS キーを削除する」を参照してください。

注記

create-key コマンドではデフォルトで対称暗号化 KMS キーが作成されます。この際にはアカウントのルート管理者に AWS KMS アクションとリソースへのアクセスを許可する、キーポリシーが使用されます。アクセス許可の範囲を絞り込む場合はcreate-cluster API を呼び出すプリンシパルのポリシーで、kms:DescribeKey および kms:CreateGrant アクションが許可されていることを確認します。

KMS エンベロープ暗号化を使用するクラスターの場合、kms:CreateGrant アクセス許可が必要です。条件 kms:GrantIsForAWSResource はクラスター作成 アクションでサポートされていないため、クラスター作成 を実行するユーザーの kms:CreateGrant アクセス許可を制御する KMS ポリシーで使用しないでください。