使用指导
通过—security-opt将配置文件传给要过滤系统调用的容器。
isula run -itd --security-opt seccomp=/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox
说明:
- 创建容器时通过—security-opt将配置文件传给容器时,采用默认配置文件(/etc/isulad/seccomp_default.json)。
- 创建容器时—security-opt设置为unconfined时,对容器不过滤系统调用。
- “/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/isulad/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,得到完整模板,然后按照本节定制配置文件,启动容器:
isula 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的定义如下:
args中的Op,其取值可以下页面的任意一种:
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"`
}
“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