# 使用指导<a name="ZH-CN_TOPIC_0184808149"></a>

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

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

>![](public_sys-resources/icon-note.gif) **说明：**   
>1.  创建容器时通过--security-opt将配置文件传给容器时，采用默认配置文件（/etc/isulad/seccomp\_default.json）。  
>2.  创建容器时--security-opt设置为unconfined时，对容器不过滤系统调用。  
>3.  “/path/to/seccomp/profile.json”需要是绝对路径。  

## 获取普通容器的默认seccomp配置<a name="zh-cn_topic_0183112366_section16304185318140"></a>

-   启动一个普通容器（或者是带--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配置文件<a name="zh-cn_topic_0183112366_section1684042215"></a>

在启动容器的时候使用--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
}
]
}
```

>![](public_sys-resources/icon-notice.gif) **须知：**   
>-   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  

