Kubernetes v1.35:通过 exec 插件 allowList 限制 kubeconfig 调用的可执行文件,该插件已添加到 kuberc
你知道吗?kubectl 可以在你不知情的情况下,以调用用户的完整权限运行任意可执行文件(包括 shell 脚本)。
每当你下载或自动生成 kubeconfig 时,users[n].exec.command 字段可以指定一个可执行文件代表你获取凭证。
别误会,这是一个很棒的特性,允许你使用外部身份提供者向集群进行身份验证。
然而,你可能已经看到了问题:你确切知道你的 kubeconfig 在系统上运行的是什么可执行文件吗?
你信任生成你 kubeconfig 的流水线吗?
如果生成 kubeconfig 的代码遭受了供应链攻击,或者生成流水线被入侵,
攻击者很可能通过诱骗你的 kubeconfig 运行任意代码来对你的机器做些不好的事情。
为了让用户更好地控制在其系统上运行的内容,SIG-Auth
和 SIG-CLI 在 Kubernetes 1.35
中将凭证插件策略和允许列表作为 Beta 特性添加。
所有使用 client-go 库的客户端都可以通过在 REST 配置上填写
ExecProvider.PluginPolicy
结构体来使用此特性。
为了扩大此更改的影响,Kubernetes v1.35 还允许你无需编写任何应用代码即可管理此特性。
你可以通过在 kuberc 配置文件中添加两个字段来配置 kubectl
强制执行策略和允许列表:credentialPluginPolicy 和 credentialPluginAllowlist。
添加其中一个或两个字段会限制 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 上加入讨论: