如何从 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).

通信