AppArmor教程:一步步教你怎么正确生成 Nginx 配置

当你看到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后,会出一以一段信息,跟着提示操作即可。我直接告诉你现在该做什么


第一步:不要动这个窗口!保持它开着

这个窗口必须保持运行,你不能关掉它。

AppArmor通过aa-genprof 窗口配置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 配置。

本文首发于 58Linux技术博客,专注Ubuntu桌面使用、Linux服务器运维与网站搭建实战。
       本系列的一部分

Linux服务器

Post 27 of 27

发表评论

粤ICP备10052831号 | © 2026 58Linux 技术笔记. All Rights Reserved. | 联系我们 | 关于本站
本站内容开放共享,仅供学习交流 | 专注 Ubuntu & Linux 实战教程
Built with GeneratePress