zoukankan      html  css  js  c++  java
  • K8S 容器运行时安全设置

    容器安全性-为容器配置安全上下文

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

    • 自主访问控制(Discretionary Access Control):基于 用户 ID(UID)和组 ID(GID). 来判定对对象(例如文件)的访问权限。

    • 安全性增强 Linux(SELinux): 为对象赋予安全性标签,需要用户自行开启Selinux模块。

    • 以特权模式或者非特权模式运行。

    • Linux Capabilities: 为进程赋予 root 用户的部分特权而非全部特权。

    • AllowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs标志。 当容器以特权模式运行或者具有 CAP_SYS_ADMIN 权能时,AllowPrivilegeEscalation 总是为 true。

    • readOnlyRootFilesystem:以只读方式加载容器的根文件系统。

    这里主要演示:Discretionary Access Control,Linux Capabilities

    设置Discretionary Access Control

    yaml示例:

    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: registry.acs.env26.shuguang-ops.com/acs/nginx:1.16
        command: [ "sh", "-c", "sleep 1h" ]
        volumeMounts:
        - name: sec-ctx-vol
          mountPath: /data/demo
        securityContext:
          allowPrivilegeEscalation: false
    

    在配置文件中,runAsUser 字段指定 Pod 中的所有容器内的进程都使用用户 ID 1000 来运行。runAsGroup 字段指定所有容器中的进程都以主组 ID 3000 来运行。 如果忽略此字段,则容器的主组 ID 将是 root(0)。

    当 runAsGroup 被设置时,所有创建的文件也会划归用户 1000 和组 3000。 由于 fsGroup 被设置,容器中所有进程也会是附组 ID 2000 的一部分。 卷 /data/demo 及在该卷中创建的任何文件的属主都会是组 ID 2000。

    验证:

    kubectl exec -it security-context-demo -- /bin/bash
    $ id
    # 可以看到,容器使用的用户不在是root(id=0),而是我们设置的值
    uid=1000 gid=3000 groups=3000,2000
    

    为容器设置Linux Capabilities

    使用 Linux Capabilities,你可以 赋予进程 root 用户所拥有的某些特权,但不必赋予其全部特权。 要为 Container 添加或移除 Linux 权能,可以在 Container 清单的 securityContext 节 包含 capabilities 字段。

    首先,查看不包含 capabilities 字段时候会发生什么。 下面是一个配置文件,其中没有添加或移除容器的权能:

    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo-1
    spec:
      containers:
      - name: sec-ctx-1
        image: gcr.io/google-samples/node-hello:1.0
    
    

    通过控制台创建pod,然后登录到容器中kubectl exec -it security-context-demo-1 -- /bin/bash查看进程1的状态:

    # cd /proc/1 && cat status
    

    输出Capality位图:

    CapPrm: 00000000a80425fb
    CapEff: 00000000a80425fb
    

    然后,运行一个设置了Capality的容器:

    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo-2
    spec:
      containers:
      - name: sec-ctx-2
        image: registry.acs.env26.shuguang-ops.com/acs/nginx:1.16
        securityContext:
          capabilities:
            add: ["NET_ADMIN", "SYS_TIME"]
    

    通过控制台创建pod,然后登录到容器中kubectl exec -it security-context-demo-2 -- /bin/bash查看进程1的状态:

    # cd /proc/1 && cat status
    

    输出Capality位图:

    ...
    CapPrm: 00000000aa0435fb
    CapEff: 00000000aa0435fb
    ...
    

    对比发现:在第一个容器的权能位图中,位 12 和 25 是没有设置的。在第二个容器中,位 12 和 25 是设置了的。位 12 是 CAP_NET_ADMIN 而位 25 则是 CAP_SYS_TIME。 参见 capability.h 了解权能常数的定义。

    设置Selinux

    若要给 Container 设置 SELinux 标签,可以在 Pod 或 Container 清单的 securityContext 节包含 seLinuxOptions 字段。 seLinuxOptions 字段的取值是一个 SELinuxOptions 对象。下面是一个应用 SELinux 标签的例子:

    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo-3
    spec:
      containers:
      - name: sec-ctx-3
        image: registry.acs.env26.shuguang-ops.com/acs/nginx:1.16
        securityContext:
      		seLinuxOptions:
        	level: "s0:c123,c456"
    

    说明: 要指定 SELinux,需要在宿主操作系统中装载 SELinux 安全性模块。


    文章参考:官方文章

  • 相关阅读:
    Git 使用记录
    AngularJS $http返回的数据类型
    angularJS 使用$http 出现 $http.get(...).success is not a function
    JS数组及其方法(slice,contact...)
    HTML5的localStorage和sessionStorage
    promise async await 结合 demo2
    promise async await 结合 demo1
    git 命令
    git
    new 优先级的题目
  • 原文地址:https://www.cnblogs.com/vinsent/p/13666124.html
Copyright © 2011-2022 走看看