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

2024-02-27

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

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


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

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

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

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

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

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

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


另外,我想向您建议另一种已经提出的解决方案:OpenID Connect 令牌 https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens

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

  • dex https://dexidp.io/docs/kubernetes/
  • keycloak https://www.keycloak.org/docs/latest/getting_started/

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

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


此外,与其他身份验证协议(LDAP、SAML、Kerberos、备用 x509 方案等)的集成可以使用验证代理 https://kubernetes.io/docs/reference/access-authn-authz/authentication/#authenticating-proxy or the 身份验证网络钩子 https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何撤销 Kubernetes 中的客户端证书? 的相关文章

随机推荐

  • C# 类的属性包

    访问 C 类属性 如 JavaScript 语言 将使生活变得更加轻松 我们如何在 C 中做到这一点 例如 someObject Property simple string Console WriteLine someObject Fir
  • 比较 Oracle 中的字符串

    我需要在表中查询给定字符串的值 该表区分大小写 但我想在比较中执行 ToLower 假设我有一个包含以下数据的类表 class teacher Mat101 Smith MAT101 Jones mat101 Abram ENG102 Sm
  • Perl 中 grep 的“no autovivication”编译指示失败

    我正在尝试使用该模块关闭自动激活 https metacpan org pod autovivification https metacpan org pod autovivification但 grep 失败 usr bin env pe
  • 定时器内存泄漏

    我正在使用一个在侦听器事件上取消并重新启动的计时器 除了计时器线程泄漏整个外部类之外 一切都工作正常 我的定时器实现如下 if timer null timer cancel timer null timer new Timer timer
  • Haskell:输入“putStrLn”时解析错误

    我刚刚编写了我的第一个 Haskell 程序 但有一个我无法理解的错误 我认为这是对的 因为我只是像书上的例子一样写的 有人可以帮我吗 main do putStrLn Hello what s your name name lt getL
  • 有趣的正则表达式 - 匹配字符数等于 2^n 的单词

    嘿 我一直在寻找有关正则表达式的反思主题 我想要一个正则表达式来匹配单词列表中包含 2 n 个字符的每个单词 其中 n 是自然数 为了简单起见 我们假设一个单词只是一个序列o我们还假设该列表由单词组成 后跟单词所包含的字符数 并用空格分隔当
  • Swift 3:单例的属性观察器

    我想知道是否有任何方法可以观察单例类的某个属性的变化 就我而言 对于 Realm 我有这样的东西 class User Object dynamic var name String dynamic var email String dyna
  • iOS8 照片框架:如何获取 PHAsset 的名称(或文件名)?

    我试图使用获取图像名称PHAssets 但我找不到文件名的元数据或任何获取图像名称的方法 有其他方法获取文件名吗 我知道这个问题已经得到解答 但我想我会提供另一种选择 extension PHAsset var originalFilena
  • 在视图中使用临时表

    我真的很想创建一个视图 我知道您不能在 MSSQL2005 视图中使用临时表 在不重写 sql 的情况下 我是否遗漏了任何明显的东西 备份计划是使用存储过程 Cheers select into temp from vwIncidents
  • 如何在Java中为Android设置HttpResponse超时

    我创建了以下函数来检查连接状态 private void checkConnectionStatus HttpClient httpClient new DefaultHttpClient try String url http xxx x
  • Jupyter 笔记本自动完成显示重复选项

    Jupyter notebook s autocomplete seems working but somehow it will show duplicate options for the method For example belo
  • 通过 CORS 使用 Ajax 请求在浏览器上设置 Cookie

    尝试实现 ajax 登录 注册过程 没有带有身份验证的刷新站点 使用 cookie 来保存状态 我以为我现在就可以了 但由于某种原因 浏览器在从服务器取回 cookie 后不会设置 cookie 有人可以帮忙吗 以下是请求和响应标头 Req
  • 使用mocktail包进行单元测试时,类型“Null”不是类型“Future”的子类型

    我们如何验证函数内的方法是否被调用 我这里有一个示例代码 class MockService extends Mock implements Service class MockRepository extends Mock impleme
  • 更改 Bootstrap 3 中折叠导航栏上的菜单顺序

    我有一个 Bootstrap 3 导航栏 有两个右对齐 ul 给我这个的部分 当移动菜单折叠时 我得到以下信息 我有两个与折叠菜单相关的问题 1 如何让按钮出现在折叠菜单的底部而不是顶部 2 如何更改折叠菜单中按钮的样式 而不影响水平菜单中
  • 如何有效地用逗号连接列表并在最后一个元素之前添加“and”

    我一直在经历自动化无聊的事情 http automatetheboringstuff com 并遇到了一个名为 Comma Code end of第4章 https automatetheboringstuff com chapter4 您
  • 调用 on_pause 时暂停计时器似乎不起作用(Kivy)

    在 Android 上 我尝试在调用 on pause 时暂停 update time 方法 并在调用 on pause 时恢复它 on resume 被调用 换句话说 我试图在应用程序最小化时暂停计时器 并在应用程序最小化时恢复计时器 已
  • 使用java的数字签名电子令牌的密钥库

    如何从数字签名电子令牌创建密钥库 如何创建密钥库的路径 如何使用java应用程序在任何文档中使用密钥库进行签名 加密硬件设备通常可以通过 PKCS 11 API 连接 您将需要 PKCS 11 库 Windows 上的 dll 或 Unix
  • 为什么 Joda 对象是不可变的?

    我读到 在 Java 版本低于 7 的情况下 Joda Time 对象比 Java 的内置对象更可靠 引用的一个原因是 Joda 对象是不可变的 为什么这有好处 如果我想更改 Joda DateTime 对象的年份 小时和时区 我需要制作三
  • 未定义的局部变量或方法“user_params”rails 4

    所以我遵循了 从头开始进行身份验证 的轨道演员 http railscasts com episodes 250 authentication from scratch http railscasts com episodes 250 au
  • 如何撤销 Kubernetes 中的客户端证书?

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