跳转至

12- AppArmor 配置与策略编写 🛡️

前提条件 ✅

  • 已完成前置章节:SSH 安全加固、fail2ban、内核参数调优
  • 以 ops 用户登录(具有 sudo 权限)
  • 系统运行在 Debian 12 Bookworm(AppArmor 默认启用)
  • 虚拟机环境:VMware Workstation Pro

详细步骤 🛠️

  1. 检查 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

  1. 常用 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 服务
    

  2. 查看日志(AppArmor 拒绝记录)
    AppArmor 拒绝事件记录在系统日志中:

    sudo tail -f /var/log/syslog | grep -i apparmor
    sudo journalctl -f -u apparmor
    sudo journalctl -u apparmor --since "today" | grep DENIED
    

  3. 创建或自定义简单策略(生产实用示例)
    示例:为一个自定义脚本 /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

  1. 常用生产策略调整
  2. sshd 策略(已默认存在):/etc/apparmor.d/usr.sbin.sshd
    可添加自定义规则,如允许特定端口或限制子进程
  3. mysql/mariadb:/etc/apparmor.d/usr.sbin.mysqld
    常需添加自定义数据目录访问权限
  4. docker(后续章节):AppArmor 默认对容器生效,可用 aa-disable docker-default 临时关闭测试

  5. 切换 complain 模式排查问题
    当服务被 AppArmor 意外阻断时,先切换到 complain 观察:

    sudo aa-complain /usr/bin/containerd
    # 观察日志 → 补充规则 → 再 enforce
    

实践任务 🎯

  1. aa-status 检查当前 enforce 和 complain 模式的策略数量
  2. 将 sshd 策略临时切换到 complain 模式,尝试重启 ssh 服务观察差异
  3. 创建一个简单 AppArmor 策略文件(如上面示例),加载并 enforce,测试脚本是否被限制访问 /etc/passwd
  4. 查看 AppArmor 拒绝日志,找到至少一条 DENIED 记录并分析原因

自测问题 ❓

  1. AppArmor 的 enforce 模式和 complain 模式的主要区别是什么?
  2. 如何重新加载单个 AppArmor 策略而不重启整个服务?
  3. AppArmor 拒绝事件主要记录在哪个日志文件或 journal 中?
  4. 生产环境中遇到服务启动失败但日志显示 AppArmor DENIED 时,第一步推荐操作是什么?

总结 📌

AppArmor 是 Debian 默认的强制访问控制(MAC)机制,轻量且易用。
通过 enforce/complain 模式 + 自定义策略,可以显著提升单个进程的安全边界。
本章建立的自定义策略编写流程,将在后续数据库、Web 服务、容器章节中反复用到。