SELinux如何防止权限提升攻击
小樊
36
2025-12-26 01:19:45
SELinux 防止权限提升攻击的原理与要点
一 核心机制
- 强制访问控制 MAC 覆盖 DAC:即使进程以 root 身份运行,只要不在策略允许范围内,访问仍被拒绝。内核在 DAC 检查通过后再进行 SELinux 检查,且 SELinux 的拒绝优先级更高。安全上下文格式为 user:role:type:level,策略主要基于 type(类型) 实施控制。访问控制流程为:进程尝试访问资源 → 内核调用 SELinux → 比对其安全上下文与策略规则 → 允许/拒绝 → 记录 AVC 审计日志(/var/log/audit/audit.log)。默认策略如 targeted 会对关键服务施加隔离,降低被攻破后的影响范围。
二 关键防护手段
- 最小权限与域隔离(Type Enforcement):每个服务运行在专属 域(如 httpd_t),只能对策略明确允许的类型执行操作。典型如:Web 进程(域 httpd_t)可读取 httpd_sys_content_t 的网页内容,但对 shadow_t(/etc/shadow)、其他系统配置类型默认无权限;即便文件权限为 777,策略不允许仍不可访问。
- 域迁移与入口点约束(domain_auto_trans):通过策略规定“从某域执行某可执行类型时,自动迁移到目标域”,确保程序只能在受控的域中运行,阻断利用脚本/程序切换至更高权限域的通道。
- 端口与资源类型绑定:策略将网络端口、设备等资源也打上类型标签,仅允许特定域绑定或访问。例如 http_port_t 通常只允许 httpd_t 等 Web 域监听,避免被滥用于绑定管理端口或敏感设备。
- RBAC 角色隔离:基于 SELinux 用户/角色(如 sysadm_u、staff_u、unconfined_u) 限制可进入的域集合,即使 root 也需要切换到相应角色/域才能执行管理域(如 sysadm_t)的操作,减少“权限冒用”。
三 攻击场景与拦截示例
- 场景 1:Web 服务被入侵后读取敏感文件
无 SELinux:攻破 nginx/apache 后可能读取 /etc/passwd、/root 等;有 SELinux:httpd_t 只能访问 httpd_sys_content_t 等预设类型,访问 shadow_t、root_t 等会被拒绝,并记录 AVC 拒绝日志,从而阻断横向移动与提权路径。
- 场景 2:利用本地服务或脚本提权
无 SELinux:本地漏洞利用可能通过 setuid/服务配置错误 提升权限;有 SELinux:服务被限制在各自 域,且通过 domain_auto_trans 严格控制可执行入口点的域迁移,未授权域无法“变身”为更高权限域,提权调用链被切断。
四 运维与加固清单
- 保持 enforcing 模式:用 sestatus 检查;如需变更,编辑 /etc/selinux/config 设置 SELINUX=enforcing 并重启;临时调试可用 setenforce 0(仅测试环境)。
- 校正安全上下文与持久化:用 ps -eZ/ps auxZ 与 ls -lZ 查看进程/文件上下文;用 semanage fcontext -a -t “(/.*)?” 定义持久规则,再用 restorecon -R 应用,避免直接用 chcon(易丢失)。
- 按最小权限原则运行服务:确保服务处于专有域(如 httpd_t),避免 unconfined_t;确需新权限时优先用策略布尔值(如 setsebool -P httpd_can_network_connect on),其次再考虑最小化的自定义模块。
- 分析 AVC 拒绝并闭环修复:用 ausearch -m avc -ts recent 或查 /var/log/audit/audit.log 定位拒绝原因;用 audit2allow/sealert 辅助评估,优先“改配置/改标签”而非盲目放行;必要时用 audit2allow -m local && checkmodule && semodule_package && semodule -i local.pp 生成并加载最小化策略模块。