Menu Close

9.2. 为自定义容器创建和使用 SELinux 策略

要为自定义容器生成 SELinux 安全策略,请按照以下步骤执行。

先决条件

  • 已安装用于管理容器的 podman 工具。如果没有,使用 dnf install podman 命令。
  • 一个自定义 Linux 容器 - 本例中是 ubi8

步骤

  1. 安装 udica 软件包:

    # dnf install -y udica

    或者,安装 container-tools 模块,它提供一组容器软件包,包括 udica

    # dnf module install -y container-tools
  2. 启动 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 策略中所有容器的通用域。针对于您的具体情况,这可能太严格或太宽松。

  3. 打开一个新终端,并输入 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
  4. 创建容器 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
  5. 如上一步中的 udica 输出所建议,加载策略模块:

    # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
  6. 停止容器并使用 --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

验证

  1. 检查容器使用 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
  2. 验证 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]#
  3. 检查 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.

其他资源