如何撤销 Kubernetes 中的客户端证书?

Mik*_*nen 9 rbac kubernetes

我按照这篇文章了解了如何为 Kubernetes 集群中的用户设置 RBAC:https://medium.com/better-programming/k8s-tips-give-access-to-your-clusterwith-a-client-certificate-dfb3b71a76fe

这工作正常,但在我按照文章中所述签署、批准和配置所有内容后,如何撤销对某些用户的访问权限。例如,如果用户离开公司,我也想从集群中删除该用户。

我已经像这样设置了 RoleBinding:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: $NAMESPACE-role_binding
 namespace: $NAMESPACE
subjects:
- kind: Group
  name: $GROUP
  apiGroup: rbac.authorization.k8s.io
roleRef:
 kind: Role
 name: $NAMESPACE-role
 apiGroup: rbac.authorization.k8s.io
Run Code Online (Sandbox Code Playgroud)

其中用户是 RoleBinding 中组的一部分

Mat*_*att 7

已提供的答案是正确的,您在撰写此答案时无法撤销证书。

有人已经提到使用 serviceaccount 令牌并将 RBAC 角色分配给用户而不是组,我只想添加一些有关此方法为何有效的详细信息。

让我们从一些理论开始。用户验证的过程包括:

  • 身份验证 - 验证用户是谁的过程。在您的情况下,使用客户端证书,但其他方法(例如不记名令牌、身份验证代理)也可以达到此目的。使用证书时,用户由证书本身定义。谁持有该证书就可以作为用户。

  • 授权 - 验证用户有权访问哪些内容的过程。对于 kubernetes,这是使用 RBAC 角色完成的。角色绑定用于向用户或组(由证书表示)添加特定权限(由 rbac 角色表示)。

我们现在知道您无法更改身份验证级别,因为签名的证书无法撤销。不过,您可以通过删除用户的权限来对授权级别进行更改(通过删除角色绑定或删除/更改 rbac 角色;请注意,可以将相同的 RBAC 角色分配给不同的用户/组)。

这种方法尽管是正确的,但可能会导致一些值得一提的安全问题。为新用户签署证书时,您需要记住永远不要使用相同的用户名签署证书。一旦权限被撤销,您就不应该对新证书和关联的角色绑定使用相同的用户名(至少在旧证书过期之前),以确保旧证书在使用时不会被允许访问集群。


另外,我想向您推荐另一种已经提出的解决方案:OpenID Connect Tokens

虽然 Kubernetes 不提供 OpenID Connect Identity Provider。您可以使用现有的公共 OpenID Connect 身份提供商(例如 Google)。或者,您可以运行自己的身份提供商,例如 dex 或 Keycloak

OpenId 令牌是生命周期非常短的令牌(例如 1 分钟),一旦您的 id_token 过期,kubectl 将尝试使用您的refresh_token 和 client_secret 刷新您的 id_token,并将refresh_token 和 id_token 的新值存储在您的 .kube/config 中。

即使此解决方案的配置比较复杂,但在需要管理大量用户时也值得考虑。


此外,可以使用身份验证代理身份验证 Webhook来完成与其他身份验证协议(LDAP、SAML、Kerberos、备用 x509 方案等)的集成


小智 2

恐怕吊销证书是 Kubernetes 无法管理的事情。您可以在这里看到一些不错的替代建议https://github.com/kubernetes/kubernetes/issues/60917