您可以在容器服务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支持以卷投影的形式将ServiceAccout挂载到容器中从而避免了对secret的依赖。

步骤一、配置服务账户令牌卷投影

您可以通过在创建集群时选中开启,配置服务账户令牌卷投影功能。具体步骤,请参见创建Kubernetes集群开启
集群的系统组件apiserver和controller-manager中会自动开启绑定服务账户令牌卷投影feature-gate,同时在apiserver的启动参数中会增加以下配置。
参数 说明 默认值 控制台配置
service-account-issuer serviceaccount token中的签发身份,即token payload中的iss字段。 kubernetes.default.svc 支持
api-audiences 合法的请求token身份,用于apiserver服务端认证请求token是否合法。 kubernetes.default.svc 支持,可以配置多个audience,通过,号分割。
service-account-signing-key-file token签名私钥文件路径。 /etc/kubernetes/pki/sa.key 不支持,默认使用/etc/kubernetes/pki/sa.key,无需配置。

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

当Pod中需要使用audiencevault并且有效期为2个小时的ServiceAccout时,您可以执行以下命令及使用以下模板配置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。
  • 容器中ServiceAccout对应的token文件属性不再是644,在使用绑定服务账户令牌卷投影时,对应的token文件属性已经改为600(使用fsGroup特性时为640)。