

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

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

# 既存のクラスターで KMS を使用して Kubernetes シークレットを暗号化する
<a name="enable-kms"></a>

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

[シークレット暗号化](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)を有効にすると、選択した AWS KMS キーを使用して Kubernetes シークレットが暗号化されます。KMS キーは次の条件を満たす必要があります：
+ 対称
+ データの暗号化と復号が可能
+ クラスターと同じ AWS リージョンに作成
+ KMS キーが別のアカウントで作成された場合、[IAM プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)にはその KMS キーへのアクセス権が必要となります。

詳細については「[AWS キーマネジメントサービス開発者ガイド](https://docs.aws.amazon.com/kms/latest/developerguide/)」の「[他のアカウントの IAM プリンシパルが KMS キーを使用することを許可する](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)」を参照してください。

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

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

暗号化は次の 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 マネジメントコンソール   

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

  1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

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

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

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

  1. ドロップダウンリストからキーを選択し、**[Enable]** (有効化 ボタンを選択してください。キーが一覧表示されていない場合は最初にキーを作成する必要があります。詳細については「[キーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

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

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

  1. 次の AWS CLI コマンドを使用して、[シークレット暗号化](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)設定をクラスターに関連付けます。値の例 は実際に使用する値に置き換えます。

     ```
     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": []
       }
     }
     ```

  1. 次のコマンドを使用すると、暗号化更新のステータスをモニタリングできます。前の出力で返された特定の `cluster name` と `update 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": []
       }
     }
     ```

  1. クラスターで暗号化が有効になっていることを確認するには`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"
```

**警告**  
既存のクラスターで[シークレット暗号化](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)を有効にし、使用する KMS キーが削除されている場合はこのクラスターを復旧する手段はありません。KMS キーを削除すると、クラスターは永続的にパフォーマンスが低下した状態になります。詳細については「[AWSKMS キーを削除する](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)」を参照してください。

**注記**  
`create-key` コマンドではデフォルトで[対称暗号化 KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)が作成されます。この際にはアカウントのルート管理者に AWS KMS アクションとリソースへのアクセスを許可する、キーポリシーが使用されます。アクセス許可の範囲を絞り込む場合は`create-cluster` API を呼び出すプリンシパルのポリシーで、`kms:DescribeKey` および `kms:CreateGrant` アクションが許可されていることを確認します。  
KMS エンベロープ暗号化を使用するクラスターの場合、`kms:CreateGrant` アクセス許可が必要です。条件 `kms:GrantIsForAWSResource` はクラスター作成 アクションでサポートされていないため、クラスター作成 を実行するユーザーの `kms:CreateGrant` アクセス許可を制御する KMS ポリシーで使用しないでください。