当你看到AppArmor的配置文件时是不是感觉,这么麻烦。如果要手动配置的话我肯定直接卸载该服务了,永不使用它,大不在让机器节省点资源,空间。
自动生成配置文件(懒人必备)
使用 aa-genprof 工具可以自动捕获程序运行行为、一键生成合规配置文件,无需手动编写规则。该命令属于 apparmor-utils 工具集,Ubuntu 26.04 默认未预装,缺失会报 command not found,需手动安装。
# 若提示 command not found,先安装工具包(Ubuntu26.04必备)
sudo apt update && sudo apt install apparmor-utils -y
# 生成 /usr/sbin/nginx 的配置
sudo aa-genprof /usr/sbin/nginx
会出现以下提示:
注意以下信息,真实的记录,当执行命令sudo aa-genprof /usr/sbin/nginx后,会出一以一段信息,跟着提示操作即可。我直接告诉你现在该做什么:
第一步:不要动这个窗口!保持它开着
这个窗口必须保持运行,你不能关掉它。

第二步:新开一个终端窗口,启动 / 重启 Nginx
打开另一个终端,执行:
就是要把nginx服务运行起来,让它正常服务。
sudo systemctl restart nginx
然后可以简单访问一下你的网站,让 Nginx 正常跑一会儿:
可以这样测试是否正常
curl localhost
目的:让 AppArmor 捕获 Nginx 的行为。
第三步:回到 aa-genprof 窗口,按 S
回到这个界面:
[扫描系统日志以查找 AppArmor 事件(S)] / 完成(F)
直接按键盘 S,然后回车
它就会开始扫描日志,自动生成权限规则。
第四步:一路按命令提示走
扫描后会出现一堆允许 / 拒绝的选项,全部选允许(Allow):
- 遇到
(A)llow / (D)eny / (I)gnore直接按 A
全部处理完后,最后会问你是否保存:
保存配置文件吗?
输入 y 回车保存。
最后:切换回强制模式
生成完成后执行:
sudo aa-enforce /usr/sbin/nginx
搞定!
超简版总结(你可以直接照着做)
启用:sudo aa-enforce /usr/sbin/nginx
保持当前 aa-genprof 窗口打开
新开终端:sudo systemctl restart nginx
回到本窗口:按 S 回车
全部选 A 允许
保存:y
附上执行上述命令时真实的过程,这里都是选择A允许,因为不这样服务可能不能正常运行。
swper@Mt:~$ sudo aa-genprof /usr/sbin/nginx
正在在 /etc/apparmor.d 中更新 AppArmor 配置文件。
Writing updated profile for /usr/sbin/nginx.
正在将 /usr/sbin/nginx 设置为投诉模式。在开始之前,您可能希望检查
您希望限制的应用程序的配置文件
是否已经存在。有关详细信息,请参考
以下维基页面:
https://gitlab.com/apparmor/apparmor/wikis/Profiles分析中: /usr/sbin/nginx
请启动要在另一个窗口中分析的应用程序,并立即执行其功能。
完成后,选择下面的“扫描”选项,以扫描系统日志中的AppArmor事件。
对于每个 AppArmor 事件,您将有机会选择是应允许还是拒绝访问。
[扫描系统日志以查找 AppArmor 事件(S)] / 完成(F)
从 /var/log/syslog 读取日志条目。
投诉模式更改:配置文件: /usr/sbin/nginx
Capability: dac_override
严重性: 9[1 – capability dac_override,]
允许(A) / [拒绝(D)] / 忽略(I) / 审计(T) / 中止(R) / 完成(F)
正在添加 capability dac_override, 到配置文件配置文件: /usr/sbin/nginx
Capability: net_bind_service
严重性: 8[1 – include ]
2 – capability net_bind_service,
允许(A) / [拒绝(D)] / 忽略(I) / 审计(T) / 中止(R) / 完成(F)
正在添加 include 到配置文件配置文件: /usr/sbin/nginx
Capability: setgid
严重性: 9[1 – include ]
2 – include
3 – include
4 – capability setgid,
允许(A) / [拒绝(D)] / 忽略(I) / 审计(T) / 中止(R) / 完成(F)
正在添加 include 到配置文件配置文件: /usr/sbin/nginx
Capability: setuid
严重性: 9[1 – include ]
2 – include
3 – capability setuid,
允许(A) / [拒绝(D)] / 忽略(I) / 审计(T) / 中止(R) / 完成(F)
正在添加 include 到配置文件配置文件: /usr/sbin/nginx
路径: /var/www/html/index.nginx-debian.html
New Mode: r
严重性: 未知[1 – include ]
2 – /var/www/html/index.nginx-debian.html r,
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 中止(R) / 完成(F)
正在添加 include 到配置文件配置文件: /usr/sbin/nginx
路径: /proc/sys/kernel/random/boot_id
New Mode: owner r
严重性: 6[1 – owner /proc/sys/kernel/random/boot_id r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /proc/sys/kernel/random/boot_id r, 到配置文件配置文件: /usr/sbin/nginx
路径: /run/systemd/userdb/io.systemd.DynamicUser
New Mode: owner rw
严重性: 未知[1 – owner /run/systemd/userdb/io.systemd.DynamicUser rw,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /run/systemd/userdb/io.systemd.DynamicUser rw, 到配置文件配置文件: /usr/sbin/nginx
路径: /run/systemd/userdb/org.gnome.DisplayManager
New Mode: owner rw
严重性: 未知[1 – owner /run/systemd/userdb/org.gnome.DisplayManager rw,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /run/systemd/userdb/org.gnome.DisplayManager rw, 到配置文件配置文件: /usr/sbin/nginx
路径: /run/systemd/userdb/
New Mode: owner r
严重性: 未知[1 – owner /run/systemd/userdb/ r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /run/systemd/userdb/ r, 到配置文件配置文件: /usr/sbin/nginx
路径: /var/log/nginx/access.log
New Mode: owner w
严重性: 8[1 – owner /var/log/nginx/access.log w,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /var/log/nginx/access.log w, 到配置文件配置文件: /usr/sbin/nginx
路径: /var/log/nginx/access.log
Old Mode: owner w
New Mode: w
严重性: 8[1 – /var/log/nginx/access.log w,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 中止(R) / 完成(F)
正在添加 /var/log/nginx/access.log w, 到配置文件
已删除 1 个以前的匹配配置文件条目。配置文件: /usr/sbin/nginx
路径: /var/log/nginx/error.log
New Mode: w
严重性: 8[1 – /var/log/nginx/error.log w,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 中止(R) / 完成(F)
正在添加 /var/log/nginx/error.log w, 到配置文件配置文件: /usr/sbin/nginx
路径: /run/nginx.pid
New Mode: owner rw
严重性: 未知[1 – owner /run/nginx.pid rw,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /run/nginx.pid rw, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/sites-available/default
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/sites-available/default r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/sites-available/default r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/sites-enabled/
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/sites-enabled/ r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/sites-enabled/ r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/fastcgi_params
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/fastcgi_params r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/fastcgi_params r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/fastcgi.conf
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/fastcgi.conf r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/fastcgi.conf r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/snippets/fastcgi-php.conf
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/snippets/fastcgi-php.conf r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/snippets/fastcgi-php.conf r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/conf.d/blog.conf
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/conf.d/blog.conf r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/conf.d/blog.conf r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/conf.d/
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/conf.d/ r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/conf.d/ r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/mime.types
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/mime.types r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/mime.types r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/modules-enabled/
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/modules-enabled/ r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/modules-enabled/ r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/group
New Mode: owner r
严重性: 4[1 – owner /etc/group r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/group r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/passwd
New Mode: owner r
严重性: 4[1 – owner /etc/passwd r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/passwd r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nsswitch.conf
New Mode: owner r
严重性: 未知[1 – owner /etc/nsswitch.conf r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nsswitch.conf r, 到配置文件配置文件: /usr/sbin/nginx
路径: /etc/nginx/nginx.conf
New Mode: owner r
严重性: 未知[1 – owner /etc/nginx/nginx.conf r,]
允许(A) / [拒绝(D)] / 忽略(I) / (G)lob / Glob with (E)xtension / 新建(N) / 审计(T) / 关闭所有者权限(O) / 中止(R) / 完成(F)
正在添加 owner /etc/nginx/nginx.conf r, 到配置文件配置文件: /usr/sbin/nginx
Accesses: send
Network Family: inet
Socket Type: stream
Local: {‘ip’: ‘127.0.0.1’, ‘port’: 80}
Peer: {‘ip’: ‘127.0.0.1’, ‘port’: 60982}[1 – include ]
2 – include
3 – network (send) inet stream ip=127.0.0.1 port=80 peer=(ip=127.0.0.1 port=60982),
允许(A) / [拒绝(D)] / 忽略(I) / 审计(T) / 中止(R) / 完成(F)
正在添加 include 到配置文件
强制模式更改:= Changed Local Profiles =
以下本地配置文件已更改。你想保存它们吗?
[1 – /usr/sbin/nginx]
保存更改(S) / 保存选择的配置文件(T) / [查看更改(V)] / 查看更改黑白并清理配置文件(C) / 中止(R)
Writing updated profile for /usr/sbin/nginx.分析中: /usr/sbin/nginx
请启动要在另一个窗口中分析的应用程序,并立即执行其功能。
完成后,选择下面的“扫描”选项,以扫描系统日志中的AppArmor事件。
对于每个 AppArmor 事件,您将有机会选择是应允许还是拒绝访问。
[扫描系统日志以查找 AppArmor 事件(S)] / 完成(F)
正在设置 /usr/sbin/nginx 到强制模式重启 AppArmor 到强制模式
请考虑贡献您的新配置文件!
参阅以下 wiki 页面获取更多信息:
https://gitlab.com/apparmor/apparmor/wikis/Profiles已完成为 /usr/sbin/nginx 生成配置文件。
最常用的 AppArmor 命令
# 查看状态
aa-status
# 生成配置文件
aa-genprof /usr/sbin/nginx
# 切换到投诉模式(只记录不拦截)
aa-complain /usr/sbin/nginx
# 切换到强制模式(正式启用)
aa-enforce /usr/sbin/nginx
# 禁用某个程序的规则
aa-disable /usr/sbin/nginx
# 扫描日志更新规则
aa-logprof
正确命令(查看 Nginx 的 AppArmor 状态)
#用 grep 过滤最实用:
sudo aa-status | grep -E 'nginx|mode'
#要只看进程部分:
sudo aa-status --filter.exe=/usr/sbin/nginx --show=processes
filter.exe=:只过滤进程列表,不过滤 profile 清单(设计如此)- 想清爽:用
grep nginx或--show=processes
至此, aa-genprof 工具成功生成 Nginx 配置。