搬瓦工 VPS AppArmor 强制访问控制教程
AppArmor(Application Armor)是 Linux 内核中的强制访问控制(MAC)安全模块,默认集成于 Ubuntu 和 Debian 系统中。与 SELinux 相比,AppArmor 采用基于路径的访问控制方式,配置更加直观易懂,非常适合初次接触 Linux 安全加固的用户。本文将详细介绍如何在搬瓦工 VPS 上配置和管理 AppArmor,为服务器应用建立安全沙箱。
一、AppArmor 基本概念
AppArmor 通过配置文件(Profile)定义每个应用程序可以访问的系统资源,包括文件、网络、能力(Capabilities)等。核心概念如下:
- 配置文件(Profile):定义单个应用程序的访问控制规则,存放在
/etc/apparmor.d/目录下。 - Enforce 模式:强制执行策略,违规访问将被拒绝并记录日志。
- Complain 模式:宽容模式,违规访问仅记录日志但不拒绝,适合调试使用。
- 能力(Capabilities):控制进程可以使用的 Linux 内核能力,例如绑定特权端口、修改文件所有者等。
二、安装与启用 AppArmor
2.1 Ubuntu / Debian 系统
Ubuntu 系统默认已启用 AppArmor,可以通过以下命令确认状态:
aa-status
安装管理工具:
apt update
apt install apparmor-utils apparmor-profiles apparmor-profiles-extra -y
2.2 确认内核支持
# 检查内核是否加载 AppArmor
cat /sys/module/apparmor/parameters/enabled
# 输出 Y 表示已启用
# 查看 AppArmor 详细状态
aa-status
三、配置文件结构
3.1 配置文件位置
# 主配置文件目录
ls /etc/apparmor.d/
# 本地自定义覆盖目录
ls /etc/apparmor.d/local/
# 抽象规则库(可被其他配置文件引用)
ls /etc/apparmor.d/abstractions/
3.2 配置文件语法
以下是一个典型的 AppArmor 配置文件示例:
# /etc/apparmor.d/usr.local.bin.myapp
#include <tunables/global>
/usr/local/bin/myapp {
#include <abstractions/base>
#include <abstractions/nameservice>
# 可执行文件
/usr/local/bin/myapp mr,
# 允许读取配置文件
/etc/myapp/ r,
/etc/myapp/** r,
# 允许读写数据目录
/var/lib/myapp/ rw,
/var/lib/myapp/** rw,
# 允许写入日志
/var/log/myapp/ rw,
/var/log/myapp/** rw,
# 允许读取 /tmp
/tmp/ r,
/tmp/myapp-* rw,
# 网络访问权限
network tcp,
network udp,
# 能力控制
capability net_bind_service,
capability setuid,
capability setgid,
}
3.3 权限标志说明
r- 读取w- 写入a- 追加m- 内存映射可执行k- 文件锁定l- 硬链接ix- 继承执行(使用当前配置文件)Px- 使用目标程序自身的配置文件执行Ux- 无限制执行(不受 AppArmor 管理)
四、管理配置文件模式
4.1 切换模式
# 将配置文件设为 enforce 模式
aa-enforce /etc/apparmor.d/usr.sbin.nginx
# 将配置文件设为 complain 模式
aa-complain /etc/apparmor.d/usr.sbin.nginx
# 禁用某个配置文件
aa-disable /etc/apparmor.d/usr.sbin.nginx
4.2 重新加载配置
# 重新加载所有配置文件
systemctl reload apparmor
# 重新加载指定配置文件
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
# 加载新配置文件
apparmor_parser -a /etc/apparmor.d/usr.local.bin.myapp
五、为 Nginx 创建 AppArmor 配置
5.1 自动生成配置文件
# 使用 aa-genprof 自动生成
aa-genprof nginx
此命令会启动交互式配置生成器,在另一个终端窗口中正常使用 Nginx,aa-genprof 会根据实际的系统调用生成配置文件。
5.2 手动创建 Nginx 配置文件
cat > /etc/apparmor.d/usr.sbin.nginx <<'EOF'
#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/openssl>
#include <abstractions/ssl_certs>
capability net_bind_service,
capability setuid,
capability setgid,
capability dac_override,
/usr/sbin/nginx mr,
/etc/nginx/ r,
/etc/nginx/** r,
/var/log/nginx/ rw,
/var/log/nginx/** rw,
/var/www/ r,
/var/www/** r,
/run/nginx.pid rw,
/var/lib/nginx/ r,
/var/lib/nginx/** rw,
network tcp,
network udp,
}
EOF
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
六、使用 aa-logprof 优化策略
当应用程序运行在 complain 模式下时,AppArmor 会记录所有本应被拒绝的操作。使用 aa-logprof 分析日志并更新策略:
# 将 Nginx 设为 complain 模式
aa-complain /etc/apparmor.d/usr.sbin.nginx
# 正常使用 Nginx 一段时间后,分析日志
aa-logprof
# 确认策略完善后切换到 enforce 模式
aa-enforce /etc/apparmor.d/usr.sbin.nginx
七、AppArmor 与 Docker
Docker 默认支持 AppArmor,并为容器应用默认策略。可以创建自定义策略:
# 查看 Docker 默认使用的 AppArmor 配置文件
docker inspect --format='{{.AppArmorProfile}}' container_name
# 使用自定义 AppArmor 配置文件运行容器
docker run --security-opt apparmor=my-custom-profile nginx
# 禁用容器的 AppArmor(不推荐)
docker run --security-opt apparmor=unconfined nginx
八、故障排查
8.1 查看日志
# 查看 AppArmor 拒绝日志
dmesg | grep apparmor
# 查看审计日志中的 AppArmor 记录
grep apparmor /var/log/syslog
# 使用 journalctl 查看
journalctl -k | grep apparmor
8.2 常见问题
如果应用程序无法正常运行,先切换到 complain 模式观察日志:
aa-complain /etc/apparmor.d/usr.sbin.nginx
systemctl restart nginx
# 观察 /var/log/syslog 中的 ALLOWED 记录
# 根据记录调整配置文件
aa-logprof
aa-enforce /etc/apparmor.d/usr.sbin.nginx
总结
AppArmor 是 Ubuntu 和 Debian 系统上强大而易用的强制访问控制工具,能够有效限制应用程序的权限范围,防止被攻破的应用危害整个系统。在搬瓦工 VPS 上建议为所有对外服务(如 Nginx、MySQL 等)配置 AppArmor 策略。更多安全加固方案可参考 SELinux 配置教程 和 CrowdSec 安全引擎。选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 进入官网购买。