sol*_*eit 5 kubernetes kubernetes-security kubernetes-pod kubernetes-secrets k3s
我有一个 k3s 集群,我的应用程序 Pod 正在运行。当我登录(使用命令)时,在所有 Pod 中kubectl exec <pod_name> -n <ns> -it /bin/bash都有kubernetes.io一个目录,其中包含任何人都可以获得的秘密令牌 cat token:
root@Ubuntu-VM: kubectl exec app-test-pod -n app-system -it /bin/bash
root@app-test-pod:/var/run/secrets/kubernetes.io/serviceaccount# ls -lhrt
total 0
lrwxrwxrwx 1 root root 12 Oct 11 12:07 token -> ..data/token
lrwxrwxrwx 1 root root 16 Oct 11 12:07 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 13 Oct 11 12:07 ca.crt -> ..data/ca.crt
Run Code Online (Sandbox Code Playgroud)
这似乎是一个安全威胁(或漏洞)。有人可以让我知道是否有办法从 pod 中删除此依赖项,以便我可以限制用户(甚至是 root 用户)在登录 pod 时访问此机密?另外,如果这是可能的,那么 pod 将如何与 API 服务器通信?
澄清一些事情:
这似乎是一个安全威胁(或漏洞)。
它实际上不是一个漏洞,除非您将其配置为一个漏洞。您正在谈论的 ServiceAccount 是deafult存在于每个命名空间中的一个。默认情况下,ServiceAccount 没有任何使其不安全的权限。如果您愿意,可以使用 RBACdefault向ServiceAccount添加某些权限。例如,您可以将其配置为能够列出同一命名空间中的所有 Pod,但除非您这样做,否则 ServiceAccount 根本不被视为漏洞,并且将无法检索任何有用的信息。这适用于所有ServiceAccount,而不仅仅是一个。default
有人可以让我知道是否有办法从 pod 中删除此依赖项,以便我可以限制用户(甚至是 root 用户)在登录 pod 时访问此机密?
是的,这是可能的,实际上有两种选择:
首先,Pod 中有一个名为automountServiceAccountToken该部分的字段,如果您根本不希望挂载 ServiceAccount,则可以将其设置为该字段。specfalsedefault
这是一个例子:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
automountServiceAccountToken: false
[...]
Run Code Online (Sandbox Code Playgroud)
除此之外,您可以创建/编辑 ServiceAccount 并为其分配字段automountServiceAccountToken: false:
apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: false
metadata:
namespace: default
[...]
Run Code Online (Sandbox Code Playgroud)
另外,如果这是可能的,那么 pod 将如何与 API 服务器通信?
Pod 实际上根本不需要与 API 服务器通信。即使使用像 a 这样的功能,livenessProbePod 也根本不需要与 API 服务器进行通信。事实上,大多数 Pod从不与 API 服务器通信。Pod 需要与 API 服务器通信的唯一原因是它计划直接与集群交互。通常这不是必需的,除非您想编写自定义运算符或类似的东西。即使您没有挂载 ServiceAccount,您仍然可以使用 Pod 提供的所有功能,因为所有这些功能都是基于 Kubernetes 与您的 Pod 通信,而不是相反(例如,正在livenessProbe评估kubelet,Pod 根本不需要与 API 进行通信)。
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |