这是一份为 Linux 安全领域新手准备的,从最基础的概念讲起,一步步带你完成第一个策略模块的编写、调试和部署。
💡 第一步:理解核心概念
在动手之前,先来了解 SELinux 的几个核心思想。
-
什么是 SELinux 策略?
SELinux(Security-Enhanced Linux)是 Linux 内核中的强制访问控制(MAC) 系统。SELinux 策略就是一套规则集合,它被内核加载后,会默认拒绝所有操作,除非有明确的规则允许。
-
基本规则格式
一条 SELinux 规则的基本格式是:
<规则类型> <主体> <对象>:<对象类别> <权限>;- 主体 (Subject) :发起操作的进程。
- 对象 (Object) :被访问的资源,如文件、目录、网络端口等。
- 对象类别 (Object Class) :对象的类型,如
file(文件)、dir(目录)、sock_file(套接字文件)等。 - 权限 (Permissions) :允许的具体操作,如
read(读)、write(写)、execute(执行)。
一个典型的规则示例是:allow httpd_t httpd_log_t:file { read write };这表示允许httpd_t类型的进程对httpd_log_t类型的文件进行读写操作。
-
SELinux 的三种模式
- Enforcing (强制模式) :严格执行策略并记录违规日志。
- Permissive (宽容模式) :不强制执行 策略,只记录违规日志。这是开发和调试的利器。
- Disabled (禁用模式) :完全关闭 SELinux。
你可以用getenforce查看当前模式,用setenforce 0切换到宽容模式,用setenforce 1回到强制模式。
🛠️ 第二步:搭建开发环境
首先,确保你的系统上安装了必要的开发工具。在 RHEL/CentOS/Fedora 等系统上,执行:
bash
sudo yum install selinux-policy-devel setools-console policycoreutils-python-utils
其中 selinux-policy-devel 提供了核心的开发工具。
🚀 第三步:开发第一个策略模块
我们以创建一个名为 myapp 的程序策略为例。
1. 生成策略模板
sepolicy generate 命令可以帮我们自动生成一个策略模板。
bash
# 为 /usr/bin/myapp 这个二进制程序生成一个初始化脚本风格的策略模板
sepolicy generate --init /usr/bin/myapp
执行后,会在当前目录下生成几个文件:
myapp.te: 核心策略文件。myapp.fc: 文件上下文定义文件。myapp.if: 公共接口定义文件。myapp.sh: 辅助脚本。myapp_selinux.spec: RPM 打包文件。
2. 理解三个核心文件
这三个 .te, .fc, .if 文件构成了策略模块的主体。
-
myapp.te(Type Enforcement): 策略的"心脏",主要包含:- 类型声明 :定义新的数据类型。
type myapp_t;定义了进程类型,type myapp_exec_t;定义了可执行文件类型。 - 域定义 :将类型定义为"域"(进程的容器)。
domain_type(myapp_t)。 - 入口点定义 :指定哪个可执行文件可以进入这个域。
domain_entry_file(myapp_t, myapp_exec_t)。 - 访问规则 :核心的
allow语句。例如,allow myapp_t myapp_log_t:file { append_file_perms };允许myapp_t向myapp_log_t日志文件追加内容。
- 类型声明 :定义新的数据类型。
-
myapp.fc(File Context) : 系统的"标签管理员",它负责将文件路径 与安全上下文 关联起来。例如,
/usr/bin/myapp -- gen_context(system_u:object_r:myapp_exec_t,s0)这行代码表示,/usr/bin/myapp这个文件会被打上system_u:object_r:myapp_exec_t的标签。 -
myapp.if(Interface) : 模块的"外交官",定义了供其他模块调用的公共接口。这有助于实现策略的模块化和封装。
🔧 第四步:编译、安装与测试
1. 编译和安装
你可以使用 sepolicy generate 生成的 myapp.sh 脚本,也可以手动操作:
bash
# 编译生成策略包 (.pp) 文件
make
# 安装策略模块
sudo semodule -i myapp.pp
semodule 是管理 SELinux 策略模块的命令行工具。
2. 测试你的策略
将你的应用置于宽容模式下运行,以便收集所有需要的权限信息。
bash
# 仅将新域设置为宽容模式,保持系统其他部分为强制模式
sudo semanage permissive -a myapp_t
sepolicy generate生成的.te文件中默认包含了permissive myapp_t;这行,如果你的策略已经安装,这一步可以跳过。
现在,启动你的应用程序并全面测试其功能,确保所有代码路径都被覆盖到。
🐞 第五步:调试与迭代
这是策略开发中最核心的环节,遵循 "分析-生成-优化" 的迭代流程。
-
分析 AVC 日志 :SELinux 的拒绝访问记录称为 AVC (Access Vector Cache) 消息,它们被记录在
/var/log/audit/audit.log中。使用ausearch工具可以方便地查看:bash# 查看最近的 AVC 消息 sudo ausearch -m AVC -ts recent -
生成策略规则 :
audit2allow工具可以解析 AVC 日志,并生成允许这些被拒绝操作的策略规则。bash# 查看针对 myapp_t 的拒绝日志,并生成策略模块 sudo grep myapp_t /var/log/audit/audit.log | audit2allow -M myapp2 -
审查与优化(最关键的一步) :永远不要直接使用
audit2allow的输出! 它生成的规则往往权限过大。- 尝试使用
audit2allow -R,它会更智能地尝试寻找合适的接口(Interfaces) 来替代原始的allow规则。 - 必须仔细审查每一条生成的规则,思考是否真的需要这个权限,能否进一步缩小范围。
- 尝试使用
-
迭代更新 :将优化后的规则加入到你的
.te文件中,重新make和sudo semodule -i myapp.pp,然后再次测试。 -
收尾工作 :当你的应用在宽容模式下测试无误后,务必从
.te文件中移除permissive myapp_t;这行 ,然后重新编译安装,让你的应用在强制模式下接受最终的考验。
💎 总结与最佳实践
- 核心工作流 :你的开发流程就是一个不断循环的过程:编写策略 → 安装测试 → 分析拒绝日志 → 生成并优化规则 → 更新策略 → 重新测试。
- 善用工具 :熟练掌握
sepolicy、audit2allow、ausearch、semodule等工具,它们是你的得力助手。 - 最小权限原则:始终遵循最小权限原则,只授予应用完成任务所必需的权限。
- 参考官方文档 :
- 学习参考策略 (Reference Policy):现代 Linux 发行版的策略大多基于 Reference Policy,阅读其源码是学习最佳实践的有效途径。
SELinux 策略开发是一项实践性很强的技能。从一个简单的应用开始,在不断的试错和迭代中学习,是掌握它的最佳路径。