一、SELinux防护机制的核心逻辑
SELinux基于域-类型(Domain-Type)模型实现访问控制:
- 安全上下文:每个对象(进程、文件、端口等)被标记为
user:role:type:level
四元组,例如Web服务进程httpd_t
仅能访问标记为httpd_sys_content_t
的文件。 - 策略决策:当进程尝试访问资源时,内核安全模块会检查策略规则库,仅允许显式授权的操作。例如,默认策略会阻止Nginx进程写入
/etc/passwd
,即使该进程以root身份运行。 - 三种运行模式:
- Enforcing:强制执行策略,拒绝违规操作
- Permissive:仅记录违规日志,不阻止操作
- Disabled:完全禁用SELinux
案例:某金融系统曾因未限制数据库进程的端口访问权限,导致攻击者通过恶意端口扫描窃取数据。启用SELinux并定制端口策略后,此类攻击被彻底阻断。
二、策略定制前的关键准备
1. 环境诊断与日志收集
- 状态检查:通过
sestatus
确认SELinux运行模式,使用getenforce
快速切换模式。 - 日志分析:在Permissive模式下运行服务,通过
ausearch -m avc -ts recent
捕获拒绝日志,使用audit2allow -M my_policy
生成初始策略草案。
2. 工具链部署
- 基础工具:安装
policycoreutils-python
(含audit2allow)、setools-console
(含seinfo/sesearch) - 开发工具:安装
policycoreutils-devel
(含checkmodule/semodule_package) - 上下文管理:使用
semanage fcontext
修改文件类型,restorecon -Rv
递归应用更改
示例:为自定义Web应用目录设置安全上下文:
bash
|
semanage fcontext -a -t myapp_data_t "/opt/myapp(/.*)?" |
|
restorecon -Rv /opt/myapp |
三、模块化策略设计方法论
1. 类型定义(Type Declaration)
- 进程域类型:为每个服务定义独立类型,如
type myapp_t
- 资源类型:区分文件、套接字等类型,如
type myapp_exec_t
(可执行文件)、type myapp_var_t
(数据文件) - 属性关联:通过属性实现类型分组,例如:
te
attribute webapp_content_t; type myapp_data_t, webapp_content_t;
2. 访问控制规则(AV Rules)
- 基本语法:
allow <源类型> <目标类型>:<类> <权限>
- 关键规则示例:
te
# 允许Web进程读取配置文件 allow myapp_t myapp_conf_t:file { read open }; # 禁止进程访问敏感设备 neverallow myapp_t device_t:chr_file { read write };
3. 角色与用户映射(Role/User Mapping)
- 角色定义:限制进程可访问的资源范围,例如:
te
role myapp_role_t types myapp_t; - 用户映射:将Linux用户关联到SELinux角色,例如:
bash
semanage login -a -u user_u -r myapp_role_t john
四、高级策略优化技巧
1. 布尔值动态控制
通过setsebool -P
调整策略行为,例如:
bash
|
# 允许Web服务连接数据库 |
|
setsebool -P httpd_can_network_connect_db on |
2. 端口策略定制
为非标准端口分配安全类型,例如开放8080端口给HTTP服务:
bash
|
semanage port -a -t http_port_t -p tcp 8080 |
3. 多级安全(MLS)策略
在涉密系统中,通过MLS实现数据分级保护:
te
|
# 定义敏感级别 |
|
mlsconstrain { file lnk_file } { write setattr rename append unlink link } |
|
((l1 dom l2) or (t1 == t2)); |
五、实战验证与持续维护
1. 策略编译与加载
- 编写策略文件
myapp.te
- 编译模块:
bash
checkmodule -M -m -o myapp.mod myapp.te semodule_package -o myapp.pp -m myapp.mod semodule -i myapp.pp
2. 攻击模拟测试
- 测试场景:尝试让Web进程写入系统目录
- 预期结果:操作被SELinux拦截,日志记录违规行为
- 验证命令:
bash
sesearch -A -s myapp_t -t sysadm_t -c file
3. 持续更新机制
- 版本控制:为策略模块添加版本号,例如
module myapp 1.2
- 自动化审计:结合
audit2why
分析新日志,迭代优化策略
六、典型应用场景解析
1. 容器安全加固
通过自定义策略限制容器进程访问宿主机设备:
te
|
# 禁止容器进程访问宿主机块设备 |
|
neverallow container_process_t host_block_t:blk_file { read write }; |
2. 数据库防护
为MySQL定义细粒度策略:
te
|
# 仅允许数据库进程访问特定数据目录 |
|
allow mysqld_t mysql_data_t:dir { search getattr }; |
|
allow mysqld_t mysql_data_t:file { create read write }; |
3. 防APT攻击
通过MLS策略阻止低权限进程读取高敏感文件:
te
|
mlsconstrain file { read getattr execute } ((l1 dom l2) or (t1 == t2)); |
七、结语
SELinux策略定制是一项需要兼顾安全性与可用性的系统工程。通过模块化设计、类型属性关联和持续验证,开发者可构建出既符合最小权限原则又适应业务变化的防护体系。在实际部署中,建议遵循"默认拒绝、按需开放"的原则,结合自动化工具实现策略的全生命周期管理,最终构建起抵御零日攻击的内核级防线。