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"。此文件属于组“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”:
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 无关。
我是 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"。此文件属于组“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”:
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 无关。