如何编写AppArmor配置文件?
美国、香港服务器
如何编写AppArmor配置文件?
12-29 来源:
编写 AppArmor 配置文件的核心是遵循 “最小权限原则”,精准定义进程可访问的资源(文件、网络、系统调用等),拒绝所有未显式允许的操作。以下是适配 Ubuntu 24.04 的完整编写指南,包含语法规则、模板示例、调试技巧,覆盖绝大多数场景(通用程序、脚本、服务)。
一、先掌握 AppArmor 配置文件核心语法
AppArmor 配置文件采用 “配置块 + 权限规则” 结构,核心语法需熟记:
语法元素 说明 示例
配置文件命名 进程绝对路径替换 / 为 .(如 /usr/sbin/nginx → usr.sbin.nginx) /etc/apparmor.d/usr.sbin.nginx
核心配置块 [进程路径] { ... },关联要限制的进程(必须是绝对路径) /usr/local/bin/myapp { ... }
权限标记 定义资源访问权限(组合使用) r(读)、w(写)、k(锁定)、m(内存执行)
路径匹配 通配符简化路径规则 /**(递归子目录)、*(当前目录文件)、?.log(单字符匹配)
网络规则 限制进程网络行为 network tcp(允许 TCP)、deny network all(禁止所有网络)
capability 限制进程系统权限(如绑定端口、提权) capability net_bind_service(允许绑定 80/443)
拒绝规则 deny 前缀显式拒绝访问(优先级高于允许规则) deny /etc/shadow r(拒绝读密码文件)
常用权限标记速查表(必记)
标记 含义 适用场景
r 只读 配置文件、系统库、程序自身
w 只写 日志写入、数据存储
k 文件锁定 日志、数据库文件(必需)
m 内存执行(mmap) 可执行文件(如 /usr/sbin/nginx)
x 执行 脚本、二进制程序
rwk 读 + 写 + 锁定 业务数据目录、日志目录
二、通用配置文件模板(可直接复用)
以下是适用于绝大多数程序的基础模板,按 “必选 + 可选” 分块,注释标注用途,可按需删减:
apparmor
# 1. 关联进程可执行文件(必选:绝对路径必须精准)
/绝对路径/到/进程 {
# ========== 必选:系统核心依赖(所有进程都需要) ==========
# 系统库(只读,支撑程序运行)
/lib/** r,
/usr/lib/** r,
/lib64/** r,
/usr/lib64/** r,
# 进程自身(读+内存执行,必选)
/绝对路径/到/进程 mr,
# ========== 可选:业务专属资源(按需开放) ==========
# 配置文件目录(只读)
/etc/程序名/** r,
# 数据存储目录(读+写+锁定,根据业务调整)
/var/lib/程序名/** rwk,
# 日志目录(日志写入必须加k)
/var/log/程序名/** rwk,
# 临时文件目录(可选)
/tmp/ rw,
/tmp/程序名.* rwk,
# ========== 可选:网络权限(默认禁止,需则开放) ==========
# 仅允许本地TCP通信(如127.0.0.1)
# network tcp addr=127.0.0.1,
# 允许所有TCP通信(外网访问)
# network tcp,
# 禁止所有网络(推荐默认)
deny network all,
# ========== 可选:系统权限(最小化) ==========
# 允许绑定80/443端口(需则加)
# capability net_bind_service,
# 拒绝所有高危系统权限(必选)
deny capability sys_admin,
deny capability setuid,
deny capability setgid,
# ========== 必选:敏感目录拒绝(防越权) ==========
deny /etc/shadow r, # 拒绝读密码文件
deny /root/** rw, # 拒绝访问root目录
deny /home/** rw, # 拒绝访问用户目录
deny /bin/bash r, # 拒绝调用shell(防提权)
# ========== 必选:兜底规则(拒绝未显式允许的写入) ==========
deny /** w,
}
三、不同类型程序的配置文件示例(直接套用)
示例 1:二进制程序(如 /usr/local/bin/myapp)
apparmor
/usr/local/bin/myapp {
# 系统核心依赖
/lib/** r,
/usr/lib/** r,
/usr/local/bin/myapp mr,
# 业务资源
/opt/myapp/config.ini r,
/opt/myapp/data/** rwk,
/var/log/myapp.log rwk,
# 网络与系统权限
deny network all,
deny capability sys_admin,
# 敏感目录与兜底
deny /etc/shadow r,
deny /** w,
}
示例 2:Python 脚本(如 /opt/my_script.py)
需额外开放 Python 解释器和依赖库路径:
apparmor
/opt/my_script.py {
# Python 解释器(必选,根据系统版本调整)
/usr/bin/python3.12 mr,
# Python 标准库(只读)
/usr/lib/python3.12/** r,
# 第三方依赖库(pip安装的包)
/usr/local/lib/python3.12/dist-packages/** r,
# 脚本自身与业务资源
/opt/my_script.py r,
/opt/my_script/data/** rwk,
/var/log/my_script.log rwk,
# 禁止网络与敏感目录
deny network all,
deny /etc/shadow r,
deny /** w,
}
示例 3:系统服务(如 Nginx)
需开放端口绑定、网站根目录权限:
apparmor
/usr/sbin/nginx {
# 系统核心依赖
/lib/** r,
/usr/lib/** r,
/usr/sbin/nginx mr,
# 业务资源
/etc/nginx/** r,
/var/www/html/** r,
/var/log/nginx/** rwk,
/var/run/nginx.pid rw,
# 网络与系统权限
network tcp,
capability net_bind_service, # 允许绑定80/443
deny capability sys_admin,
# 敏感目录与兜底
deny /etc/shadow r,
deny /** w,
}
四、编写配置文件的关键步骤(从 0 到 1)
步骤 1:梳理进程依赖(避免权限不足)
编写前先明确进程的 “必需资源”,否则程序会崩溃:
bash
运行
# 1. 查找进程绝对路径
which 程序名 # 如 which nginx → /usr/sbin/nginx
# 2. 二进制程序查依赖库
ldd /usr/local/bin/myapp
# 3. 查看程序运行时的文件访问(调试用)
sudo strace -e open,openat /usr/local/bin/myapp # 输出所有访问的文件路径
步骤 2:创建配置文件
bash
运行
# 按命名规则创建(替换/为.)
sudo nano /etc/apparmor.d/路径替换后的名称
# 示例:/usr/local/bin/myapp → sudo nano /etc/apparmor.d/usr.local.bin.myapp
步骤 3:写入规则并检查语法
bash
运行
# 编译配置文件(检查语法错误,-v 显示详情)
sudo apparmor_parser -vW /etc/apparmor.d/配置文件名
# 常见错误:花括号/逗号缺失、路径错误、权限标记错误
步骤 4:调试规则(必做!避免上线崩溃)
新配置先在 complain 模式运行,收集合法权限:
bash
运行
# 切换为投诉模式(仅记录日志,不拦截)
sudo aa-complain /etc/apparmor.d/配置文件名
# 运行程序并触发所有业务操作(如读写数据、联网)
/绝对路径/到/进程
# 查看被拒绝的合法权限
sudo grep -i apparmor /var/log/syslog | grep 程序名
根据日志补充缺失的权限(例如日志显示 denied_mask="r" 对应 /opt/myapp/config.ini,则添加 /opt/myapp/config.ini r,)。
步骤 5:切换为强制模式(生产环境)
bash
运行
sudo aa-enforce /etc/apparmor.d/配置文件名
sudo systemctl reload apparmor
五、常见错误与避坑指南
错误类型 表现 解决方法
路径错误 程序启动失败 确保配置文件中进程路径、资源路径是绝对路径
遗漏 k 权限 日志无法写入 将 /var/log/xxx/** rw 改为 rwk
未开放 Python 库路径 脚本导入模块失败 添加 /usr/lib/python3.12/** r
禁止了必需的 network 程序联网失败 按需添加 network tcp
兜底规则过严 正常文件写入失败 检查日志,将合法写入路径加入允许规则
六、生产环境编写最佳实践
最小权限:只开放 “必需” 的资源,例如:
无需联网的程序,必加 deny network all;
无需访问 /home 的程序,必加 deny /home/** rw。
显式拒绝高危操作:
拒绝调用 shell(deny /bin/bash r),防止提权;
拒绝修改系统时间、提权等 capability(deny capability setuid)。
规则分层:
通用规则(系统库、敏感目录拒绝)写在顶部;
业务规则(数据、日志)写在中间;
兜底规则写在最后。
版本控制:将配置文件纳入 Git 管理,修改后记录变更(便于回滚)。
避免重复规则:同一路径的权限只定义一次(重复定义可能导致冲突)。
七、配置文件调试工具
工具 用途 示例命令
apparmor_parser 编译 / 加载配置文件(检查语法) sudo apparmor_parser -r /etc/apparmor.d/xxx
aa-status 查看已加载的规则 `aa-status grep 程序名 `
aa-complain/aa-enforce 切换规则模式 sudo aa-complain /etc/apparmor.d/xxx
strace 追踪进程的文件 / 系统调用(梳理依赖) sudo strace -e open /usr/local/bin/myapp
grep apparmor /var/log/syslog 查看拦截日志 sudo grep -i apparmor /var/log/syslog
总结
编写 AppArmor 配置文件的核心逻辑:先明确进程依赖 → 按模板写最小权限规则 → 编译调试补全缺失权限 → 强制模式上线。关键是 “先调试后强制”,通过 complain 模式收集进程的合法需求,避免规则过严导致业务中断,最终实现 “进程仅能访问必需资源” 的安全目标。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快