所属技术领域:
Pod
|名词定义|
Security Context主要用于限制容器的行为,从而保障系统和其他容器的安全。这一块的能力不是 Kubernetes 或者容器 runtime 本身的能力,而是 Kubernetes 和 runtime 通过用户的配置,最后下传到内核里,再通过内核的机制让 SecurityContext 来生效。所以这里介绍的内容,会比较简单或者说比较抽象一点。
1.容器级别的Security Context:仅对指定容器生效
2.Pod级别的Security Context:对指定Pod中的所有容器生效
3.Pod Security Policies(PSP):对集群内所有Pod生效
|技术特点|
权限和访问控制设置项:
1.Discretionary Access Control:根据用户id和组id来控制文件访问权限
2.SELinux:通过SELinux的策略配置控制用户,进程等对文件等访问控制
3.Privileged:容器是否为特权行为模式
4.Linux Capabilities:给特定进程配置privileged能力
5.AppArmor:控制可执行文件的访问控制权限(读写文件/目录,网络端口读写等)
6.Seccomp:控制进程可以操作的系统调用
7.AllowPrivilegeEscalation:控制一个进程是否能有比其父进程获取更多的权限
最后其实都是落到内核来控制它的一些权限。
上图是对 pod 级别和容器级别配置 SecurityContext 的一个例子,如果大家对这些内容有更多的需求,可以根据这些信息去搜索更深入的资料来学习。
securityContext的设置
kubernetes中有个字段叫securityContext,即安全上下文,它用于定义Pod或Container的权限和访问控制设置。其设置包括:
Discretionary Access Control: 根据用户ID(UID)和组ID(GID)来限制其访问资源(如:文件)的权限
针对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
针对container设置: - name: sec-ctx-vol
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-2
spec:
securityContext:
runAsUser: 1000
containers:
-
name: sec-ctx-demo-2
image: gcr.io/google-samples/node-hello:1.0
securityContext:runAsUser: 2000 allowPrivilegeEscalation: false
Security Enhanced Linux (SELinux): 给容器指定SELinux labels
...
securityContext:
seLinuxOptions:
level: "s0:c123,c456"
Running as privileged or unprivileged:以privileged或unprivileged权限运行
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-4
spec:
containers:
-
name: sec-ctx-4
image: gcr.io/google-samples/node-hello:1.0
securityContext:privileged: true
Linux Capabilities: 给某个特定的进程privileged权限,而不用给root用户所有的privileged权限
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-4
spec:
containers:
-
name: sec-ctx-4
image: gcr.io/google-samples/node-hello:1.0
securityContext:capabilities: add: ["NET_ADMIN", "SYS_TIME"]
AppArmor: 使用程序文件来限制单个程序的权限
Seccomp: 限制一个进程访问文件描述符的权限
AllowPrivilegeEscalation: 控制一个进程是否能比其父进程获取更多的权限,AllowPrivilegeEscalation的值是bool值,如果一个容器以privileged权限运行或具有CAP_SYS_ADMIN权限,则AllowPrivilegeEscalation的值将总是true。
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-2
spec:
securityContext:
runAsUser: 1000
containers:
-
name: sec-ctx-demo-2
image: gcr.io/google-samples/node-hello:1.0
securityContext:runAsUser: 2000 allowPrivilegeEscalation: false
注意:要开启容器的privileged权限,需要提前在kube-apiserver和kubelet启动时添加参数--allow-privileged=true,默认已添加。