在现有集群中启用密钥加密 - Amazon EKS

在现有集群中启用密钥加密

如果启用密钥加密,将使用您选择的 AWS KMS key 对 Kubernetes 密钥加密。KMS 密钥必须符合以下条件:

  • 对称

  • 可以加密和解密数据

  • 在与集群相同的 AWS 区域 中创建

  • 如果 KMS 密钥是在其他账户中创建的,则用户必须拥有对 KMS 密钥的访问权限。

有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的允许其他账户中的用户使用 KMS 密钥

警告

密钥加密启用后将无法禁用。此操作不可逆。

eksctl

可以通过下列两种方式启用加密:

  • 使用单个命令将加密添加到您的集群。

    要自动重新加密密钥,请运行以下命令。

    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
  • 使用 .yaml 文件向集群添加加密。

    # 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 控制台:https://console.aws.amazon.com/eks/home#/clusters

  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 密钥,会将集群永久性置于降级状态。有关更多信息,请参阅删除 AWS KMS 密钥.。

注意

预设情况下,create-key 命令会创建一个具有密钥策略的对称加密 KMS 密钥,该密钥策略向账户的根管理员授予对 AWS KMS 操作和资源的访问权限。如果要缩小权限的范围,请确保允许对将调用 create-cluster API 的主体的策略执行 kms:DescribeKeykms:CreateGrant 操作。

对于使用 KMS 信封加密的集群,需要具有 kms:CreateGrant 权限。CreateCluster 操作不支持条件 kms:GrantIsForAWSResource,也不应在 KMS 策略中用于控制执行 CreateCluster 的用户的 kms:CreateGrant 权限。