1. 安装SELinux管理工具
在Ubuntu上自定义SELinux规则前,需先安装必要的工具包。执行以下命令安装selinux-basics
(基础SELinux管理工具)、selinux-policy-default
(默认策略)及auditd
(审计工具,用于收集拒绝日志):
sudo apt update
sudo apt install selinux-basics selinux-policy-default auditd
2. 启用SELinux并设置为Permissive模式
Ubuntu默认可能未启用SELinux,需通过修改配置文件开启。编辑/etc/selinux/config
文件,取消SELINUX
和SELINUXTYPE
的注释,并设置为以下值:
SELINUX=permissive # 先设为permissive模式(仅记录拒绝事件,不阻止操作)
SELINUXTYPE=targeted # 使用targeted策略(针对特定进程,不影响系统整体)
保存后重启系统使配置生效:
sudo reboot
注:Permissive模式是自定义规则的必要步骤,避免因规则错误导致系统无法正常运行。
3. 创建自定义SELinux策略模块
自定义规则需通过.te
(类型启用)文件定义。以下以“允许my_script
进程访问/var/www/html
目录”为例,步骤如下:
mkdir -p ~/selinux-custom-policy
cd ~/selinux-custom-policy
.te
文件:my_custom_policy.te
文件,内容如下(关键部分说明见注释):policy_module(my_custom_policy, 1.0) # 定义模块名称(my_custom_policy)和版本(1.0)
# 声明类型(若未定义,需手动添加)
type my_script_t; # 进程类型(对应my_script的可执行文件)
type my_script_exec_t; # 可执行文件类型
type httpd_sys_rw_content_t; # 目标目录类型(Apache默认可读写目录)
# 定义进程域(将进程与可执行文件关联)
init_daemon_domain(my_script_t, my_script_exec_t)
# 允许规则(允许my_script_t进程对httpd_sys_rw_content_t类型的目录进行读写)
allow my_script_t httpd_sys_rw_content_t:dir { read write };
保存文件后,可通过audit2allow
工具从系统拒绝日志快速生成规则(适用于已知拒绝事件的场景):grep avc /var/log/audit/audit.log | audit2allow -M my_custom_policy
此命令会生成my_custom_policy.te
(类型定义)和my_custom_policy.pp
(编译后的策略模块)文件。4. 编译并加载自定义策略模块
使用checkmodule
(编译类型定义)和semodule_package
(打包策略模块)工具编译.te
文件:
checkmodule -M -m -o my_custom_policy.mod my_custom_policy.te
semodule_package -o my_custom_policy.pp -m my_custom_policy.mod
编译完成后,使用semodule
命令加载模块:
sudo semodule -i my_custom_policy.pp
加载后,模块会永久保存到SELinux策略中(无需重启系统)。
5. 应用文件上下文并验证规则
semanage fcontext
命令为自定义目录添加上下文(关联到httpd_sys_rw_content_t
类型),确保进程能识别:sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?"
-a
表示添加规则,-t
指定类型,(/.*)?
表示匹配/var/www/html
及其子目录。restorecon
命令恢复目录的实际上下文:sudo restorecon -Rv /var/www/html
-R
表示递归处理,-v
显示详细过程。sudo ausearch -m avc -ts recent | audit2why
若输出显示“avc: denied
”事件消失,则说明规则生效。注意事项