SELinux 系统管理员指南:关于 SELinux 的 42 个常见问题

获取关于安全增强型 Linux 的生活、宇宙和一切其他重大问题的答案。
396 位读者喜欢这篇文章。
Lock

JanBaby,通过 Pixabay CC0。

“事物并不总是像它们看起来那样,这是一个重要且流行的事实……”

—道格拉斯·亚当斯,《银河系漫游指南》

安全。加固。合规性。策略。系统管理员启示录的四骑士。除了我们的日常任务——监控、备份、实施、调整、更新等等——我们还负责保护我们的系统安全。即使是那些第三方提供商告诉我们禁用增强安全性的系统。这似乎是《碟中谍》伊森·亨特的工作。

面对这种困境,一些系统管理员决定服用蓝色药丸,因为他们认为他们永远不会知道关于生命、宇宙和一切其他重大问题的答案。而且,正如我们都知道的,那个答案是42

本着《银河系漫游指南》的精神,这里有关于管理和使用 SELinux 系统的 42 个常见问题解答。

  1. SELinux 是一个标签系统,这意味着每个进程都有一个标签。每个文件、目录和系统对象都有一个标签。策略规则控制标记进程和标记对象之间的访问。内核强制执行这些规则。
  1. 两个最重要的概念是:标签(文件、进程、端口等)和类型强制(根据类型将进程彼此隔离)。
  1. 正确的标签格式是 user:role:type:level(可选)。
  1. 多级安全 (MLS) 强制执行的目的是根据进程将要使用的数据的安全级别来控制进程(域)。例如,秘密进程不能读取绝密数据。
  1. 多类别安全 (MCS) 强制执行保护相似的进程彼此隔离(如虚拟机、OpenShift gears、SELinux 沙箱、容器等)。
  1. 用于在启动时更改 SELinux 模式的内核参数
    • autorelabel=1 → 强制系统重新标记
    • selinux=0 → 内核不加载 SELinux 基础设施的任何部分
    • enforcing=0 → 以 permissive 模式启动
  1. 如果您需要重新标记整个系统
    # touch /.autorelabel
    # reboot

    如果系统标签包含大量错误,您可能需要在 permissive 模式下启动,以便 autorelabel 成功。

  1. 检查 SELinux 是否已启用

    # getenforce
  1. 临时启用/禁用 SELinux

    # setenforce [1|0]
  1. SELinux 状态工具

    # sestatus
  1. 配置文件

    /etc/selinux/config
  1. SELinux 是如何工作的?这是一个 Apache Web 服务器的标签示例
    • 二进制文件:/usr/sbin/httpdhttpd_exec_t
    • 配置目录:/etc/httpdhttpd_config_t
    • 日志文件目录:/var/log/httpdhttpd_log_t
    • 内容目录:/var/www/htmlhttpd_sys_content_t
    • 启动脚本:/usr/lib/systemd/system/httpd.servicehttpd_unit_file_d
    • 进程:/usr/sbin/httpd -DFOREGROUNDhttpd_t
    • 端口:80/tcp, 443/tcphttpd_t, http_port_t

httpd_t 上下文中运行的进程可以与带有 httpd_something_t 标签的对象交互。

  1. 许多命令接受参数 -Z 来查看、创建和修改上下文
    • ls -Z
    • id -Z
    • ps -Z
    • netstat -Z
    • cp -Z
    • mkdir -Z

