selinux是叠加在传统linux dac之上的强制访问控制(mac)层,通过安全上下文和策略规则实现进程级细粒度管控,补足dac在防越权、防误配、防root滥用方面的短板。

SELinux不是用来替代传统Linux权限的,而是叠加在它之上的强制层。即使文件权限是777,只要SELinux策略没允许,进程照样无法访问;反过来,哪怕DAC权限被设为000,只要SELinux放行且进程有对应标签,访问仍可能成功——但这种情况极少见,因为双重检查必须同时通过。
SELinux如何补足DAC的短板
DAC只看“谁在操作”和“文件归谁”,而SELinux关注“哪个进程在操作”和“它该不该碰这个资源”。这种转变带来三个关键提升:
-
防进程越权:Apache被攻破后,即使拿到root权限,也只能读写
httpd_t域允许的类型(如httpd_sys_content_t),不能碰ssh_key_t或shadow_t。 -
防配置失误:误把
/etc/shadow设成644,DAC会放行,SELinux仍阻止非特权进程读取——因为它的类型是shadow_t,只允许passwd_t等少数域访问。 -
防root滥用:root用户启动的bash默认在
unconfined_t域,但若切换到staff_t角色,其能力就受对应策略约束,不再是“无所不能”。
安全上下文:SELinux的识别语言
每个文件和进程都有一个形如user:role:type:level的标签,其中type最关键。比如:
-
ls -Z /var/www/html/index.html可能显示system_u:object_r:httpd_sys_content_t:s0 -
ps -Z | grep httpd可能显示system_u:system_r:httpd_t:s0
策略规则就是围绕这些type写的,例如allow httpd_t httpd_sys_content_t:file { read getattr };——只有这条规则存在,Web服务才能读网页文件。
三种模式怎么用才合理
生产环境必须用enforcing,但调试新服务时可临时切到permissive:
- 用
setenforce 0切宽容模式,再运行服务,查ausearch -m avc -ts recent看哪些访问被拒绝(但未拦截) - 根据日志生成修复建议:
sealert -a /var/log/audit/audit.log会提示是否要改上下文或开布尔值 - 修好后再
setenforce 1回归强制模式,确认无误再写入/etc/selinux/config永久生效
常见加固动作不复杂但容易忽略
多数问题出在上下文错配,而不是策略缺失:
- 移动或复制文件(如
cp -r)会继承源目录上下文,导致Web目录里出现user_home_t——用restorecon -Rv /var/www/html重置 - 自定义端口(如让httpd监听8080)需先开SELinux端口许可:
semanage port -a -t http_port_t -p tcp 8080 - 某些服务需要额外权限(如PHP写日志),不是改文件权限,而是开对应布尔值:
setsebool -P httpd_can_network_connect_db on











