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机制最佳实践与注意事项

核心原则

  1. 最小权限原则:只赋予进程完成任务所需的最小权限,例如Nginx不需要访问/etc/shadow
  2. 分步实施:先在Permissive/Complain模式下运行1-2周,收集完整日志后再切换到Enforcing模式
  3. 策略版本控制:将SELinux策略文件(.te)和AppArmor配置文件纳入Git管理
  4. 定期审计:每月执行audit2allow -a(SELinux)或aa-logprof(AppArmor)检查新增拒绝事件

常见陷阱

  • 禁用SELinux:永远不要使用setenforce 0作为长期解决方案,应该找出根本原因
  • 过度宽松:避免使用dontauditaa-complain永久忽略拒绝事件
  • 策略冲突:在混合环境中,确保SELinux和AppArmor不会同时作用于同一进程
  • 备份还原:修改策略前执行semanage export -f /root/selinux_backup.txtcp -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,因为系统已经通过策略明确禁止了这些操作。这才是真正的“零信任”在操作系统层面的落地实践。

📚 推荐资源

– 部分链接含推广返佣 –

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注