我是 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”。此文件属于组“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
然后,我创建一个子文件夹“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 的组。根据文档中的这句话,我预计它应该属于组“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
...
有没有人有一些解释?
为什么用户的 GID 没有设置为 Pod 的安全上下文中“fsGroup”字段的值?
为什么用户的 GID 设置为 0 = root?
它是 Kubernetes 中的错误(我使用的是 v1.8.0)吗?
我误解了文档吗?
谢谢!