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

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

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

  • 対称

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

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

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

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

警告

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

eksctl

暗号化は次の 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. Amazon EKS コンソールを開きます。

  2. KMS 暗号化を追加するクラスターを選択します。

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

  4. [Secrets encryption] (シークレットの暗号化) セクションまでスクロールダウンし、[Enable] (有効化) ボタンを選択します。

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

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

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

    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": []   } }
  2. 次のコマンドを使用すると、暗号化更新のステータスをモニタリングできます。前の出力で返された特定の 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": []   } }
  3. クラスターで暗号化が有効になっていることを確認するには、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 は、CreateCluster アクションでサポートされていないため、CreateCluster を実行するユーザーの kms:CreateGrant アクセス許可を制御する KMS ポリシーで使用しないでください。