From 74beb0edc47499a37bf2dee29115095bd971b943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=98=9F=E5=AE=87?= Date: Thu, 20 Feb 2025 10:38:23 +0800 Subject: [PATCH] =?UTF-8?q?update=20docs\docs\zh\docs\Container\=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E7=89=B9=E6=80=A7.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新Makerdown格式 Changes to be committed: modified: "docs/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" Signed-off-by: 周星宇 --- ...11\345\205\250\347\211\271\346\200\247.md" | 126 +++++++++--------- 1 file changed, 60 insertions(+), 66 deletions(-) diff --git "a/docs/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" "b/docs/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" index 3865f4cae..5fc94e13b 100644 --- "a/docs/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" +++ "b/docs/zh/docs/Container/\345\256\211\345\205\250\347\211\271\346\200\247.md" @@ -1,8 +1,9 @@ # 安全特性 + - [安全特性](#安全特性.md) - - [seccomp安全配置场景](#seccomp安全配置场景) - - [capabilities安全配置场景](#capabilities安全配置场景) - - [SELinux安全配置场景](#selinux安全配置场景) + - [seccomp安全配置场景](#seccomp安全配置场景) + - [capabilities安全配置场景](#capabilities安全配置场景) + - [SELinux安全配置场景](#selinux安全配置场景) ## seccomp安全配置场景 @@ -10,7 +11,7 @@ seccomp(**secure computing** **mode**)是linux kernel从2.6.23版本开始引入的一种简洁的sandboxing机制。在一些特定场景下,用户需要在容器中执行一些“特权”操作,但又不想启动特权容器,用户经常会在run时添加--cap-add来获得一些“小范围”的权限。对于安全要求比较严格的容器实例,上述的CAP粒度不一定能够满足安全需要,可使用一些办法精细化控制权限范围。 -- 举例 +- 举例 普通容器场景中,用户使用-v将宿主机某目录(包含某普通用户无法执行的二进制),映射到容器中。 @@ -18,14 +19,13 @@ seccomp(**secure computing** **mode**)是linux kernel从2.6.23版本开始 这个场景,如果在严格安全要求下,需要使用seccomp裁剪chmod、fchmod、fchmodat系统调用。 - ### 使用限制 -- 不要禁用iSulad的seccomp特性 - +- 不要禁用iSulad的seccomp特性 + 默认的iSulad有一个seccomp的配置,配置中使用的是白名单,不在配置的sys_call会被seccomp禁掉,使用接口--security-opt 'seccomp:unconfined'可以禁止使用seccomp特性。如果禁用seccomp或使用自定义seccomp配置但过滤名单不全,都会增加容器对内核的攻击面。 -- 默认的Seccomp配置是白名单,不在白名单的syscall默认会返回SCMP_ACT_ERRNO,同时会根据不同的Cap开放不同的系统调用,不在白名单上面的权限,iSulad默认不会将权限给到容器。 +- 默认的Seccomp配置是白名单,不在白名单的syscall默认会返回SCMP_ACT_ERRNO,同时会根据不同的Cap开放不同的系统调用,不在白名单上面的权限,iSulad默认不会将权限给到容器。 ### 使用指导 @@ -35,15 +35,16 @@ seccomp(**secure computing** **mode**)是linux kernel从2.6.23版本开始 isula 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”需要是绝对路径。 ->4. --security-opt采用“=”号进行分割,不支持使用“:”号分割。 +>![](./public_sys-resources/icon-note.gif) **说明:** +> +>1. 创建容器时通过--security-opt将配置文件传给容器时,采用默认配置文件(/etc/isulad/seccomp\_default.json)。 +>2. 创建容器时--security-opt设置为unconfined时,对容器不过滤系统调用。 +>3. “/path/to/seccomp/profile.json”需要是绝对路径。 +>4. --security-opt采用“=”号进行分割,不支持使用“:”号分割。 #### 获取普通容器的默认seccomp配置 -- 启动一个普通容器(或者是带--cap-add的容器),并查看默认权限配置: +- 启动一个普通容器(或者是带--cap-add的容器),并查看默认权限配置: ``` cat /etc/isulad/seccomp_default.json | python -m json.tool > profile.json @@ -77,10 +78,9 @@ isula run -itd --security-opt seccomp=/path/to/seccomp/profile.json rnd-dockerhu ]... ``` +- 查看转换为lxc可识别的seccomp配置 -- 查看转换为lxc可识别的seccomp配置 - - ``` + ```shell cat /var/lib/isulad/engines/lcr/74353e38021c29314188e29ba8c1830a4677ffe5c4decda77a1e0853ec8197cd/seccomp ``` @@ -98,7 +98,6 @@ isula run -itd --security-opt seccomp=/path/to/seccomp/profile.json rnd-dockerhu ... ``` - #### 定制seccomp配置文件 在启动容器的时候使用--security-opt引入seccomp配置文件,容器实例会按照配置文件规则进行限制系统API的运行。首先获取普通容器的默认seccomp,得到完整模板,然后按照本节定制配置文件,启动容器: @@ -122,29 +121,32 @@ isula run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json rnd-dock } ``` ->![](./public_sys-resources/icon-notice.gif) **须知:** ->- defaultAction、syscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscall都有一个默认的action,并且如果syscalls数组中有明确的定义,就以syscalls中的为准,由于defaultAction、action的值不一样,就能保证action不会有冲突。当前支持的action有: -> "SCMP\_ACT\_ERRNO":禁止,并打印错误信息。 -> "SCMP\_ACT\_ALLOW":允许。 ->- syscalls: 数组,可以只有一个syscall,也可以有多个,可以带args,也可以不带。 ->- name:要过滤的syscall。 ->- args:数组,里面的每个object的定义如下: +>![](./public_sys-resources/icon-notice.gif) **须知:** +> +>- defaultAction、syscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscall都有一个默认的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"` +> } > ``` -> 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 +> +> 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 ## capabilities安全配置场景 @@ -158,7 +160,7 @@ man capabilities ### 使用限制 -- isulad默认Capabilities(白名单)配置如下,普通容器进程将默认携带: +- isulad默认Capabilities(白名单)配置如下,普通容器进程将默认携带: ``` "CAP_CHOWN", @@ -177,8 +179,8 @@ man capabilities "CAP_AUDIT_WRITE" ``` -- 默认的权能配置,包含了CAP\_SETUID和CAP\_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行文件权限设置,host上的普通用户可能使用该特性进行提权攻击。CAP\_AUDIT\_WRITE,容器可以对host写入,存在一定的风险,如果使用场景不需要,推荐在启动容器的时候使用--cap-drop将其删除。 -- 增加Capabilities意味着容器进程具备更大的能力,同时也会开放更多的系统调用接口。 +- 默认的权能配置,包含了CAP\_SETUID和CAP\_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行文件权限设置,host上的普通用户可能使用该特性进行提权攻击。CAP\_AUDIT\_WRITE,容器可以对host写入,存在一定的风险,如果使用场景不需要,推荐在启动容器的时候使用--cap-drop将其删除。 +- 增加Capabilities意味着容器进程具备更大的能力,同时也会开放更多的系统调用接口。 ### 使用指导 @@ -196,30 +198,29 @@ SELinux\(Security-Enhanced Linux\)是一个Linux内核的安全模块,提供 ### 使用限制 -- 确保宿主机已使能SELinux,且daemon端已打开SELinux使能开发(/etc/isulad/daemon.json中“selinux-enabled”字段为true, 或者命令行参数添加--selinux-enabled) -- 确保宿主机上已配置合适的selinux策略,推荐使用container-selinux进行配置 -- 引入SELinux会影响性能,设置SELinux之前需要对场景进行评估,确定必要时打开daemon端SELinux开关并设置容器SELinux配置 -- 对挂载卷进行标签配置时,源目录不允许为/、/usr、/etc、/tmp、/home、/run、/var、/root以及/usr的子目录。 - ->![](./public_sys-resources/icon-note.gif) **说明:** ->- 目前iSulad不支持对容器的文件系统打标签,确保容器文件系统及配置目录打上容器可访问标签,需使用chcon命令对其打上标签。 ->- 若iSulad启用SELinux访问控制,建议daemon启动前对/var/lib/isulad目录打上标签,容器容器创建时目录下生产的文件及文件夹将默认继承其标签,例如: -> ``` -> chcon -R system_u:object_r:container_file_t:s0 /var/lib/isulad +- 确保宿主机已使能SELinux,且daemon端已打开SELinux使能开发(/etc/isulad/daemon.json中“selinux-enabled”字段为true, 或者命令行参数添加--selinux-enabled) +- 确保宿主机上已配置合适的selinux策略,推荐使用container-selinux进行配置 +- 引入SELinux会影响性能,设置SELinux之前需要对场景进行评估,确定必要时打开daemon端SELinux开关并设置容器SELinux配置 +- 对挂载卷进行标签配置时,源目录不允许为/、/usr、/etc、/tmp、/home、/run、/var、/root以及/usr的子目录。 + +>![](./public_sys-resources/icon-note.gif) **说明:** +> +>- 目前iSulad不支持对容器的文件系统打标签,确保容器文件系统及配置目录打上容器可访问标签,需使用chcon命令对其打上标签。 +>- 若iSulad启用SELinux访问控制,建议daemon启动前对/var/lib/isulad目录打上标签,容器容器创建时目录下生产的文件及文件夹将默认继承其标签,例如: +> +> ``` +> chcon -R system_u:object_r:container_file_t:s0 /var/lib/isulad > ``` ### 使用指导 -- daemon端使能selinux: +- daemon端使能selinux: ``` isulad --selinux-enabled ``` - -   - -- 启动容器时配置selinux标签安全上下文 +- 启动容器时配置selinux标签安全上下文 --security-opt="label=user:USER" 配置安全上下文用户 @@ -236,10 +237,7 @@ SELinux\(Security-Enhanced Linux\)是一个Linux内核的安全模块,提供 9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370 ``` - -   - -- 为挂载卷打selinux标签\('z'为共享模式\) +- 为挂载卷打selinux标签\('z'为共享模式\) ``` $ isula run -itd -v /test:/test:z rnd-dockerhub.huawei.com/official/centos @@ -248,7 +246,3 @@ SELinux\(Security-Enhanced Linux\)是一个Linux内核的安全模块,提供 $ls -Z /test system_u:object_r:container_file_t:s0 file ``` - -    - - -- Gitee