# 为容器设置Linux Capabilities

使用 Linux Capabilities (opens new window) 可以为容器内的进程授予某些特定的权限(而不是 root 用户的所有权限)。在容器定义的 securityContext 中添加 capabilities 字段,可以向容器添加或删除 Linux Capability。

本文后续章节中,先运行一个不包含 capabilities 字段的容器,观察容器内进程的 linux capabilities 位图的情况;然后在运行一个包含 capabilities 字段的容器,比较其 linux capabilities 位图与前者的不同。

# 无capabilities字段时

我们先确认在没有 capabilities 字段时,容器的行为是怎样的。下面的例子中包含一个容器,我们没有为其添加或删除任何 Linux capability。

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-3
spec:
  containers:
  - name: sec-ctx-demo-3
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
1
2
3
4
5
6
7
8
9
  • 执行命令以创建 Pod
    kubectl apply -f https://kuboard.cn/statics/learning/sec-ctx/security-context-3.yaml
    
    1
  • 执行命令以验证容器正在运行
    kubectl get pod security-context-demo-3
    
    1
  • 执行命令以进入容器的命令行界面
    kubectl exec -it security-context-demo-3 -- sh
    
    1
  • 在容器的命令行界面中查看正在运行的进程
    ps aux
    
    1
    输出结果中展示了容器中进程的 process ID(PID),如下所示:
    PID   USER     TIME  COMMAND
      1   root     0:00  sleep 1h
      6   root     0:00  sh
     11   root     0:00  ps aux
    
    1
    2
    3
    4
  • 在容器的命令行界面中查看 process 1 的状态
    cd /proc/1
    cat status
    
    1
    2
    输出结果中展示了该进程 Linux Capabilities 的位图,如下所示:

     
     


    ...
    CapPrm: 00000000a80425fb
    CapEff: 00000000a80425fb
    ...
    
    1
    2
    3
    4
  • 记录下该进程的位图,然后执行命令 exit 退出重启的命令行界面

# 有capabilities字段时

接下来,我们运行同样的一个容器,不同的是,这次为其设置了 capabilities 字段。下面是 yaml 配置文件,该配置中为进程添加了两个 Linux Capability: CAP_NET_ADMINCAP_SYS_TIME

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-4
spec:
  containers:
  - name: sec-ctx-demo-4
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]
1
2
3
4
5
6
7
8
9
10
11
12
  • 执行命令以创建 Pod

    kubectl apply -f https://kuboard.cn/statics/learning/sec-ctx/security-context-4.yaml
    
    1
  • 执行命令以验证容器正在运行

    kubectl get pod security-context-demo-4
    
    1
  • 执行命令以进入容器的命令行界面

    kubectl exec -it security-context-demo-4 -- sh
    
    1
  • 在容器的命令行界面中查看正在运行的进程

    ps aux
    
    1

    输出结果中展示了容器中进程的 process ID(PID),如下所示:

    PID   USER     TIME  COMMAND
      1   root     0:00  sleep 1h
      6   root     0:00  sh
     11   root     0:00  ps aux
    
    1
    2
    3
    4
  • 在容器的命令行界面中查看 process 1 的状态

    cd /proc/1
    cat status
    
    1
    2

    输出结果中展示了该进程 Linux Capabilities 的位图,如下所示:


     
     


    ...
    CapPrm: 00000000aa0435fb
    CapEff: 00000000aa0435fb
    ...
    
    1
    2
    3
    4
  • 记录下该进程的位图,然后执行命令 exit 退出重启的命令行界面

  • 比较两次运行,进程的 Linux Capabilities 位图的差异:

    第一次运行:00000000a80425fb
    第二次运行:00000000aa0435fb
    
    1
    2

    第一次运行时,位图的 12 位和 25 为是 0。第二次运行时,12 位和 25 位是 1.查看 Linux Capabilities 的常量定义文件 capability.h (opens new window) 可知:12 位代表 CAP_NET_ADMIN,25 位代表 CAP_SYS_TIME

LinuxCapability常量

Linux Capabilities 常量格式为 CAP_XXX。然而,在容器定义中添加或删除 Linux Capabilities 时,必须去除常量的前缀 CAP_。例如:向容器中添加 CAP_SYS_TIME 时,只需要填写 SYS_TIME

更新时间: 2019-10-12 20:01:03