13

我是 Kubernetes 的新手,我正在尝试了解一些安全知识。

我的问题是关于运行容器的用户的组 ID(= gid)。

我使用这个官方示例创建了一个 Pod:https ://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    fsGroup: 2000
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: gcr.io/google-samples/node-hello:1.0
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false

在文档中,他们说:

在配置文件中,runAsUser字段指定对于 Pod 中的任何容器,第一个进程以用户 ID 1000 运行。fsGroup 字段指定组 ID 2000 与 Pod 中的所有容器相关联。组 ID 2000 还与安装在 /data/demo 的卷以及在该卷中创建的任何文件相关联。

所以,我进入容器:

kubectl exec -it security-context-demo -- sh

我看到第一个进程(即 PID 1)正在以用户 1000 => OK 运行,这就是我所期望的行为。

 $ ps -f -p 1
 UID        PID  PPID  C STIME TTY          TIME CMD
 1000         1     0  0 13:06 ?        00:00:00 /bin/sh -c node server.js

然后,我在文件夹 /data/demo 中创建了一个文件“testfile”。此文件属于组“20​​00”,因为 /data/demo 在组权限上具有“s”标志:

$ ls -ld /data/demo
drwxrwsrwx 3 root 2000 39 Dec 29 13:26 /data/demo
$ echo hello > /data/demo/testfile
$ ls -l /data/demo/testfile
-rw-r--r-- 1 1000 2000 6 Dec 29 13:29 /data/demo/testfile

然后,我创建一个子文件夹“my-folder”并删除组权限上的“s”标志。我在此文件夹中创建了一个文件“my-file”:

$ mkdir /data/demo/my-folder
$ ls -ld /data/demo/my-folder
drwxr-sr-x 2 1000 2000 6 Dec 29 13:26 /data/demo/my-folder
$ chmod g-s /data/demo/my-folder
$ ls -ld /data/demo/my-folder
drwxr-xr-x 2 1000 2000 6 Dec 29 13:26 /data/demo/my-folder
$ touch /data/demo/my-folder/my-file
$ ls -l /data/demo/my-folder/my-file
-rw-r--r-- 1 1000 root 0 Dec 29 13:27 /data/demo/my-folder/my-file

我很惊讶这个文件属于组“root”,即 GID 0 的组。根据文档中的这句话,我预计它应该属于组“20​​00”:

fsGroup 字段指定组 ID 2000 与 Pod 中的所有 Container 相关联

使用以下命令,我看到容器中 UID 为“1000”的用户具有主 Unix 组“0”,而不是 2000。

$ id
uid=1000 gid=0(root) groups=0(root),2000
$ cat /proc/1/status
...
Pid:    1
...
Uid:    1000    1000    1000    1000
Gid:    0   0   0   0
...
Groups: 2000 
...

有没有人有一些解释?

为什么用户的 GID 没有设置为 Pod 的安全上下文中“fsGroup”字段的值?

为什么用户的 GID 设置为 0 = root?

它是 Kubernetes 中的错误(我使用的是 v1.8.0)吗?

我误解了文档吗?

谢谢!

4

2 回答 2

9

不幸的是,Kubernetes 目前不支持设置主组 ID,默认设置为gid=0.

实现这个有一个未解决的问题:https ://github.com/kubernetes/features/issues/213

于 2017-12-29T14:22:07.547 回答
2

具有“setgid”的目录将导致在该目录中创建的所有文件都归该目录的组所有,而不是所有者的组。

您首先在带有 s falg 的目录中创建了一个文件。该文件设置为目录组 - 2000。然后您删除了 s 标志。第二个文件设置了用户的主要组 - 0。

这与 Kubernetes 无关。

于 2020-05-14T17:40:27.183 回答