如何管理 K8s 中服务帐户令牌的使用?

How to manage service account token usage in K8s?

当在 Kubernetes 中创建 ServiceAccount 时,也会创建一个 secret。此机密包含 ServiceAccountToken。此令牌可用于 CI 管道,甚至在 kubectl 和任何其他访问集群的地方​​。 假设公司的一名开发人员为自己复制了这个令牌(没有人知道),并且在他离开公司后他仍然可以访问我们的 Kubernetes 集群。我想限制他的访问。我该怎么做?

使用服务帐户使用 kubectl 或 CI/CD 系统从集群外部与 kubernetes 集群交互,从安全的角度来看并不是最佳方法。您应该使用 authenticating proxy,其中短期 JWT 令牌的生成和轮换委托给外部 OpenId/oAuth 投诉授权系统。

服务帐户只能在集群内的 pod 运行 中使用,您可以通过 RBAC Role 和 RoleBinding 限制服务帐户的授权。请记住,目前服务帐户令牌不会由 kubernetes 轮换。

Assume a developer in company copy this token for himself (and no ones know that) and after he left the company he still have access to our Kubernetes cluster. I want to limit his access. How can I do that?

是的,这是您必须降低的风险。

在 Kubernetes 中,您现在可以使用仅在短时间内有效的令牌,例如一小时。如果可以,请使用 Service Account from a projected volume. See also No more forever tokens。事实上,我认为这对于大多数服务帐户使用来说是一种更好的方法 - 从安全的角度来看。

如果您使用 Kubernetes-native CI/CD 管道,例如通过使用 Tekton,您可以使用这些定期轮换的较新令牌进行部署。

如果您从集群外部部署,@Arghya Sadhu 提供了一个很好的替代方案,即使用身份验证代理。

在云提供商处使用 Kubernetes?

如果您在云提供商处使用 Kubernetes 并从 CI/CD 集群外部部署,他们通常具有联合身份解决方案,例如AWS IAM roles for EKS service accounts or Google Workload Identity for GKE