SELinux和AppArmor不是给Nginx“加一层隔离”,而是从启动起将其限定在强制权限边界内,即使被攻破也无法读取密码文件、加载恶意模块或修改其他服务配置。

SELinux 和 AppArmor 不是给 Nginx “加一层隔离”,而是让 Nginx 进程从启动那一刻起,就在操作系统强制划定的权限边界里运行——哪怕它被攻破,也无法跳出这个沙盒去读取密码文件、加载恶意模块或修改其他服务配置。
用 SELinux 锁死 Nginx 的行为边界
SELinux 对 Nginx 的保护基于类型强制(TE)策略:主进程(nginx_t)和 worker 进程(httpd_t 或 nginx_worker_t)拥有独立安全上下文,各自能访问的文件、端口、系统调用都由策略硬性规定。
- 确认 SELinux 处于强制模式:
getenforce返回 Enforcing;若为 Permissive,需修改/etc/selinux/config中SELINUX=enforcing并重启 - 检查 Nginx 进程是否已受控:
ps -eZ | grep nginx应显示类似system_u:system_r:httpd_t:s0的上下文 - 关键目录需匹配正确类型:
-
/etc/nginx应为system_conf_t或httpd_config_t(用ls -Z /etc/nginx查看,不匹配则执行restorecon -Rv /etc/nginx) -
/var/log/nginx默认应为httpd_log_t,确保 worker 可写但不可执行其中文件 - Web 根目录如
/var/www/html建议设为httpd_sys_content_t(只读),上传目录另设httpd_sys_rw_content_t并严格限制
-
- 启用布尔值微调策略:例如允许 Nginx 连接后端数据库,执行
setsebool -P httpd_can_network_connect_db 1,避免粗暴放行所有网络行为
用 AppArmor 快速约束 Nginx 路径级行为
AppArmor 更适合快速落地,尤其在容器化或轻量部署中。它不依赖标签,直接通过路径规则限制 Nginx 能打开哪些文件、执行哪些命令、绑定哪些端口。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 为 Nginx 创建 profile:
aa-genprof /usr/sbin/nginx,按提示操作完成学习模式采集,生成/etc/apparmor.d/usr.sbin.nginx - 编辑 profile,显式声明:
- 只允许读取:
/etc/nginx/** r,、/usr/share/nginx/** r, - 只允许写入日志:
/var/log/nginx/*.log w, - 禁止执行临时目录脚本:
/tmp/** Pix,(拒绝并记录)、/dev/shm/** m,(禁用共享内存滥用) - 限制网络绑定:
network inet stream,(仅 TCP 流),禁用raw或packet
- 只允许读取:
- 加载并验证:
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx,再运行aa-status | grep nginx确认处于 enforce 模式 - 避免长期使用
complain模式:它只记录不拦截,容易误判为“策略已生效”,实则毫无防护力
结合 Nginx 自身架构放大隔离效果
SELinux/AppArmor 的策略必须与 Nginx 的多进程模型对齐,才能把“单点失守”真正关进笼子。
- 确保
user nginx nginx;配置生效,且该用户无登录 shell(/sbin/nologin),这样每个 worker 进程都以受限身份运行,策略才有实际作用对象 - 禁用高风险模块:
ngx_http_perl_module、ngx_http_xslt_module等可能绕过策略执行任意代码,编译时剔除或配置中注释掉 - worker 进程不得持有 root 权限:即使主进程以 root 启动,也应在
post_accept后立即降权;检查ps auxZ | grep nginx,worker 行不应出现root用户名 - 共享内存区(如
limit_req_zone)虽提升性能,但也成为攻击面,其 backing 文件(通常在/dev/shm/)需在 AppArmor 中明确限制,或在 SELinux 中设为httpd_tmpfs_t类型
不复杂但容易忽略:策略不是配完就一劳永逸。真实攻击常触发未覆盖路径,要定期查 ausearch -m avc -ts today | head -20(SELinux)或 dmesg | grep apparmor(AppArmor),把合法但被拦的行为补进策略,而不是关掉防护。

















