适用场景
SELinux 安全加固适用于需要满足等保合规的 Linux 服务器、运行 Web/数据库/容器等对外服务的生产环境,以及安全基线检查中被判定「SELinux 未启用」而需要整改的场景。SELinux 通过强制访问控制(MAC)限制进程的越权访问,即使 Web 应用被攻破,攻击者也难以突破进程自身的安全域读写系统敏感文件。
前置条件
- CentOS / RHEL / Rocky / AlmaLinux 等支持 SELinux 的发行版
- root 权限,且已备份
/etc/selinux/config - 了解常用服务(如 Nginx、SSH)的基本运维操作
- 建议先在测试机验证策略再上生产
原理说明
SELinux(Security-Enhanced Linux)是美国 NSA 主导的 Linux 安全模块,核心是强制访问控制(MAC):每个进程和文件都有安全上下文(如 system_u:object_r:httpd_t:s0),由 SELinux 策略决定进程域(Domain)能否访问某类资源的类型(Type)。与传统的自主访问控制(DAC,即文件权限 rwx)不同,即使 root 用户和文件权限放行,SELinux 策略拒绝的访问依然会被阻断。策略模式分为 Enforcing(强制)/ Permissive(宽容)/ Disabled(禁用) 三种。
操作步骤
1. 查看当前状态
# 查看运行模式
getenforce
# 查看详细配置
sestatus
# 查看策略包版本
semanage --version
若输出 Disabled,需修改配置文件启用;若为 Permissive,可先观察违规记录再切强制。
2. 启用 SELinux(Enforcing)
# 修改配置文件(永久生效)
sudo sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
grep '^SELINUX=' /etc/selinux/config
# 立即生效(临时切换)
sudo setenforce 1
# 再次确认
getenforce # 输出 Enforcing
注意:Disabled 状态下写入 ext4/xfs 的文件缺少安全上下文标签,直接从 Disabled 切 Enforcing 可能因标签缺失导致服务无法启动。稳妥做法是先 touch /.autorelabel 并重启,让系统自动重打标签。
3. 查看进程与文件的安全上下文
# 查看进程上下文
ps -eZ | grep nginx
# 查看文件上下文
ls -Z /usr/share/nginx/html/
# 查看端口上下文
semanage port -l | grep http
4. 为自定义目录设置正确类型
# 将 /data/www 目录标记为 Web 内容类型(httpd 可读)
sudo semanage fcontext -a -t httpd_sys_content_t '/data/www(/.*)?'
# 应用规则(立即生效)
sudo restorecon -Rv /data/www
# 验证
ls -Z /data/www
5. 调整布尔值放行常用功能
# 查看与 httpd 相关的布尔值
getsebool -a | grep httpd
# 允许 httpd 通过网络访问外部(如代理转发)
sudo setsebool -P httpd_can_network_connect on
# 允许 httpd 连接数据库端口
sudo setsebool -P httpd_can_network_connect_db on
# 永久生效参数 -P,重启不丢失
6. 排查并解决 SELinux 拦截问题
# 查看被拒记录
sudo ausearch -m avc -ts recent
# 用 audit2why 解释原因
sudo ausearch -m avc -ts recent | audit2why
# 生成并查看放行策略(临时调试用)
sudo ausearch -m avc -ts recent | audit2allow -M mynginx
cat mynginx.te
确认原因后安装策略模块放行:sudo semanage module -a mynginx.pp。生产环境优先用 semanage 调整类型与布尔值,而不是直接放行全部 AVC。
7. 验证 Nginx 服务正常
sudo systemctl restart nginx
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/
# 期望输出 200
配置验证
# 验证 1:运行模式
getenforce # 应为 Enforcing
# 验证 2:服务上下文正确
ps -eZ | grep nginx # 应含 httpd_t
# 验证 3:自定义目录标签正确
ls -Zd /data/www # 应含 httpd_sys_content_t
# 验证 4:最近无新增 AVC 拒绝(业务正常时)
sudo ausearch -m avc -ts recent | tail -5
常见问题
FAQ 1:开启 SELinux 后 Nginx 403/无法启动怎么办?
九成是文件类型标签错误。用 ls -Z 检查站点目录是否为 httpd_sys_content_t,不是则按步骤 4 执行 semanage fcontext + restorecon;若涉及代理/数据库连接,再检查对应布尔值是否开启。
FAQ 2:应用与 SELinux 冲突,能否直接关闭?
不建议。关闭 SELinux 会失去 MAC 层防护,等保评测也会扣分。先切 Permissive 模式运行 1-2 周,用 ausearch 收集所有 AVC 拒绝并逐条放行,确认无异常后再切 Enforcing,这是生产环境的标准迁移路径。
FAQ 3:SELinux 会影响 Docker 容器运行吗?
会。容器运行需 container_t 相关策略,Docker 默认已适配。若容器出现权限异常,检查 docker run --security-opt label=disable 或宿主机布尔值 container_manage_cgroup,优先使用官方容器运行时,避免自定义策略冲突。
总结
SELinux 是 Linux 纵深防御中成本最低、收益最高的 MAC 机制。本文给出了从 Disabled 到 Enforcing 的安全迁移路径:先启用 Permissive 观察、用 semanage 修正类型与布尔值、以 ausearch/audit2allow 精确放行。建议将 getenforce 状态纳入安全基线巡检脚本,确保生产服务器始终运行在 Enforcing 模式。