12- AppArmor 配置与策略编写 🛡️
前提条件 ✅
- 已完成前置章节:SSH 安全加固、fail2ban、内核参数调优
- 以 ops 用户登录(具有 sudo 权限)
- 系统运行在 Debian 12 Bookworm(AppArmor 默认启用)
- 虚拟机环境:VMware Workstation Pro
详细步骤 🛠️
- 检查 AppArmor 当前状态
AppArmor 在 Debian 12 中默认启用并处于 enforce 模式。
sudo aa-status
# 输出示例:
# apparmor module is loaded.
# 20 profiles are loaded.
# 18 profiles are in enforce mode.
# ...
# 2 profiles are in complain mode.
确认内核参数:
cat /sys/module/apparmor/parameters/enabled # 应为 Y
-
常用 AppArmor 命令
sudo aa-status --verbose # 详细状态 sudo aa-enabled # 是否启用 sudo aa-complain /usr/sbin/sshd # 将 sshd 策略切换到 complain(日志但不阻止) sudo aa-enforce /usr/sbin/sshd # 恢复 enforce 模式 sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.sshd # 重新加载单个策略 sudo systemctl restart apparmor # 重启整个 AppArmor 服务 -
查看日志(AppArmor 拒绝记录)
AppArmor 拒绝事件记录在系统日志中:sudo tail -f /var/log/syslog | grep -i apparmor sudo journalctl -f -u apparmor sudo journalctl -u apparmor --since "today" | grep DENIED -
创建或自定义简单策略(生产实用示例)
示例:为一个自定义脚本 /opt/myapp/run.sh 创建限制策略,防止它访问敏感路径。
创建策略文件:
sudo nano /etc/apparmor.d/opt.myapp.run
基本策略内容(限制读写、禁止网络等):
#include <tunables/global>
profile opt.myapp.run flags=(attach_disconnected) {
#include <abstractions/base>
# 允许执行自身和基本命令
/opt/myapp/run.sh mr,
/bin/bash ix,
/usr/bin/env ix,
# 允许读写自己的日志和工作目录
/opt/myapp/** rw,
/var/log/myapp.log rw,
# 禁止访问敏感文件
deny /etc/passwd r,
deny /etc/shadow r,
deny /root/** r,
deny /home/** r,
# 禁止网络外出(视需求)
# deny network,
# 其他常见抽象
#include <abstractions/ssl_certs>
}
加载并测试:
sudo apparmor_parser -r /etc/apparmor.d/opt.myapp.run
sudo aa-enforce /opt/myapp/run
sudo aa-status | grep myapp
运行测试脚本,观察是否被阻断:
/opt/myapp/run.sh
sudo tail /var/log/syslog | grep DENIED
- 常用生产策略调整
- sshd 策略(已默认存在):/etc/apparmor.d/usr.sbin.sshd
可添加自定义规则,如允许特定端口或限制子进程 - mysql/mariadb:/etc/apparmor.d/usr.sbin.mysqld
常需添加自定义数据目录访问权限 -
docker(后续章节):AppArmor 默认对容器生效,可用 aa-disable docker-default 临时关闭测试
-
切换 complain 模式排查问题
当服务被 AppArmor 意外阻断时,先切换到 complain 观察:sudo aa-complain /usr/bin/containerd # 观察日志 → 补充规则 → 再 enforce
实践任务 🎯
- 用
aa-status检查当前 enforce 和 complain 模式的策略数量 - 将 sshd 策略临时切换到 complain 模式,尝试重启 ssh 服务观察差异
- 创建一个简单 AppArmor 策略文件(如上面示例),加载并 enforce,测试脚本是否被限制访问 /etc/passwd
- 查看 AppArmor 拒绝日志,找到至少一条 DENIED 记录并分析原因
自测问题 ❓
- AppArmor 的 enforce 模式和 complain 模式的主要区别是什么?
- 如何重新加载单个 AppArmor 策略而不重启整个服务?
- AppArmor 拒绝事件主要记录在哪个日志文件或 journal 中?
- 生产环境中遇到服务启动失败但日志显示 AppArmor DENIED 时,第一步推荐操作是什么?
总结 📌
AppArmor 是 Debian 默认的强制访问控制(MAC)机制,轻量且易用。
通过 enforce/complain 模式 + 自定义策略,可以显著提升单个进程的安全边界。
本章建立的自定义策略编写流程,将在后续数据库、Web 服务、容器章节中反复用到。