二十二、Pod安全设置详解

时间:2024-02-20 19:24:55

      

目录

一、为 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