目录
一、什么是 audit2allow?
二、安装方式(如果未安装)
三、audit2allow 使用步骤详解
1️⃣ 查看被 SELinux 拒绝的操作
2️⃣ 用 audit2allow 生成允许策略
✅ 方式一:直接读取 audit.log
✅ 方式二:基于单条日志输入分析
3️⃣ 输出策略模块
临时查看建议规则:
四、audit2allow 输出示例解析
五、注意事项与建议
✅ 总结流程图
一、什么是 .te 文件?
️ 二、基本工作流程
三、例子:允许 nginx 访问用户目录中的 HTML 文件
1️⃣ 编写 mynginx.te 文件
2️⃣ 编译为模块
3️⃣ 打包为 .pp 策略模块
✅ 四、验证模块是否生效
五、进阶建议
示例 .te 模板(供参考)
总结
audit2allow
是 SELinux 提供的一个非常实用的工具,它可以帮助我们根据 SELinux 的审计日志生成合适的策略规则,从而解决“访问被拒绝(AVC denied)”的问题。下面是详细的讲解和使用流程。
audit2allow
是一个将 SELinux 审计日志(通常是 /var/log/audit/audit.log
)中被拒绝的访问请求(AVC)转换为 SELinux 策略模块(type enforcement rules)的工具。
它通常用于:
快速分析“denied”问题的原因;
自动生成允许这些操作的策略模块(以便你可以选择是否加载它们)。
sudo yum install policycoreutils-python-utils # RHEL/CentOS 7+
sudo dnf install policycoreutils-python-utils # RHEL/CentOS 8+, Fedora
最常见的是从审计日志中获取:
ausearch -m avc -ts recent
或者手动查看 /var/log/audit/audit.log
(或 /var/log/messages
)。
你可能会看到类似这样的日志:
type=AVC msg=audit(1625050244.765:127): avc: denied { read } for pid=1234 comm="nginx" name="index.html" dev="sda1" ino=1234567 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
sudo audit2allow -a
-a
表示分析整个/var/log/audit/audit.log
文件中的拒绝信息。
cat /var/log/audit/audit.log | audit2allow
你也可以手动复制几条 AVC 日志粘贴进去分析。
sudo audit2allow -a
创建本地模块并安装(推荐)
sudo grep nginx /var/log/audit/audit.log | audit2allow -M mynginx
这条命令做了两件事:
生成策略模块 mynginx.te
和二进制文件 mynginx.pp
-M
表示模块名
然后,加载这个模块:
sudo semodule -i mynginx.pp
现在,这条策略规则就会生效,系统允许之前被阻止的访问。
举个例子,如果你运行:
sudo audit2allow -a
你可能会看到输出:
#============= httpd_t ==============
allow httpd_t user_home_t:file { read open };
表示你当前的策略阻止了 httpd_t
类型(如 nginx、apache)访问 user_home_t
(用户主目录)类型的文件。
你可以选择:
修改文件上下文(更推荐)
sudo chcon -t httpd_sys_content_t /home/user/public_html/index.html
或使用 audit2allow
自动生成的模块来“放行”
注意点 | 说明 |
---|---|
⚠️ 审慎使用 | 不要盲目允许所有 denied 行为,有可能掩盖真正的安全问题 |
日志源 | 默认读取 /var/log/audit/audit.log ,如果使用 journalctl ,也可以结合 journalctl -t setroubleshoot |
更新策略后测试 | 每次添加 .pp 模块后,建议测试系统行为是否正常 |
SELinux Denied Access (AVC Log)
↓
查看日志(ausearch / journalctl)
↓
使用 audit2allow 分析
↓
生成 .te 和 .pp 策略模块
↓
semodule -i 安装策略
↓
重试操作,验证结果
下面我会一步一步地教你如何手动编辑 SELinux 的 .te
策略文件(type enforcement 文件),并最终编译成模块加载到系统中。这在你需要更灵活地控制策略内容、细化权限时非常有用。
.te
文件?.te
文件是 SELinux 策略模块中的 “Type Enforcement” 文件,里面定义了:
哪个进程(subject)可以访问什么类型(object)
拥有哪些权限(read/write/execute 等)
它是 SELinux 模块系统中最关键的组成部分之一。
编写 .te
文件(手动或由 audit2allow
生成后修改)
用 checkmodule
把 .te
文件编译成 .mod
用 semodule_package
打包为 .pp
模块
用 semodule
安装这个模块
mynginx.te
文件假设我们想让 nginx(httpd_t
)能够访问用户目录 /home/user/public_html/index.html
,而这个文件默认是 user_home_t
类型。
创建一个文件:
nano mynginx.te
内容如下:
module mynginx 1.0;
require {
type httpd_t;
type user_home_t;
class file { read open getattr };
}
# 允许 httpd_t 访问 user_home_t 类型的文件(仅读)
allow httpd_t user_home_t:file { read open getattr };
checkmodule -M -m -o mynginx.mod mynginx.te
解释:
-m
:生成模块格式
-M
:显示版本号等元信息
.pp
策略模块semodule_package -o mynginx.pp -m mynginx.mod
4️⃣ 安装策略模块
sudo semodule -i mynginx.pp
你可以使用 sesearch
工具验证策略是否被加载:
sesearch -A -s httpd_t -t user_home_t -c file -p read
如果看到了你写的 allow
规则,就说明模块已经被加载。
你也可以在 /etc/selinux/targeted/modules/active/modules/
目录中找到它。
技巧 | 说明 |
---|---|
✅ 加注释 | 在 .te 文件中为每条 allow 添加注释,便于维护 |
使用 audit2allow -i |
先用 audit2allow 生成 .te 再手动改 |
⚠️ 小心滥用 allow | 不要随意写 allow * *:* *; 这样的宽权限 |
使用 semodule -r |
不想要某个模块了可以用 semodule -r 模块名 删除 |
.te
模板(供参考)module myapp 1.0;
require {
type myapp_t;
type var_log_t;
class file { read write open append };
}
# 允许 myapp_t 进程读取和写入日志文件
allow myapp_t var_log_t:file { read write open append };
步骤 | 命令 |
---|---|
编写策略 | nano mymodule.te |
编译模块 | checkmodule -M -m -o mymodule.mod mymodule.te |
打包模块 | semodule_package -o mymodule.pp -m mymodule.mod |
安装模块 | sudo semodule -i mymodule.pp |