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

Syl*_*rch 8 file-permissions userid security-context user-permissions kubernetes

我是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
Run Code Online (Sandbox Code Playgroud)

他们在文档中说:

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

因此,我进入了容器:

kubectl exec -it security-context-demo -- sh
Run Code Online (Sandbox Code Playgroud)

我看到第一个进程(即使用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
Run Code Online (Sandbox Code Playgroud)

然后,我在文件夹/ data / demo中创建一个文件“ testfile”。该文件属于组“ 2000”,因为/ 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
Run Code Online (Sandbox Code Playgroud)

然后,创建一个子文件夹“ 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
Run Code Online (Sandbox Code Playgroud)

我很惊讶该文件属于“根”组,即GID为0的组。根据文档中的这一句话,我希望它应属于“ 2000”组:

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 
...
Run Code Online (Sandbox Code Playgroud)

有人有解释吗?

为什么在Pod的安全上下文中,用户的GID不能设置为“ fsGroup”字段的值?

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

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

我是否误解了文档?

谢谢!

Ale*_*and 5

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

实施此操作存在一个公开问题:https : //github.com/kubernetes/features/issues/213