首页 > 解决方案 > 如何从 K3s 集群中的应用程序 pod 中删除机密的依赖关系

问题描述

我有一个运行我的应用程序 pod 的 k3s 集群。在我登录(使用kubectl exec <pod_name> -n <ns> -it /bin/bash命令)时的所有 pod 中,都有一个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 时访问这个秘密?此外,如果这是可能的,那么 pod 将如何与 API 服务器进行通信?

标签: kuberneteskubernetes-podkubernetes-secretsk3skubernetes-security

解决方案


澄清几件事:

这似乎是一个安全威胁(或漏洞)。

除非您将其配置为漏洞,否则它实际上不是漏洞。您正在谈论的 ServiceAccount 是deafult存在于每个命名空间中的。默认情况下,ServiceAccount 没有任何使其不安全的权限。如果您愿意,可以使用 RBACdefault向ServiceAccount添加某些权限。例如,您可以将其配置为能够列出同一命名空间中的所有 Pod,但除非您这样做,否则 ServiceAccount 根本不被视为漏洞并且将无法检索任何有用的信息。这适用于所有ServiceAccounts,而不仅仅是一个。default

有人可以告诉我是否有办法从 pod 中删除这种依赖关系,以便我可以限制用户(甚至是 root 用户)在登录到 pod 时访问这个秘密?

是的,这是可能的,实际上有两种选择:

首先,如果您根本不希望挂载 ServiceAccount,则可以将 Pods 中automountServiceAccountToken的部分设置为一个字段。specfalsedefault

这是一个例子:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  automountServiceAccountToken: false
  [...]

除此之外,您可以创建/编辑 ServiceAccount 并将其分配给该automountServiceAccountToken: false字段:

apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: false
metadata:
  namespace: default
[...]

此外,如果这是可能的,那么 pod 将如何与 API 服务器进行通信?

Pod 实际上根本不需要与 API 服务器通信。即使使用像 alivenessProbe这样的功能,Pod 也完全不需要与 API 服务器通信。事实上,大多数 Pod从不与 API 服务器通信。Pod 需要与 API 服务器通信的唯一原因是它是否计划直接与集群交互。通常这不是必需的,除非您想编写自定义运算符或类似的东西。即使您没有挂载 ServiceAccount,您仍然可以使用 Pod 必须为您提供的所有功能,因为所有这些功能都基于与您的 Pod 通信的 Kubernetes,而不是相反(livenessProbe例如,由kubelet, Pod 根本不需要与 API 通信)。


推荐阅读