文档

部署服务账户令牌卷投影

更新时间:

您可以在容器服务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-issuerServiceAccount Token中的签发身份,即Token payload中的iss字段。https://kubernetes.default.svc支持
api-audiences合法的请求Token身份,用于apiserver服务端认证请求Token是否合法。https://kubernetes.default.svc支持,可以配置多个audience,通过,号分割。
service-account-signing-key-fileToken签名私钥文件路径。/etc/kubernetes/pki/sa.key不支持,默认使用/etc/kubernetes/pki/sa.key,无需配置。

步骤二、部署服务账户令牌卷投影

当Pod中需要使用audiencevault并且有效期为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)。