一、SELinux 简介

红帽官方文档参考:使用 SELinux | Red Hat Product Documentation

系统管理员一般无法通过基于用户、组和其它权限(称为 Discretionary Access Control,DAC)的标准访问策略生成全面、精细的安全策略。例如,限制特定应用程序只能查看日志文件,而同时允许其他应用程序在日志文件中添加新数据。

**SELinux 策略(RHCSA 考试不要求写策略)**在一系列规则中使用这些上下文(策略使用上下文管理),它们定义进程如何相互交互以及与各种系统资源进行交互。默认情况下,策略不允许任何交互,除非规则明确授予了相应的权限。

1、基本概念

Security Enhanced Linux(SELinux)可实现强制访问控制(Mandatory Access Control,MAC)。每个进程和系统资源都有一个特殊的安全性标签,称为 SELinux 上下文(context),它们定义进程如何相互交互以及与各种系统资源进行交互。

SELinux 上下文包括以下字段: user(用户)、role(角色)、type(类型)和 security level(安全级别)。其中最重要的是 type ,因为用于定义允许在进程和系统资源间进行的交互的策略规则会使用 SELinux 类型而不是 SELinux 的完整上下文,type(类型)名称通常以 _t 结尾。

VfhQzq3q-1.png

2、工作原理

例如,通常 Web 服务器的类型名称为 httpd_t。通常位于 /var/www/html/ 中的文件和目录的类型上下文是 httpd_sys_content_t。通常位于 /tmp and /var/tmp/ 中的文件和目录的类型上下文是 tmp_t。Web 服务器端口的类型上下文是 http_port_t

如果有一个策略规则允许 Apache(类型为 httpd_t 的 Web 服务器进程)访问目录 /var/www/html/ 中类型为 httpd_sys_content_t 的目录和文件,而策略规则中没有规则适用于 /tmp/var/tmp/,那么 Apache 进程就不能访问 /tmp 。所以当使用 SELinux 时,即使 Apache 被破坏,一个恶意的脚本可以访问它,也无法访问 /tmp 目录。

又比如 SELinux 允许作为 httpd_t 运行 Apache 进程访问 /var/www/html/ 目录,并且拒绝同一进程访问 /data/mysql/ 目录,因为 httpd_tmysqld_db_t 类型上下文没有允许规则。另一方面,作为 mysqld_t 运行的 MariaDB 进程可以访问 /data/mysql/ 目录,SELinux 也会拒绝 mysqld_t 类型的进程来访问标记为 httpd_sys_content_t/var/www/html/ 目录。

VfhQzq3q-2.png

二、设置 SELinux

1、更改 SELinux 模式

SELinux具有以下操作模式

  • Enforcing :SELinux强制执行加载的策略。此模式是红帽企业Linux中的默认模式。
  • Permissive :SELinux加载策略并处于活动状态,但不强制执行访问控制规则,而是记录访问违规。此模式有助于对应用和规则进行测试和故障排除。
  • Disabled :SELinux已关闭。SELinux违规不会被拒绝或记录。强烈建议不要禁用SELinux。

getenforce :查看当前的 SELinux 模式

VfhQzq3q-3.png

setenforce 1/0 :临时设置 SELinux 模式为 Enforcing / Permissive

VfhQzq3q-4.png

vim /etc/selinux/config :永久修改 SELinux 模式(RHCSA 考试 SELinux 操作全程在 Enforcing 模式下)

VfhQzq3q-5.png

2、管理 SELinux 上下文

通常使用 semanage fcontext 命令更改文件默认的上下文,使用 restorecn 来将文件和目录的 SELinux 安全上下文重置为默认值

Apache Web 服务器(进程名为 httpd)在非常规端口 82 上运行失败,原因为 SELinux 通过端口类型(Port Type) 来管理网络端口,确保只有特定的服务可以绑定到特定的端口。而 httpd 进程绑定的端口类型为 http_port_t ,该类型通常不允许绑定 82 端口。下面将展示如何通过修改 httpd 上下文来成功在 82 端口运行 httpd。

VfhQzq3q-6.png

semanage port -l :列出 SELinux 管理的端口类型

  • -l :列出指定对象类型的记录

VfhQzq3q-7.png

semanage port -a -t [http_port_t] -p [tcp] [82] :给 [http_port_t] 端口类型添加 [tcp] 协议的 [82] 端口

  • -a/--add :添加指定对象类型的记录
  • -t/--type :指定对象类型
  • -p/--proto :指定端口的协议类型

VfhQzq3q-8.png

systemctl enable --now httpd :启动 httpd 服务,并设置开机自启

VfhQzq3q-9.png

firewall-cmd --permanent --add-port=[82]/[tcp] :允许 [tcp] 协议的 [82] 端口通过防火墙并永久更改

VfhQzq3q-10.png

firewall-cmd --reload :重新加载防火墙,并使用 curl 命令访问发现依旧无法访问

VfhQzq3q-11.png

VfhQzq3q-12.png

ls -Z :查看文件的 SELinux 上下文,发现 /var/www/html 下的 file1 文件上下文类型为 default_t,应该将其修改为 httpd_sys_content_t(只有将文件或目录的安全上下文设置为 httpd_sys_content_t,表示这些资源可以被 Apache HTTP 服务器访问)

VfhQzq3q-13.png

semanage fcontext -l :查看所有文件的默认 SELinux 上下文,发现没有默认规则将 httpd_sys_content_t 应用于 /var/www/html(一般默认是会有 /var/www(/ .*)? all files system_u:object_r:httpd_sys_content_t:s0 这样一条记录的,但博主这里的练习环境没有,只能手动添加)

VfhQzq3q-14.png

semanage fcontext -m -t [httpd_sys_content_t] [/var/www/html/file1] :给目录 [/var/www/html/file1] 的默认上下文的 SELinux 类型修改为 [httpd_sys_content_t]

  • -m/--modify :修改现有的文件上下文规则
  • -t/--type :指定新的 SELinux 类型

VfhQzq3q-15.png

restorecon -Rv [/var/www/html] :将 [/var/www/html] 目录及其子文件和子目录的上下文重置为默认值

-R :递归操作,应用于目录及其所有子文件和子目录

-v :显示详细信息

VfhQzq3q-16.png

3、设置 SELinux 布尔值

SELinux 通过策略来定义目标应用的允许行为。SELinux 布尔值可启用或禁用 SELinux 策略的可选行为,从而有选择地调整应用的行为。

getsebool -a :查看所有目标策略的布尔值

VfhQzq3q-17.png

httpd 策略默认不允许 httpd 服务访问用户家目录,下面将展示如何通过修改 httpd 策略的布尔值来允许 httpd 服务访问。(RHCSA 考试一般只考察上面修改端口的例子,下面设置 SELinux 布尔值的操作仅供了解)

systemctl enable --now httpd :启动 httpd 服务,并设置开机自启

VfhQzq3q-18.png

setsebool -P [httpd_enable-homedirs] on :将 [httpd_enable-homedirs](httpd 服务是否有访问用户家目录的权限) 布尔值设为 on(-P 表示永久修改)

VfhQzq3q-19.png