9.2. 为自定义容器创建和使用 SELinux 策略
要为自定义容器生成 SELinux 安全策略,请按照以下步骤执行。
先决条件
-
已安装用于管理容器的
podman
工具。如果没有,使用dnf install podman
命令。 - 一个自定义 Linux 容器 - 本例中是 ubi8。
步骤
安装
udica
软件包:# dnf install -y udica
或者,安装
container-tools
模块,它提供一组容器软件包,包括udica
:# dnf module install -y container-tools
启动 ubi8 容器,它使用只读权限挂载
/home
目录,以及具有读取和写入的权限的/var/spool
目录。容器会公开端口 21。# podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
请注意,现在容器使用
container_t
SELinux 类型运行。这个类型是 SELinux 策略中所有容器的通用域。针对于您的具体情况,这可能太严格或太宽松。打开一个新终端,并输入
podman ps
命令以获取容器的 ID:# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37a3635afb8f registry.access.redhat.com/ubi8:latest bash 15 minutes ago Up 15 minutes ago heuristic_lewin
创建容器 JSON 文件,并使用
udica
根据 JSON 文件中的信息创建策略模块:# podman inspect 37a3635afb8f > container.json # udica -j container.json my_container Policy my_container with container id 37a3635afb8f created! […]
或者:
# podman inspect 37a3635afb8f | udica my_container Policy my_container with container id 37a3635afb8f created! Please load these modules using: # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil} Restart the container with: "--security-opt label=type:my_container.process" parameter
如上一步中的
udica
输出所建议,加载策略模块:# semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
停止容器并使用
--security-opt label=type:my_container.process
选项再次启动它:# podman stop 37a3635afb8f # podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
验证
检查容器使用
my_container.process
类型运行:# ps -efZ | grep my_container.process unconfined_u:system_r:container_runtime_t:s0-s0:c0.c1023 root 2275 434 1 13:49 pts/1 00:00:00 podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash system_u:system_r:my_container.process:s0:c270,c963 root 2317 2305 0 13:49 pts/0 00:00:00 bash
验证 SELinux 现在允许访问
/home
和/var/spool
挂载点:[root@37a3635afb8f /]# cd /home [root@37a3635afb8f home]# ls username [root@37a3635afb8f ~]# cd /var/spool/ [root@37a3635afb8f spool]# touch test [root@37a3635afb8f spool]#
检查 SELinux 是否只允许绑定到端口 21:
[root@37a3635afb8f /]# dnf install nmap-ncat [root@37a3635afb8f /]# nc -lvp 21 … Ncat: Listening on :::21 Ncat: Listening on 0.0.0.0:21 ^C [root@37a3635afb8f /]# nc -lvp 80 … Ncat: bind to :::80: Permission denied. QUITTING.
其他资源
-
系统中的
udica (8)
和podman (1)
手册页 - udica - 为容器生成 SELinux 策略
- 构建、运行和管理容器