元鉴
返回中文阅读流

Kubernetes Blog

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

您是否知道 kubectl 可以在您不知情的情况下,以调用用户的完整权限运行任意可执行文件(包括 Shell 脚本)?每当您下载或自动生成 kubeconfig 时,users[n].exec.command 字段可以指定一个可执行文件来代表您获取凭证。别误会,这是一个非常出色的功能,允许您使用外部身份提供商对集群进行身份验证。不过,您可能已经意识到了问题所在:您确切知道您的 kubeconfig 在系统上运行的是什么可执行文件吗?您信任生成它的流水线吗?

中文内容

已翻译official company source英文原文2026-01-09

Kubernetes v1.35:通过在 kuberc 中添加 exec 插件 allowList 来限制 kubeconfig 调用的可执行文件

By Peter Engelbert (Microsoft) Ben Petersen (Microsoft) | Friday, January 09, 2026

你是否知道,kubectl 可以在你不知情的情况下,以调用用户的完整权限运行任意可执行文件(包括 shell 脚本)?每当你下载或自动生成 kubeconfig 时,users[n].exec.command 字段都可以指定一个可执行文件来代表你获取凭证。别误会,这是一项出色的功能,它允许你通过外部身份提供商向集群进行身份验证。然而,你可能也意识到了其中的隐患:你确切知道你的 kubeconfig 在你的系统上运行了哪些可执行文件吗?你信任生成该 kubeconfig 的流水线吗?如果生成 kubeconfig 的代码遭受了供应链攻击,或者生成流水线已被入侵,攻击者完全可能通过欺骗你的 kubeconfig 运行任意代码,对你的机器进行不法操作。

为了让用户更好地控制在其系统上运行的内容,SIG-Auth 和 SIG-CLI 将凭据插件策略和允许名单作为 Beta 特性添加到了 Kubernetes 1.35 中。所有使用 client-go 库的客户端均可通过在 REST 配置中填写 ExecProvider.PluginPolicy 结构体来使用该功能。为了扩大此变更的影响范围,Kubernetes v1.35 还允许你无需编写任何应用代码即可进行管理。你可以通过向 kuberc 配置文件添加两个字段来配置 kubectl 以强制执行该策略和允许名单:credentialPluginPolicy 和 credentialPluginAllowlist。添加其中一个或两个字段将限制 kubectl 允许执行哪些凭据插件。

工作原理

该功能的完整说明可在 kuberc 的官方文档中查阅,但本文将简要概述这些新的安全控制选项。新特性处于 Beta 阶段,且无需开启任何 feature gate 即可使用。

以下示例是最简单的一种:只需不指定这些新字段即可。

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 正在尝试执行的内容。您会收到如下错误信息。

无法连接到服务器:获取凭证失败:不允许使用插件 "cloudco-login":策略已设置为 "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 查找完整路径,该函数不会展开 glob 模式或处理通配符。目前不支持 glob 模式。两种形式(基本名称和完整路径)均可接受,但推荐使用完整路径,因为它能进一步缩小允许运行的二进制文件范围。

未来增强功能

目前,allowlist 条目仅包含一个字段:name。未来,我们(Kubernetes SIG CLI)希望添加其他要求。一个看似有用的想法是校验和验证,即例如,仅当二进制文件的 sha256 值为 b9a3fad00d848ff31960c44ebb5f8b92032dc085020f857c98e32a5d5900ff9c 且位于 /usr/bin/cloudco-login 路径时,才允许运行该二进制文件。

另一种方案是仅允许经过一组受信任签名密钥中任一密钥签名的二进制文件。

参与贡献

凭据插件策略仍在开发中,我们非常期待您的反馈。我们很乐意了解您喜欢它的哪些方面,以及希望它解决哪些问题。如果您有精力参与贡献上述某项增强功能,那将是您开始为 Kubernetes 做贡献的绝佳起点。欢迎随时在 Slack 上加入讨论:

  • 正文:#sig-cli ,
  • 正文:#sig-auth 。
  • ← 上一篇
  • 下一篇 →
Last modified January 18, 2026 at 1:46 PM PST: Reorganize 2026 blog content (b81b14ba1b)

原文标题

Kubernetes v1.35: Restricting executables invoked by kubeconfigs via exec plugin allowList added to kuberc