目录
一、为 Pod 设置安全性上下文
二、为 Pod 配置卷访问权限和属主变更策略
三、为Container 设置安全性上下文
四、为 Container 设置权能
五、为容器设置 Seccomp 配置
k8s可以为pod设置应用程序运行所需的权限或者访问控制等安全设置,涉及多种Linux Kernel安全相关的系统参数,这些安全设置被称为Security Context,在pod或者Conntainer级别通过securityContext字段进行设置。
pod的Security Context 安全策略包括但不限于以下内容:
- 自主访问控制(Discretionary Access Control): 基于用户 ID(UID)和组 ID(GID) 来判定对对象(例如文件)的访问权限
- 安全性增强的 Linux(SELinux): 为对象赋予安全性标签。
- 以特权模式或者非特权模式运行。
- Linux 权能: 为进程赋予 root 用户的部分特权而非全部特权。
- AppArmor:使用程序配置来限制个别程序的权能。
- Seccomp:过滤进程的系统调用。
- allowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs标志。 当容器满足一下条件之一时,allowPrivilegeEscalation 总是为 true:
- 以特权模式运行,或者
- 具有CAP_SYS_ADMIN 权能
- readOnlyRootFilesystem:以只读方式加载容器的根文件系统。
一、为 Pod 设置安全性上下文
securityContext 字段。securityContext 字段值是一个 PodSecurityContext 对象。你为 Pod 所设置的安全性配置会应用到 Pod 中所有 Container 上。 下面是一个 Pod 的配置文件,该 Pod 定义了securityContext 和一个 emptyDir 卷:
[root@k8s-master-1 rbac]# vim security-context.yaml
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000 #所有容器都将以UserID 为1000 运行程序,所有新生成文件的UserID也被设置为1000.
runAsGroup: 3000 #所有容器都将以Group ID 为3000运行程序,所有新生成的文件的Group ID 也被设置为3000
fsGroup: 2000
#挂载的卷,/data/demo 及其中创建的文件都将属于Group ID 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox:1.28.4
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
1、[root@k8s-master-1 rbac]# kubectl apply -f security-context.yaml
pod/security-context-demo created
2、[root@k8s-master-1 rbac]# kubectl get pod
NAME READY STATUS RESTARTS AGE
security-context-demo 1/1 Running 0 4s
3、进入容器查看
[root@k8s-master-1 rbac]# kubectl exec -it security-context-demo -- sh
4、在Shell 中,列举运行中的进程:输出显示进程以用户 1000 运行,即 runAsUser 所设置的值:
/ $ ps
PID USER TIME COMMAND
1 1000 0:00 sleep 1h
7 1000 0:00 sh
12 1000 0:00 ps
5、在Shell 中,进入 /data 目录列举其内容:输出显示 /data/demo 目录的组 ID 为 2000,即fsGroup 的设置值:
/data $ ls -l
total 0
drwxrwsrwx 2 root 2000 6 Jun 23 02:14 demo
6、在Shell 中,进入到/data/demo 目录下创建一个文件:输出显示 testfile 的组 ID 为 2000,也就是 fsGroup 所设置的值:
/data/demo $ echo 123 > testfile
/data/demo $
/data/demo $ ls -l
total 4
-rw-r--r-- 1 1000 2000 4 Jun 23 02:26 testfile
7、/data/demo $ id
uid=1000 gid=3000 groups=2000,3000
如果 runAsGroup 被忽略,则 gid 会取值 0(root),而进程就能够与 root 用户组所拥有以及要求 root 用户组访问权限的文件交互。
二、为 Pod 配置卷访问权限和属主变更策略
默认情况下,kubernetes在挂载一个卷时,会递归的更改每个卷的内容的属主和访问权限,使之与Pod的securityContext中指定的fsGroup匹配。对于子目录或文件非常多的volume来说,非常耗时,降低Pod的启动速度,为了降低减少修改目录和文件权限的时间,可以在securityContext中使用fsGroupChangePolicy字段来控制kubernetes检查和管理卷属主和访问权限的方式。
该特性通过securityContext.fsGroupChangePolicy字段进行设置,可以设置如下值:
- OnRootMismatch:只有根目录的属主与访问权限与卷所期望的权限不一致时,才改变其中内容的属主和访问权限,这一设置有助于缩短更改卷的属主与访问权限所需要的的时间
- Always:在挂载卷时总是更改卷中内容的属主和访问权限
示例:
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
fsGroupChangePolicy: "OnRootMismatch"
三、为Container 设置安全性上下文
若要为Container设置安全性配置,可以在Container清单中包含securityContext字段,securityContext 字段的取值是一个 SecurityContext 对象。你为 Container 设置的安全性配置仅适用于该容器本身,并且所指定的设置在与 Pod 层面设置的内容发生重叠时,会重写 Pod 层面的设置。Container 层面的设置不会影响到 Pod 的卷。如果为Container设置了securityContext,则容器将使用Container级别的设置。
示例:在pod配置文件中,Pod和Container级别都设置了runAsUser
[root@k8s-master-1 rbac]# vim security-context-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-2
spec:
securityContext:
runAsUser: 1000
containers:
- name: sec-ctx-demo-2
image: busybox:1.28.4
imagePullPolicy: IfNotPresent
command: [ "sh", "-c", "sleep 1h" ]
securityContext:
runAsUser: 2000
allowPrivilegeEscalation: false
[root@k8s-master-1 rbac]# kubectl apply -f security-context-2.yaml
pod/security-context-demo-2 created
[root@k8s-master-1 rbac]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
security-context-demo-2 1/1 Running 0 3s 10.244.0.102 k8s-node-1 <none> <none>
[root@k8s-master-1 rbac]# kubectl exec -it security-context-demo-2 -- sh
/ $ ps aux #查看运行中的进程:
PID USER TIME COMMAND
1 2000 0:00 sleep 1h
7 2000 0:00 sh
13 2000 0:00 ps aux
输出显示进程以用户 2000 运行。该值是在 Container 的 runAsUser 中设置的。 该设置值重写了 Pod 层面所设置的值 1000。
四、为 Container 设置权能
详见官网:为 Pod 或容器配置安全上下文 | Kubernetes
五、为容器设置 Seccomp 配置
详见官网:为 Pod 或容器配置安全上下文 | Kubernetes