【问题标题】:Can a mounted volume in Kubernetes be accessed from the host os filesystem可以从主机 os 文件系统访问 Kubernetes 中已挂载的卷吗
【发布时间】:2019-04-18 10:31:19
【问题描述】:

我真正的问题是,如果秘密作为卷安装在 pod 中 - 如果有人获得对主机操作系统的 root 访问权限,是否可以读取它们。

例如,通过访问 /var/lib/docker 并深入了解卷。

【问题讨论】:

  • 你真的试过了吗?

标签: docker kubernetes


【解决方案1】:

如果有人使用容器对您的主机具有 root 访问权限,那么他几乎可以做任何他想做的事情...不要忘记 pod 只是一堆容器,实际上是带有 pid 的进程。例如,如果我有一个名为 sleeper 的 pod:

kubectl get pods sleeper-546494588f-tx6pp -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE
sleeper-546494588f-tx6pp   1/1     Running   1          21h   10.200.1.14   k8s-node-2   <none>

在节点 k8s-node-2 上运行。通过对这个节点的 root 访问,我可以检查这个 pod 及其容器的 pid(我使用 containerd 作为容器引擎,但以下几点对于 docker 或任何其他容器引擎非常相似):

[root@k8s-node-2 /]# crictl -r  unix:///var/run/containerd/containerd.sock pods -name sleeper-546494588f-tx6pp -q
ec27f502f4edd42b85a93503ea77b6062a3504cbb7ac6d696f44e2849135c24e
[root@k8s-node-2 /]# crictl -r  unix:///var/run/containerd/containerd.sock ps -p ec27f502f4edd42b85a93503ea77b6062a3504cbb7ac6d696f44e2849135c24e
CONTAINER ID        IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID
70ca6950de10b       8ac48589692a5       2 hours ago         Running             sleeper             1                   ec27f502f4edd
[root@k8s-node-2 /]# crictl -r  unix:///var/run/containerd/containerd.sock# inspect   70ca6950de10b | grep pid | head -n 1
    "pid": 24180,

最后有了这些信息(pid 号),我可以访问这个进程的“/”挂载点并检查它的内容,包括秘密:

[root@k8s-node-2 /]# ll  /proc/24180/root/var/run/secrets/kubernetes.io/serviceaccount/
total 0
lrwxrwxrwx. 1 root root 13 Nov 14 13:57 ca.crt -> ..data/ca.crt
lrwxrwxrwx. 1 root root 16 Nov 14 13:57 namespace -> ..data/namespace
lrwxrwxrwx. 1 root root 12 Nov 14 13:57 token -> ..data/token
[root@k8s-node-2 serviceaccount]# cat  /proc/24180/root/var/run/secrets/kubernetes.io/serviceaccount/namespace ; echo
default
[root@k8s-node-2 serviceaccount]# cat  /proc/24180/root/var/run/secrets/kubernetes.io/serviceaccount/token | cut -d'.' -f 1 | base64 -d ;echo 
{"alg":"RS256","kid":""}
[root@k8s-node-2 serviceaccount]# cat  /proc/24180/root/var/run/secrets/kubernetes.io/serviceaccount/token | cut -d'.' -f 2 | base64 -d 2>/dev/null  ;echo 
{"iss":"kubernetes/serviceaccount","kubernetes.io/serviceaccount/namespace":"default","kubernetes.io/serviceaccount/secret.name":"default-token-6sbz9","kubernetes.io/serviceaccount/service-account.name":"default","kubernetes.io/serviceaccount/service-account.uid":"42e7f596-e74e-11e8-af81-525400e6d25d","sub":"system:serviceaccount:default:default"}

这就是正确保护对 Kubernetes 基础架构的访问非常重要的原因之一。

【讨论】:

  • 我写了一篇博客,详细介绍了如何从主机系统调试或获取有关在容器中运行的进程的信息。我希望它会提供信息blog.container-solutions.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 2017-06-19
  • 2019-07-22
相关资源
最近更新 更多