AppArmor 常见问题和快速指南

2025-08-14 18:21:00
丁国栋
原创 9
摘要:本文记录 AppArmor 的一些常见问题笔记。

AppArmor 是一种保护机制,这个保护机制让人又爱又恨,需要正确掌握和遇到问题时经常想到它。

例如你把 MySQL 的数据目录移动到了其他目录,而又把这个目录链接到 /var/lib/mysql,启动 MySQL 服务时依然报错 [Server] Can't create test file 或 OS errno 13 - Permission denied 或 [Server] Failed to create file 等,这都可能是 AppArmor 在拦截。

在这个例子中我们可以找到  /etc/apparmor.d/usr.sbin.mysqld 编辑添加我们需要允许 mysqld 访问的目录。


# Allow data dir access
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /data/mysql/ r,
  /data/mysql/** rwk,


在修改配置文件后,需要重新加载 AppArmor。

一般两种方法:


systemctl reload apparmor
apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
如果不重新加载,AppArmor 可能依然会拦截。


---

AppArmor 它在拦截某个进程时,有时并不记录日志(这点令人不解)。例如我们以为可以使用命令 journalctl -u apparmor --no-pager 查看它的拦截日志,但并不能在这里找到。这时我们需要去查看内核日志,使用 dmesg 命令。

例如我们通过 dmesg 命令可以查找到以下信息:


audit: type=1400 audit(1755139115.947:235): apparmor="DENIED" operation="open" class="file" profile="/usr/sbin/mysqld" name="/data/mysql/auto.cnf" pid=10385 comm="mysqld" requested_mask="wrc" denied_mask="wrc" fsuid=107 ouid=107
这样就很容易确认是 AppArmor 拦截的了。也可以直接使用 dmesg | grep 'apparmor="DENIED"' 来查找。


--

发表评论
博客分类