部署服务账户令牌卷投影
您可以在容器服务Kubernetes版ACK(Container Service for Kubernetes)中开启服务账户令牌卷投影功能以降低在Pod中使用ServiceAccount遇到的安全性问题,此功能可使得Kubelet支持基于Pod粒度的Token签发,并且支持Token audience和过期时间的配置。当Token即将过期(过期时间的80%或者Token存在大于24小时),Kubelet支持对Token的自动刷新。本文介绍如何配置及使用服务账户令牌卷投影。
背景信息
ServiceAccount是Pod和集群apiserver通讯的访问凭证。传统方式下,在Pod中使用ServiceAccount可能会遇到如下的安全挑战:
- ServiceAccount中的JSON Web Token (JWT) 没有绑定audience身份,因此所有ServiceAccount的使用者都可以彼此扮演,存在伪装攻击的可能。
- 传统方式下每一个ServiceAccount都需要存储在一个对应的Secret中,并且会以文件形式存储在对应的应用节点上,而集群的系统组件在运行过程中也会使用到一些权限很高的ServiceAccount,其增大了集群管控平面的攻击面,攻击者可以通过获取这些管控组件使用的ServiceAccount非法提权。
- ServiceAccount中的JWT Token没有设置过期时间,当上述ServiceAccount泄露情况发生时,您只能通过轮转ServiceAccount的签发私钥来进行防范,而client-go中还不支持这样的自动化流程,需要一个繁琐的手动运维流程。
- 每一个ServiceAccount都需要创建一个与之对应的Secret,在大规模的应用部署下存在弹性和容量风险。
ACK同时配置了绑定服务账户令牌卷投影特性用于增强ServiceAccount的安全性,服务账户令牌卷投影可使Pod支持以卷投影的形式将ServiceAccount挂载到容器中从而避免了对Secret的依赖。
步骤一、配置服务账户令牌卷投影
您可以通过在创建集群时选中开启,配置服务账户令牌卷投影功能。具体步骤,请参见创建ACK Pro版集群。
说明 ACK集群从1.22版本开始,将默认启用服务账户令牌卷投影功能。
集群的系统组件apiserver和controller-manager中会自动开启绑定服务账户令牌卷投影feature-gate,同时在apiserver的启动参数中会增加以下配置。
参数 | 说明 | 默认值 | 控制台配置 |
service-account-issuer | ServiceAccount Token中的签发身份,即Token payload中的iss字段。 | https://kubernetes.default.svc | 支持 |
api-audiences | 合法的请求Token身份,用于apiserver服务端认证请求Token是否合法。 | https://kubernetes.default.svc | 支持,可以配置多个audience,通过, 号分割。 |
service-account-signing-key-file | Token签名私钥文件路径。 | /etc/kubernetes/pki/sa.key | 不支持,默认使用/etc/kubernetes/pki/sa.key,无需配置。 |
步骤二、部署服务账户令牌卷投影
当Pod中需要使用audience为vault并且有效期为2个小时的ServiceAccount时,您可以执行以下命令及使用以下模板配置PodSpec来使用服务账户令牌卷投影。
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-robot
EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /var/run/secrets/tokens
name: vault-token
serviceAccountName: build-robot
volumes:
- name: vault-token
projected:
sources:
- serviceAccountToken:
path: vault-token
expirationSeconds: 7200
audience: vault
重要
- 请您确保Pod中能够实时获取到轮转后最新的Token,也就是确保Pod逻辑中能够定期地重新加载目标Token(建议为5分钟)。官方的Kubernetes在client-go 10.0.0版本后已经支持自动获取最新的Token。
- 容器中ServiceAccount对应的Token文件属性不再是644,在使用绑定服务账户令牌卷投影时,对应的Token文件属性已经改为600(使用fsGroup特性时为640)。