SELinux与AppArmor实战配置指南:从零构建Linux强制访问控制系统
引言:为什么你的Linux系统需要MAC机制?
2024年CVE数据库显示,超过73%的Linux服务器漏洞与权限配置不当相关。传统的DAC(自主访问控制)模型下,root用户拥有绝对权限,一旦攻击者通过缓冲区溢出或提权漏洞获取root权限,整个系统将完全沦陷。这正是SELinux和AppArmor存在的价值——它们作为LSM(Linux安全模块)框架下的MAC(强制访问控制)实现,从根本上限制了进程的权限边界,即使root用户也无法越权操作。
核心内容:两种主流MAC机制实战配置
一、SELinux深度配置(Red Hat/CentOS/Fedora系)
1. 基础状态检查与模式切换
# 查看当前SELinux状态
getenforce # 输出: Enforcing/Permissive/Disabled
sestatus # 显示详细配置信息
# 临时切换模式(无需重启)
setenforce 0 # 切换到Permissive模式(记录但不阻止)
setenforce 1 # 切换回Enforcing模式
实战场景:某金融系统部署Web应用时,SELinux阻止了Nginx读取自定义日志目录。通过以下步骤解决:
2. 自定义策略编写——以Nginx为例
# 查看Nginx进程的安全上下文
ps -eZ | grep nginx
# 输出示例: system_u:system_r:httpd_t:s0
# 创建自定义策略模块
cd /etc/selinux/targeted/src/policy/
cat > nginx_custom.te << 'EOF'
module nginx_custom 1.0;
require {
type httpd_t;
type var_log_t;
class file { read write };
}
# 允许Nginx读取/var/log/custom目录
allow httpd_t var_log_t:file { read write };
EOF
# 编译并加载策略
make -f /usr/share/selinux/devel/Makefile nginx_custom.pp
semodule -i nginx_custom.pp
3. 文件上下文管理
# 为自定义日志目录设置安全上下文
semanage fcontext -a -t httpd_log_t "/var/log/custom(/.*)?"
restorecon -Rv /var/log/custom/
# 验证设置
ls -Z /var/log/custom/
4. 布尔值调整——常见场景优化
# 允许HTTPD脚本执行CGI
setsebool -P httpd_enable_cgi on
# 允许Nginx连接数据库
setsebool -P nis_enabled on
# 查看所有布尔值状态
getsebool -a | grep httpd
二、AppArmor实战配置(Ubuntu/Debian系)
1. 基础管理命令
# 检查AppArmor状态
sudo aa-status
# 加载/卸载配置文件
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.nginx
sudo apparmor_parser -R /etc/apparmor.d/usr.bin.nginx
# 进入学习模式(记录但不阻止)
sudo aa-complain /usr/sbin/nginx
2. 为MySQL编写AppArmor策略
场景:某电商平台MySQL被暴力破解后,攻击者试图通过MySQL进程读取/etc/shadow文件。
# 创建MySQL配置文件
sudo nano /etc/apparmor.d/usr.sbin.mysqld
# 策略内容
#include <tunables/global>
/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/openssl>
# 允许读取的数据目录
/var/lib/mysql/** rw,
/var/log/mysql/** rw,
# 明确禁止访问敏感文件
/etc/shadow r,
/etc/passwd r,
/root/** r,
# 允许使用Unix socket
/var/run/mysqld/mysqld.sock w,
# 网络访问控制
network tcp,
network inet dgram,
}
3. 使用aa-genprof自动生成策略
# 为自定义应用生成策略
sudo aa-genprof /usr/local/bin/custom_app
# 按以下步骤操作:
# 1. 在另一个终端启动应用
# 2. 执行应用的全部功能
# 3. 回到aa-genprof终端,按'S'扫描日志
# 4. 根据提示选择Allow/Deny
# 5. 完成后按'F'完成配置
4. 日志分析与调试
# 查看AppArmor拒绝日志
sudo journalctl -u apparmor | grep DENIED
# 实时监控审计日志
sudo tail -f /var/log/syslog | grep apparmor
# 生成调试报告
sudo aa-logprof
三、真实案例:混合环境下的安全加固
背景:某云服务商同时管理Red Hat和Ubuntu服务器,需要统一加固WordPress环境。
Red Hat端(SELinux):
# 允许WordPress写入wp-content目录
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wp-content(/.*)?"
restorecon -Rv /var/www/html/wp-content/
# 允许WordPress发送邮件
setsebool -P httpd_can_sendmail on
# 允许WordPress连接远程数据库
setsebool -P httpd_can_network_connect_db on
Ubuntu端(AppArmor):
# 为Apache编写AppArmor策略
sudo nano /etc/apparmor.d/usr.sbin.apache2
# 策略片段
/usr/sbin/apache2 {
#include <abstractions/base>
#include <abstractions/php>
#include <abstractions/mysql>
/var/www/html/** r,
/var/www/html/wp-content/** rw,
/tmp/wp-*.tmp rw,
/etc/wordpress/** r,
}
总结:MAC机制最佳实践与注意事项
核心原则
- 最小权限原则:只赋予进程完成任务所需的最小权限,例如Nginx不需要访问/etc/shadow
- 分步实施:先在Permissive/Complain模式下运行1-2周,收集完整日志后再切换到Enforcing模式
- 策略版本控制:将SELinux策略文件(.te)和AppArmor配置文件纳入Git管理
- 定期审计:每月执行
audit2allow -a(SELinux)或aa-logprof(AppArmor)检查新增拒绝事件
常见陷阱
- 禁用SELinux:永远不要使用
setenforce 0作为长期解决方案,应该找出根本原因 - 过度宽松:避免使用
dontaudit或aa-complain永久忽略拒绝事件 - 策略冲突:在混合环境中,确保SELinux和AppArmor不会同时作用于同一进程
- 备份还原:修改策略前执行
semanage export -f /root/selinux_backup.txt或cp -r /etc/apparmor.d /backup/
性能优化建议
- 使用
semodule -DB禁用SELinux的dontaudit规则以提升性能 - 对于AppArmor,使用
aa-unconfined检查未受保护的进程 - 在容器环境中,考虑使用
--security-opt apparmor=unconfined临时绕过(仅限测试环境)
监控告警集成
# 将SELinux拒绝事件发送到SIEM
audit2allow -a | grep -E "denied|AVC" | while read line; do
logger -p authpriv.warning "SELinux: $line"
done
# 集成到Prometheus监控
# 使用node_exporter的textfile收集器
echo "selinux_denied_events $(ausearch -m avc --start recent | wc -l)" > /var/lib/node_exporter/textfile/selinux.prom
最后,记住MAC机制不是安全银弹——它必须与防火墙、入侵检测、补丁管理等形成纵深防御体系。当你正确配置SELinux或AppArmor后,即使攻击者获得root权限,也无法执行rm -rf /或读取/etc/shadow,因为系统已经通过策略明确禁止了这些操作。这才是真正的“零信任”在操作系统层面的落地实践。
💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者

