密钥Secret的安全使用 避免使用ServcieAccount Secret Token访问集群 Kubernetes 1.21以前版本的集群中,Pod中获取token的形式是通过挂载ServiceAccount的Secret来获取的,这种方式获得的token是永久的,Pod被删除后token仍然存在Secret中,一旦泄露可能导致安全风险。该方式在1.21及以上的版本中不再推荐使用,并且根据社区版本迭代策略,在1.25及以上版本的集群中,ServiceAccount将不会自动创建对应的Secret。 Kubernetes 1.21及以上版本的集群中,直接使用TokenRequest API获得token,并使用投射卷(Projected Volume)挂载到Pod中。使用这种方法获得的token具有固定的生命周期(默认有效期为1小时),在到达有效期之前,Kubelet会刷新该token,保证Pod始终拥有有效的token,并且当挂载的Pod被删除时这些token将自动失效。该方式通过Bound ServiceAccount TokenVolume特性实现,能够提升服务账号(ServiceAccount)token的安全性,Kubernetes 1.21及以上版本的集群中会默认开启。 为了帮助用户平滑过渡,社区默认将Token有效时间延长为1年,1年后token失效,不具备证书reload能力的client将无法访问APIServer,建议使用低版本client的用户尽快升级至高版本,否则业务将存在故障风险。 基于Secret的ServiceAccount Token由于token由于具有上述的安全风险。1.23版本以及以上版本云容器引擎集群推荐使用Bound Servcie Account Token,该方式支持设置过期时间,并且和Pod生命周期一致,可减少凭据泄露风险。例如: apiVersion: apps/v1 kind: Deployment metadata: name: tokenexample namespace: tokenexample spec: replicas: 1 selector: matchLabels: app: tokenexample label: tokenexample template: metadata: labels: app: tokenexample label: tokenexample spec: serviceAccountName: boundsatoken containers: image: nginx imagePullPolicy: Always name: tokenexample volumes: name: testsecurity projected: defaultMode: 420 sources: serviceAccountToken: expirationSeconds: 3600 path: token configMap: items: key: ca.crt path: ca.crt name: kuberootca.crt downwardAPI: items: fieldRef: apiVersion: v1 fieldPath: metadata.namespace path: namespace