本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
数据加密和机密管理
静态加密
您可以在 Kubernetes 中使用三种不同的 AWS 原生存储选项:EBS 、 EFS 和 For Lustre。FSx所有三者都使用服务托管式密钥或客户主密钥(CMK)进行静态加密。对于 EBS,您可以使用树内存储驱动程序或 EBSmountOptions
中添加tls
参数来添加传输加密,如以下示例所示:
apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: efs-sc mountOptions: - tls csi: driver: efs.csi.aws.com volumeHandle: <file_system_id>
FSx CSI 驱动程序
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: fsx-sc provisioner: fsx.csi.aws.com parameters: subnetId: subnet-056da83524edbe641 securityGroupIds: sg-086f61ea73388fb6b deploymentType: PERSISTENT_1 kmsKeyId: <kms_arn>
重要
自 2020 年 5 月 28 日起,写入 EKS Fargate 容器中临时卷的所有数据都默认使用行业标准的 AES-256 加密算法进行加密。由于加密和解密由该服务无缝处理,因此无需对应用程序进行任何修改。
加密静态数据
加密静态数据被认为是一种最佳实践。如果您不确定是否需要加密,请加密您的数据。
CMKs 定期轮换
将 KMS 配置为自动轮换 CMKs。这将每年轮换一次您的密钥,同时无限期地保存旧密钥,这样您的数据仍然可以被解密。有关更多信息,请参阅轮换客户主密钥
使用 EFS 接入点简化对共享数据集的访问
如果您共享了具有不同 POSIX 文件权限的数据集,或者想要通过创建不同的挂载点来限制对部分共享文件系统的访问,请考虑使用 EFS 接入点。要了解有关使用接入点的更多信息,请参阅 https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html。如今,如果您想使用接入点 (AP),则需要在 PV 的volumeHandle
参数中引用 AP。
重要
自 2021 年 3 月 23 日起,EFS CSI 驱动程序支持动态配置 EFS 接入点。接入点是 EFS 文件系统中特定于应用程序的入口点,可以更轻松地在多个 pod 之间共享文件系统。每个 EFS 文件系统最多可以有 120 个 PVs。有关更多信息,请参阅 Amazon EFS CSI 动态配置简介
密钥管理
Kubernetes 密钥用于存储敏感信息,例如用户证书、密码或 API 密钥。它们作为 base64 编码的字符串保存在 etcd 中。在 EKS 上,etcd 节点的 EBS 卷使用 E BS 加密进行加密。Pod 可以通过引用中的密钥来检索 Kubernetes 机密对象。podSpec
这些密钥可以映射到环境变量,也可以作为卷挂载。有关创建密钥的更多信息,请参阅 https://kubernetes。 io/docs/concepts/configuration/secret
警告
特定命名空间中的密钥可以被该密钥命名空间中的所有 pod 引用。
警告
节点授权器允许 Kubelet 读取挂载到节点上的所有密钥。
使用 AWS KMS 对 Kubernetes 机密进行信封加密
这允许您使用唯一的数据加密密钥 (DEK) 加密您的机密。然后,使用来自 AWS KMS 的密钥加密密钥 (KEK) 对 DEK 进行加密,该密钥可以定期自动轮换。使用适用于 Kubernetes 的 KMS 插件,所有 Kubernetes 机密都以密文而不是纯文本形式存储在 etcd 中,并且只能由 Kubernetes API 服务器解密。有关更多详细信息,请参阅使用 EKS 加密提供商支持进行深入防御
审计 Kubernetes 密钥的使用情况
在 EKS 上,打开审核日志并创建 CloudWatch 指标筛选器和警报,以便在使用密钥时提醒您(可选)。以下是 Kubernetes 审计日志的指标筛选器的示例。{($.verb="get") && ($.objectRef.resource="secret")}
您还可以在 CloudWatch Log Insights 中使用以下查询:
fields @timestamp, @message | sort @timestamp desc | limit 100 | stats count(*) by objectRef.name as secret | filter verb="get" and objectRef.resource="secrets"
上面的查询将显示在特定时间范围内访问密钥的次数。
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter verb="get" and objectRef.resource="secrets" | display objectRef.namespace, objectRef.name, user.username, responseStatus.code
此查询将显示密钥,以及尝试访问该密钥的用户的命名空间和用户名以及响应代码。
定期轮换你的秘密
Kubernetes 不会自动轮换密钥。如果您必须轮换密钥,请考虑使用外部密钥存储库,例如 Vault 或 AWS Secrets Manager。
使用单独的命名空间来隔离来自不同应用程序的机密
如果您的密钥无法在命名空间中的应用程序之间共享,请为这些应用程序创建一个单独的命名空间。
使用卷装载而不是环境变量
环境变量的值可能会无意中出现在日志中。作为卷挂载的密钥会被实例化为 tmpfs 卷(支持 RAM 的文件系统),这些卷将在删除 Pod 时自动从节点中删除。
使用外部密钥提供者
除了使用 Kubernetes 机密之外,还有几种可行的替代方案,包括 AWS Secrets Manager
随着外部密钥存储库的使用越来越多,将它们与 Kubernetes 集成的需求也随之增加。S ecret Store CSI 驱动程序
注意
当密钥存储库 CSI 驱动程序必须获取密钥时,它会假设分配给引用密钥的 pod 的 IRSA 角色。此操作的代码可以在这里
有关 AWS 机密和配置提供商 (ASCP) 的更多信息,请参阅以下资源:
外部机密