跳转到内容

SELinux 入门

适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x

SELinux (Security-Enhanced Linux) 是 EL 系统上默认启用的强制访问控制 (MAC) 系统。很多 EL 新手第一次遇到的”诡异问题”往往与 SELinux 有关。

  • SELinux 是什么以及为什么不应该关闭它
  • 三种工作模式及其区别
  • 查看和排查 SELinux 拒绝
  • 常用的 SELinux 管理命令
  • 一台运行 EL 9.x 的系统
  • sudo 权限
  • 已安装 policycoreutilssetroubleshoot-server(通常已预装)

SELinux 通过限制进程只能访问其策略允许的资源,有效降低了安全漏洞的影响范围。即使某个服务被攻破,攻击者也只能访问该服务被授权的资源。

模式说明是否拦截
Enforcing强制执行策略,拒绝违规访问
Permissive不拦截,但记录违规到日志否(仅记录)
Disabled完全关闭
查看当前模式
$ getenforce
Enforcing
查看详细状态
$ sestatus
临时切换到 Permissive(重启后恢复)
$ sudo setenforce 0
临时切换回 Enforcing
$ sudo setenforce 1

当 SELinux 拒绝某个操作时,会在审计日志中记录 AVC(Access Vector Cache)消息。

  1. 查看最近的拒绝记录

    使用 ausearch 查看 AVC 拒绝
    $ sudo ausearch -m avc -ts recent
  2. 使用 sealert 获取人类可读的建议

    安装 setroubleshoot(如未安装)
    $ sudo dnf install -y setroubleshoot-server
    分析日志并给出修复建议
    $ sudo sealert -a /var/log/audit/audit.log | head -50
  3. 按建议修复

    sealert 通常会给出具体的修复命令,如设置正确的文件上下文或启用布尔值。

Terminal window
$ ls -Z /var/www/html/
恢复默认上下文
$ sudo restorecon -Rv /var/www/html/
查看所有 httpd 相关的布尔值
$ getsebool -a | grep httpd
允许 httpd 连接网络
$ sudo setsebool -P httpd_can_network_connect on

文件的 SELinux 上下文可能不正确:

Terminal window
$ sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
$ sudo restorecon -Rv /data/www/
查看 httpd 允许的端口
$ sudo semanage port -l | grep http_port_t
添加允许的端口
$ sudo semanage port -a -t http_port_t -p tcp 8443

EL 10 上的 SELinux 策略持续更新,整体使用方式与 EL 9 兼容。但有一个重要的相关变化:

加密策略:SHA-1 默认禁用

EL 10 的默认加密策略(DEFAULT)禁用了 SHA-1 签名算法,这会影响:

  • 使用旧版 SHA-1 签名的 SSH RSA 密钥(1024-bit)将被拒绝
  • 使用 SHA-1 签发的 SSL/TLS 证书无法通过验证
  • 部分旧版 GPG 签名

如果遇到连接被拒绝,可以检查当前加密策略:

查看当前系统加密策略
update-crypto-policies --show
临时允许 SHA-1(不推荐用于生产)
sudo update-crypto-policies --set DEFAULT:SHA1

推荐做法是更换为 Ed25519 或 RSA-4096 密钥,而不是降低安全策略。