Kubernetes、安全上下文、fsGroup 字段和默认用户组 ID 运行 容器

Kubernetes, security context, fsGroup field and default user's group ID running the container

我是 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

在文档中,他们说:

In the configuration file, the runAsUser field specifies that for any Containers in the Pod, the first process runs with user ID 1000. The fsGroup field specifies that group ID 2000 is associated with all Containers in the Pod. Group ID 2000 is also associated with the volume mounted at /data/demo and with any files created in that volume.

所以,我进入容器:

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

我看到第一个进程(即 PID 1)是 运行 用户 1000 => 好的,这是我预期的行为。

 $ 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”:

The fsGroup field specifies that group ID 2000 is associated with all Containers in the Pod

通过以下命令,我看到容器中 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)?

我是不是误解了文档?

谢谢!

很遗憾,Kubernetes 目前不支持设置主组 ID,默认为 gid=0

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

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

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

这与 Kubernetes 无关。