Menu

目录

使用指导

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

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

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

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

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

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

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

"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{
"action": "SCMP_ACT_ALLOW",
"name": "accept"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "accept4"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "access"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "alarm"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "bind"
},
]...
  • 查看转换为lxc可识别的seccomp配置

    cat /var/lib/lcrd/engines/lcr/74353e38021c29314188e29ba8c1830a4677ffe5c4decda77a1e0853ec8197cd/seccomp
    
    ...
    waitpid allow
    write allow
    writev allow
    ptrace allow
    personality allow [0,0,SCMP_CMP_EQ,0]
    personality allow [0,8,SCMP_CMP_EQ,0]
    personality allow [0,131072,SCMP_CMP_EQ,0]
    personality allow [0,131080,SCMP_CMP_EQ,0]
    personality allow [0,4294967295,SCMP_CMP_EQ,0]
    ...
    

定制seccomp配置文件

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

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

配置文件模板:

{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "syscall-name",
"action": "SCMP_ACT_ERRNO",
"args": null
}
]
}

注意:
- defaultAction、syscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscal都有一个默认的action,并且如果syscalls数组中有明确的定义,就以syscalls中的为准,由于defaultAction、action的值不一样,就能保证action不会有冲突。当前支持的action有:
“SCMP_ACT_ERRNO”:禁止,并打印错误信息。
“SCMP_ACT_ALLOW”:允许。
- syscalls: 数组,可以只有一个syscall,也可以有多个,可以带args,也可以不带。
- name:要过滤的syscall。
- args:数组,里面的每个object的定义如下:

   type Arg struct {  
   Index    uint     `json:"index"`     //参数的序号,如open(fd, buf, len),fd 对应的就是0,buf为1  
   Value    uint64   `json:"value"`     //跟参数进行比较的值  
   ValueTwo uint64   `json:"value_two"` //仅当Op=MaskEqualTo时起作用,用户传入值跟Value按位与操作后,跟ValueTwo进行比较,若相等则执行action。  
   Op       Operator `json:"op"`  
   }  

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