如何从 K3s 集群中的应用程序 pod 中删除机密的依赖性
How can I remove dependency of secrets from application pod in K3s cluster
我的应用程序有一个 k3s 集群 pods 运行。在我登录时(使用 kubectl exec <pod_name> -n <ns> -it /bin/bash
命令)的所有 pods 中有 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
这似乎是一种安全威胁(或漏洞)。有人可以让我知道是否有办法从 pod 中删除此依赖项,以便我可以限制用户(甚至 root 用户)在登录 pod 时访问此机密?另外,如果这是可能的,那么 pods 将如何与 API 服务器通信?
澄清几件事:
This seems a security threat (or vulnerability).
它实际上不是一个漏洞,除非您将它配置为一个漏洞。
您所说的 ServiceAccount 是存在于每个命名空间中的 deafult
。
默认情况下,ServiceAccount 没有任何使其不安全的权限。
如果你想 可以 为 default
ServiceAccount using RBAC 添加某些权限。例如,您可以将其配置为能够列出同一命名空间中的所有 Pods,但除非您这样做,否则 ServiceAccount 根本不会被视为漏洞,并且将无法检索任何有用的信息。
这适用于 所有 服务帐户,而不仅仅是 default
一个。
Can someone let me know if there is a way to remove this dependency from pod so that I can restrict users (even root users also) to access this secret if they login to pod ?
是可以的,实际上有两种选择:
首先,Pods 中的 spec
部分有一个名为 automountServiceAccountToken
的字段,如果您不想要 default
,可以将其设置为 false
] ServiceAccount 全部挂载。
这是一个例子:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
automountServiceAccountToken: false
[...]
除此之外,您可以 create/edit 一个 ServiceAccount 并将其分配给 automountServiceAccountToken: false
字段:
apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: false
metadata:
namespace: default
[...]
Also If this is possible then how will pods do communicate with the API Server ?
Pods 实际上根本不需要与 API 服务器通信。
即使使用像 livenessProbe
这样的功能,Pods 也根本不需要与 API 服务器通信。
事实上,大多数 Pods 从未 与 API 服务器通信。
Pod 需要与 API 服务器通信的唯一原因是它是否计划直接与集群交互。通常这是不需要的,除非你想写一个 custom operator 或类似的东西。
即使您没有挂载 ServiceAccount,您仍然可以使用 Pod 必须提供的所有功能,因为所有这些功能都基于与您的 Pod 通信的 Kubernetes,而不是相反(livenessProbe
kubelet
正在评估示例,Pod 根本不需要与 API).
通信
我的应用程序有一个 k3s 集群 pods 运行。在我登录时(使用 kubectl exec <pod_name> -n <ns> -it /bin/bash
命令)的所有 pods 中有 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
这似乎是一种安全威胁(或漏洞)。有人可以让我知道是否有办法从 pod 中删除此依赖项,以便我可以限制用户(甚至 root 用户)在登录 pod 时访问此机密?另外,如果这是可能的,那么 pods 将如何与 API 服务器通信?
澄清几件事:
This seems a security threat (or vulnerability).
它实际上不是一个漏洞,除非您将它配置为一个漏洞。
您所说的 ServiceAccount 是存在于每个命名空间中的 deafult
。
默认情况下,ServiceAccount 没有任何使其不安全的权限。
如果你想 可以 为 default
ServiceAccount using RBAC 添加某些权限。例如,您可以将其配置为能够列出同一命名空间中的所有 Pods,但除非您这样做,否则 ServiceAccount 根本不会被视为漏洞,并且将无法检索任何有用的信息。
这适用于 所有 服务帐户,而不仅仅是 default
一个。
Can someone let me know if there is a way to remove this dependency from pod so that I can restrict users (even root users also) to access this secret if they login to pod ?
是可以的,实际上有两种选择:
首先,Pods 中的 spec
部分有一个名为 automountServiceAccountToken
的字段,如果您不想要 default
,可以将其设置为 false
] ServiceAccount 全部挂载。
这是一个例子:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
automountServiceAccountToken: false
[...]
除此之外,您可以 create/edit 一个 ServiceAccount 并将其分配给 automountServiceAccountToken: false
字段:
apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: false
metadata:
namespace: default
[...]
Also If this is possible then how will pods do communicate with the API Server ?
Pods 实际上根本不需要与 API 服务器通信。
即使使用像 livenessProbe
这样的功能,Pods 也根本不需要与 API 服务器通信。
事实上,大多数 Pods 从未 与 API 服务器通信。
Pod 需要与 API 服务器通信的唯一原因是它是否计划直接与集群交互。通常这是不需要的,除非你想写一个 custom operator 或类似的东西。
即使您没有挂载 ServiceAccount,您仍然可以使用 Pod 必须提供的所有功能,因为所有这些功能都基于与您的 Pod 通信的 Kubernetes,而不是相反(livenessProbe
kubelet
正在评估示例,Pod 根本不需要与 API).