【发布时间】:2020-12-12 07:03:47
【问题描述】:
我正在创建一个代理服务,它接受网络调用并可以在同一 pod 中的任何其他容器中触发命令。当然,这不是 pod 的常见用例,但我知道一些 CI 工具会做类似的事情,例如 Jenkins 和它的 Kubernetes 插件。
目前,我在代理容器中使用 kubectl 并让它运行 kubectl exec <pod> -c <container> -- <command>,它运行良好。但这似乎是漏洞的大好机会。
为了让代理拥有 kubectl exec 访问权限,它需要拥有 pod/exec 的权限,这使其能够访问同一命名空间中的所有 pod。
rules:
- apiGroups: [""]
resources: ["pods", "pods/exec"]
verbs: ["get", "list", "watch", "create"]
如果没有更好的方法来解决这个问题,我只会将 exec 命令烘焙到我的代理中,使其只接受对同一个 pod 的调用。
但我最担心的是从代理执行未知代码,它获得的访问权限超出了应有的范围。在 Jenkins 示例中,如果有人有一个管道来测试他们的代码并且他们是恶意的,并且包含一个实际使用 kubernetes-client 库并调用命名空间中的其他 pod 的测试,你将如何防止这种情况同时仍然启用容器到容器的通信?
如果有任何建议,我将不胜感激!
【问题讨论】:
-
关于您尝试做什么的更多背景信息?在 Kubernetes 上做 CI/CD 管道吗? (Tekton 在这方面做得很好)或者通常,两个容器通信的方式是通过网络端口,但在这里听起来更像是你想把你的容器当作旧的虚拟机?还是用于某种无法通过日志记录、跟踪或其他方式完成的调试?
-
嘿@Jonas,我正在为我的应用程序构建一个非常轻量级的 CI 组件。在最基本的情况下,它只是拉 src + 创建一个图像。我试图避免使用 tekton 或 argo 管道,但也许你是对的,这可能是最简单的。
-
Tekton 以一种聪明的方式做到了这一点,因此,Pod 中的所有容器都按顺序执行......这样您就可以先拉取,然后构建,然后推送镜像......或者什么你决定你的任务或管道做。
标签: kubernetes