0
点赞
收藏
分享

微信扫一扫

Kubernetes【安全】1. SecurityContext安全上下文


文章目录

  • ​​1. 简介​​
  • ​​2. 功能​​
  • ​​2.1 配置pod的安全上下文​​
  • ​​2.2 为 Pod 配置卷访问权限和属主变更策略​​
  • ​​2.3 对启动的容器使用sysctl修改内核参数,比如es这类容器镜像。​​
  • ​​2.4 对启动的容器赋予SELinux标签​​

1. 简介

安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。安全上下文包括但不限于:

  • ​自主访问控制(Discretionary Access Control)​​:基于 用户 ID(UID)和组 ID(GID).来判定对对象(例如文件)的访问权限
  • ​安全性增强的 Linux(SELinux)​​:为对象赋予安全性标签。
  • 以特权模式或者非特权模式运行。
  • ​Linux 权能​​: 为进程赋予 root 用户的部分特权而非全部特权。
  • ​AppArmor​​:使用程序文件来限制单个程序的权限。
  • ​Seccomp​​:限制一个进程访问文件描述符的权限。
  • ​AllowPrivilegeEscalation​​:控制进程是否可以获得超出其父进程的特权。此布尔值直接控制是否为容器进程设置no_new_privs 标志。当容器以特权模式运行或者具有 CAP_SYS_ADMIN权能时,AllowPrivilegeEscalation 总是为 true。
  • ​readOnlyRootFilesystem​​:以只读方式加载容器的根文件系统。

Kubernetes【安全】1. SecurityContext安全上下文_linux

2. 功能

2.1 配置pod的安全上下文

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
 - name: sec-ctx-vol
    emptyDir: {}
  containers:
 - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false

  • 在配置文件中,该​​runAsUser​​字段指定对于Pod中的任何容器,所有进程都以用户ID 1000运行。
  • 该​​runAsGroup​​字段为Pod中的任何容器中的所有进程指定主组ID3000。如果省略此字段,则容器的主要组ID将为root(0)。runAsGroup指定时,用户1000和组3000也将拥有所有创建的文件。
  • 由于​​fsGroup​​指定了字段,因此容器的所有进程也是补充组ID2000的一部分。卷的所有者/data/demo和在该卷中创建的任何文件都将是组ID 2000。

;kubectl apply -f https://k8s.io/examples/pods/security/security-context.yaml
;kubectl get pod security-context-demo
;kubectl exec -it security-context-demo -- sh
;ps 
PID   USER     TIME  COMMAND
    1 1000      0:00 sleep 1h
    6 1000      0:00 sh
...

;cd /data
;ls -l
drwxrwsrwx 2 root 2000 4096 Jun  6 20:08 demo
;cd demo
;echo hello > testfile
;ls -l
-rw-r--r-- 1 1000 2000 6 Jun  6 20:08 testfile
;id
uid=1000 ;gid=3000 ;groups=2000

2.2 为 Pod 配置卷访问权限和属主变更策略

FEATURE STATE: Kubernetes v1.18 [alpha]

默认情况下,Kubernetes 在挂载一个卷时,会递归地更改每个卷中的内容的属主和访问权限,使之与 Pod 的 securityContext 中指定的 fsGroup 匹配。对于较大的数据卷,检查和变更属主与访问权限可能会花费很长时间,降低 Pod 启动速度。你可以在 securityContext 中使用 fsGroupChangePolicy 字段来控制 Kubernetes 检查和管理卷属主和访问权限的方式。

fsGroupChangePolicy - fsGroupChangePolicy 定义在卷被暴露给 Pod 内部之前对其 内容的属主和访问许可进行变更的行为。此字段仅适用于那些支持使用 fsGroup 来 控制属主与访问权限的卷类型。此字段的取值可以是:

  • ​OnRootMismatch​​:只有根目录的属主与访问权限与卷所期望的权限不一致时,才改变其中内容的属主和访问权限。这一设置有助于缩短更改卷的属主与访问权限所需要的时间。
  • ​Always​​:在挂载卷时总是更改卷中内容的属主和访问权限。

securityContext:
  runAsUser: 1000
  runAsGroup: 3000
  fsGroup: 2000
  fsGroupChangePolicy: "OnRootMismatch"

这是一个Alpha功能。要使用它,请为​​kube-api-server​​​,​​kube-controller-manager​​​和​​kubelet​​​ 启用功能门 ​​ConfigurableFSGroupPolicy​​。

2.3 对启动的容器使用sysctl修改内核参数,比如es这类容器镜像。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sc-demo
spec:
  template:
    containers:
    - name: sc-demo
      image: xxxxxx
      command: [ "sh", "-c", "sleep 1h" ]
      securityContext:
        privileged: true

给予 ​​privileged: true​​ 是一个比较粗的权限,一般不建议如此,可以为权限定义更细粒度的权限,类似需要在容器中使用 perf 命令,则可以进行如下定义:

...
securityContext:
    capabilities:
        add: ["SYS_ADMIN"]

具体 capabilities 的使用规则可参考:在 Kubernetes 中配置 ​​Container Capabilities​

2.4 对启动的容器赋予SELinux标签

...
securityContext:
  seLinuxOptions:
    level: "s0:c123,c456"

要指定 SELinux,需要在宿主操作系统中装载 SELinux 安全性模块。​​seLinuxOptions​​ 字段的取值是一个 SELinuxOptions 对象

参考资料:

  • ​​https://kubernetes.io/docs/tasks/configure-pod-container/security-context/​​

Kubernetes【安全】1. SecurityContext安全上下文_kubernetes_02

举报

相关推荐

0 条评论