上下文在创建文件时根据其父目录的上下文设置(有一些例外)。RPM 可以将上下文设置为安装的一部分。

  1. SELinux 错误有四个主要原因,在下面的第 15-21 项中进一步解释
    • 标签问题
    • SELinux 需要知道的东西
    • SELinux 策略/应用程序中的错误
    • 您的信息可能已泄露
  1. 标签问题:如果您的 /srv/myweb 中的文件未正确标记,则访问可能会被拒绝。以下是一些修复方法
    • 如果您知道标签

      # semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
    • 如果您知道带有等效标签的文件

      # semanage fcontext -a -e /srv/myweb /var/www
    • 恢复上下文(对于两种情况)

      # restorecon -vR /srv/myweb
  1. 标签问题:如果您移动文件而不是复制它,则该文件会保留其原始上下文。要修复这些问题
    • 使用标签更改上下文命令

      $ sudo chcon -t httpd_system_content_t /var/www/html/index.html
    • 使用参考标签更改上下文命令

      $ sudo chcon --reference /var/www/html/ /var/www/html/index.html
    • 恢复上下文(对于两种情况)

      $ sudo restorecon -vR /var/www/html/
  1. 如果 SELinux 需要知道 HTTPD 监听端口 8585,请告诉 SELinux

    $ sudo semanage port -a -t http_port_t -p tcp 8585
  1. SELinux 需要知道布尔值允许在运行时更改 SELinux 策略的部分,而无需任何 SELinux 策略编写知识。例如,如果您希望 httpd 发送电子邮件,请输入

    $ sudo setsebool -P httpd_can_sendmail 1
  1. SELinux 需要知道布尔值只是 SELinux 的开关设置
    • 查看所有布尔值:# getsebool -a
    • 查看每个布尔值的描述:# semanage boolean -l
    • 设置布尔值执行:# setsebool [_boolean_] [1|0]
    • 要永久配置它,请添加 -P。例如

      # setsebool httpd_enable_ftp_server 1 -P
  1. SELinux 策略/应用程序可能存在错误,包括
    • 不寻常的代码路径
    • 配置
    • stdout 重定向
    • 泄露的文件描述符
    • 可执行内存
    • 构建不良的库
  1. 如果您有受限域尝试执行以下操作,则您的信息可能已泄露
    • 加载内核模块
    • 关闭 SELinux 的强制模式
    • 写入 etc_t/shadow_t
    • 修改 iptables 规则
  1. 用于开发策略模块的 SELinux 工具
    $ yum -y install setroubleshoot setroubleshoot-server

    安装后重新启动或重启 auditd

  1. 使用 journalctl 列出与 setroubleshoot 相关的所有日志
    $ sudo journalctl -t setroubleshoot --since=14:20

     

  1. 使用 journalctl 列出与特定 SELinux 标签相关的所有日志。例如
    $ sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
  1. 当发生 SELinux 错误时,使用 setroubleshoot 日志并提出一些可能的解决方案。例如,来自 journalctl

    Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
    
    # sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
    SELinux is preventing httpd from getattr access on the file /var/www/html/index.html.
    
    ***** Plugin restorecon (99.5 confidence) suggests ************************
    
    If you want to fix the label,
    /var/www/html/index.html default label should be httpd_syscontent_t.
    Then you can restorecon.
    Do
    # /sbin/restorecon -v /var/www/html/index.html
  1. 日志记录:SELinux 在各处记录信息
    • /var/log/messages
    • /var/log/audit/audit.log
    • /var/lib/setroubleshoot/setroubleshoot_database.xml
  1. 日志记录:在审计日志中查找 SELinux 错误

    $ sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
  1. 搜索特定服务的 SELinux 访问向量缓存 (AVC) 消息

    $ sudo ausearch -m avc -c httpd
  1. audit2allow 实用程序从被拒绝操作的日志中收集信息,然后生成 SELinux 策略允许规则。例如
    • 生成关于访问被拒绝原因的人类可读描述:# audit2allow -w -a
    • 查看允许被拒绝访问的类型强制规则:# audit2allow -a
    • 创建自定义模块:# audit2allow -a -M mypolicy

      -M 选项创建一个带有指定名称的类型强制文件 (.te),并将规则编译成策略包 (.pp):mypolicy.pp mypolicy.te
    • 安装自定义模块:# semodule -i mypolicy.pp
  1. 将单个进程(域)配置为以 permissive 模式运行:# semanage permissive -a httpd_t
  1. 如果您不再希望域处于 permissive 模式:# semanage permissive -d httpd_t
  1. 禁用所有 permissive 域

    $ sudo semodule -d permissivedomains
  1. 启用 SELinux MLS 策略

    $ sudo yum install selinux-policy-mls

    /etc/selinux/config: 中:

    SELINUX=permissive
    SELINUXTYPE=mls
    

    确保 SELinux 以 permissive 模式运行

    $ sudo setenforce 0

    使用 fixfiles 脚本以确保在下次重启时重新标记文件

    $ sudo fixfiles -F onboot
    $ sudo reboot
  1. 创建具有特定 MLS 范围的用户

    $ sudo useradd -Z staff_u tux

    使用 useradd 命令,将新用户映射到现有的 SELinux 用户(在本例中为 staff_u)。

  1. 查看 SELinux 用户和 Linux 用户之间的映射

    $ sudo semanage login -l
  1. 为用户定义特定范围

    $ sudo semanage login --modify --range s2:c100 tux
  1. 更正用户主目录上的标签(如果需要)

    $ sudo chcon -R -l s2:c100 /home/tux
  1. 列出当前类别

    $ sudo chcat -L
  1. 要修改类别或开始创建自己的类别,请按如下方式修改文件

    /etc/selinux/_<selinuxtype>_/setrans.conf
  1. 在特定文件、角色和用户上下文中运行命令或脚本

    $ sudo runcon -t initrc_t -r system_r -u user_u yourcommandhere
    • -t 是文件上下文
    • -r 是角色上下文
    • -u 是用户上下文
  1. 禁用 SELinux 的容器运行
    • 使用 Podman:# podman run --security-opt label=disable …
    • 使用 Docker:# docker run --security-opt label=disable …
  1. 如果您需要为容器提供对系统的完全访问权限
    • 使用 Podman:# podman run --privileged …
    • 使用 Docker:# docker run --privileged …

有了这些,您已经知道答案了。所以请:不要惊慌,并开启 SELinux

来源

Alex Callejas
Alex Callejas 是 Red Hat 的服务内容架构师,常驻墨西哥城,也是 opensource.com 的贡献者。他拥有超过 20 年的系统管理员经验,在基础设施加固和自动化方面拥有丰富的专业知识。作为开源爱好者,他通过在不同的公共访问活动和大学中分享他的知识来支持社区。

5 条评论

感谢分享。这是一个非常有趣的主题,并且解释得很好。祝贺你!

非常好的资源。您在结尾句中有一个小小的错别字:So please: Don't panic, and turn on SELinux.

优秀的总结,谢谢!在第 17 项的最后一部分有一个小小的错别字:您写的是 setseebol 而不是 setsebool。

如果默认情况下 SELinux 在 Debian/Ubuntu 系统中运行,也许它会更受欢迎。但是,由于 SELinux 和 AppArmor 之间的场景被划分,因此很难选择。这很可惜

好文章。我已经使用 SELinux 多年了,但不知道其中的一些
答案。第 25 个答案是我的最爱,因为我一直使用“sealert”
命令,尤其是在使用新软件时。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.