使用指导

通过—security-opt将配置文件传给要过滤系统调用的容器。

  1. isula run -itd --security-opt seccomp=/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox

使用指导 - 图1 说明:

  1. 创建容器时通过—security-opt将配置文件传给容器时,采用默认配置文件(/etc/isulad/seccomp_default.json)。
  2. 创建容器时—security-opt设置为unconfined时,对容器不过滤系统调用。
  3. “/path/to/seccomp/profile.json”需要是绝对路径。

获取普通容器的默认seccomp配置

  • 启动一个普通容器(或者是带—cap-add的容器),并查看默认权限配置:

    1. cat /etc/isulad/seccomp_default.json | python -m json.tool > profile.json

    可以看到”seccomp”字段中,有很多的”syscalls”,在此基础上,仅提取syscalls的部分,参考定制seccomp配置文件,进行定制化操作。

    1. "defaultAction": "SCMP_ACT_ERRNO",
    2. "syscalls": [
    3. {
    4. "action": "SCMP_ACT_ALLOW",
    5. "name": "accept"
    6. },
    7. {
    8. "action": "SCMP_ACT_ALLOW",
    9. "name": "accept4"
    10. },
    11. {
    12. "action": "SCMP_ACT_ALLOW",
    13. "name": "access"
    14. },
    15. {
    16. "action": "SCMP_ACT_ALLOW",
    17. "name": "alarm"
    18. },
    19. {
    20. "action": "SCMP_ACT_ALLOW",
    21. "name": "bind"
    22. },
    23. ]...
  • 查看转换为lxc可识别的seccomp配置

    1. cat /var/lib/isulad/engines/lcr/74353e38021c29314188e29ba8c1830a4677ffe5c4decda77a1e0853ec8197cd/seccomp
    1. ...
    2. waitpid allow
    3. write allow
    4. writev allow
    5. ptrace allow
    6. personality allow [0,0,SCMP_CMP_EQ,0]
    7. personality allow [0,8,SCMP_CMP_EQ,0]
    8. personality allow [0,131072,SCMP_CMP_EQ,0]
    9. personality allow [0,131080,SCMP_CMP_EQ,0]
    10. personality allow [0,4294967295,SCMP_CMP_EQ,0]
    11. ...

定制seccomp配置文件

在启动容器的时候使用—security-opt引入seccomp配置文件,容器实例会按照配置文件规则进行限制系统API的运行。首先获取普通容器的默认seccomp,得到完整模板,然后按照本节定制配置文件,启动容器:

  1. isula run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox

配置文件模板:

  1. {
  2. "defaultAction": "SCMP_ACT_ALLOW",
  3. "syscalls": [
  4. {
  5. "name": "syscall-name",
  6. "action": "SCMP_ACT_ERRNO",
  7. "args": null
  8. }
  9. ]
  10. }

使用指导 - 图2 须知:

  • defaultAction、syscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscal都有一个默认的action,并且如果syscalls数组中有明确的定义,就以syscalls中的为准,由于defaultAction、action的值不一样,就能保证action不会有冲突。当前支持的action有:
    “SCMP_ACT_ERRNO”:禁止,并打印错误信息。
    “SCMP_ACT_ALLOW”:允许。
  • syscalls: 数组,可以只有一个syscall,也可以有多个,可以带args,也可以不带。
  • name:要过滤的syscall。
  • args:数组,里面的每个object的定义如下:
    1. type Arg struct {
    2. Index uint `json:"index"` //参数的序号,如open(fd, buf, len),fd 对应的就是0,buf为1
    3. Value uint64 `json:"value"` //跟参数进行比较的值
    4. ValueTwo uint64 `json:"value_two"` //仅当Op=MaskEqualTo时起作用,用户传入值跟Value按位与操作后,跟ValueTwo进行比较,若相等则执行action。
    5. Op Operator `json:"op"`
    6. }
    args中的Op,其取值可以下页面的任意一种:
    “SCMP_CMP_NE”: NotEqualTo
    “SCMP_CMP_LT”: LessThan
    “SCMP_CMP_LE”: LessThanOrEqualTo
    “SCMP_CMP_EQ”: EqualTo
    “SCMP_CMP_GE”: GreaterThanOrEqualTo
    “SCMP_CMP_GT”: GreaterThan
    “SCMP_CMP_MASKED_EQ”: MaskEqualTo