Kubernetes v1.35:通过 exec 插件 allowList 限制 kubeconfig 调用的可执行文件,该插件已添加到 kuberc

你知道吗?kubectl 可以在你不知情的情况下,以调用用户的完整权限运行任意可执行文件(包括 shell 脚本)。 每当你下载或自动生成 kubeconfig 时,users[n].exec.command 字段可以指定一个可执行文件代表你获取凭证。 别误会,这是一个很棒的特性,允许你使用外部身份提供者向集群进行身份验证。 然而,你可能已经看到了问题:你确切知道你的 kubeconfig 在系统上运行的是什么可执行文件吗? 你信任生成你 kubeconfig 的流水线吗? 如果生成 kubeconfig 的代码遭受了供应链攻击,或者生成流水线被入侵, 攻击者很可能通过诱骗你的 kubeconfig 运行任意代码来对你的机器做些不好的事情。

为了让用户更好地控制在其系统上运行的内容,SIG-AuthSIG-CLI 在 Kubernetes 1.35 中将凭证插件策略和允许列表作为 Beta 特性添加。 所有使用 client-go 库的客户端都可以通过在 REST 配置上填写 ExecProvider.PluginPolicy 结构体来使用此特性。 为了扩大此更改的影响,Kubernetes v1.35 还允许你无需编写任何应用代码即可管理此特性。 你可以通过在 kuberc 配置文件中添加两个字段来配置 kubectl 强制执行策略和允许列表:credentialPluginPolicycredentialPluginAllowlist。 添加其中一个或两个字段会限制 kubectl 允许执行的凭证插件。

工作原理

此特性的完整描述可在我们的官方文档中找到, 但这篇博客文章将简要概述新的安全控制选项。这些新特性处于 Beta 阶段,无需使用任何特性门控即可使用。

以下示例是最简单的情况:不指定新字段。

apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference

这将保持 kubectl 的行为与以往相同,允许所有插件。

下一个示例在特性上是相同的,但更明确,因此如果这确实是你想要的,建议使用:

apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: AllowAll

如果你不知道是否正在使用 exec 凭证插件,请尝试将策略设置为 DenyAll

apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: DenyAll

如果你确实正在使用凭证插件,你会很快发现 kubectl 尝试执行的内容。你会收到如下错误。

Unable to connect to the server: getting credentials: plugin "cloudco-login" not allowed: policy set to "DenyAll"

如果信息不足以调试问题,请在运行下一个命令时增加日志详细级别。例如:

# increase or decrease verbosity if the issue is still unclear
kubectl get pods --verbosity 5

选择性允许插件

如果你需要 cloudco-login 插件来完成日常工作怎么办?这就是为什么策略有第三个选项 Allowlist。 要允许特定插件,请设置策略并添加 credentialPluginAllowlist

apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: Allowlist
credentialPluginAllowlist:
  - name: /usr/local/bin/cloudco-login
  - name: get-identity

你会注意到允许列表中有两个条目。其中一个通过完整路径指定,另一个 get-identity 只是一个基本名称。 当你只指定基本名称时,将使用 exec.LookPath 查找完整路径,它不展开通配符或处理通配符。 目前不支持通配符。两种形式(基本名称和完整路径)都可以接受,但完整路径更好, 因为它进一步缩小了允许的二进制文件的范围。

未来增强

目前,允许列表条目只有一个字段 name。将来,我们(Kubernetes SIG CLI)希望添加其他要求。 一个有用的想法是校验和验证,例如,只有当二进制文件具有 sha256 校验和 b9a3fad00d848ff31960c44ebb5f8b92032dc085020f857c98e32a5d5900ff9c 并且存在于路径 /usr/bin/cloudco-login 时,才允许运行。

另一种可能性是只允许由一组可信签名密钥之一签名的二进制文件。

参与其中

凭证插件策略仍在开发中,我们非常感兴趣你的反馈。我们很想听听你喜欢它的哪些方面以及你希望它解决哪些问题。 或者,如果你有时间贡献上述增强特性之一,它们将是开始为 Kubernetes 做出贡献的好方法。 欢迎在 Slack 上加入讨论:

最后修改 May 26, 2026 at 3:30 PM PST: [zh-cn]Add blog: kuberc-plugin-allowlist (0c74e73449)