我正在使用 php-fpm 运行需要访问的应用程序,例如/var/run/redis/redis-server.sock
在 aa-complain 或 aa-enforce 中,日志由主机(而不是容器)捕获,并出现在/var/log/auditd/audit/log
例如
type=AVC msg=audit(1572212584.295:206555): apparmor="DENIED" operation="connect" info="Failed name lookup - disconnected path" error=-13 namespace="root//lxd-containername_<var-lib-lxd>" profile="/usr/sbin/php-fpm7.2" name="run/redis/redis-server.sock" pid=20078 comm="php-fpm7.2" requested_mask="wr" denied_mask="wr" fsuid=100033 ouid=100113
如下规则:
/var/run/redis/redis-server.sock rw
无法防止拒绝此访问。我该如何允许此访问?
我不确定为什么日志消息错过了/var/
路径的前面。
编辑:看起来 lxd/lxc 没有问题,我已经在虚拟机中重新创建了它。
答案1
我至少可以回答为什么name=
没有前导斜杠以及这样做有什么副作用。内核不会强制打开句柄以包含前导斜杠,apparmor 存在哪些问题。解决方法是将attach_disconnected
标志添加到进程的 apparmor 配置文件中。它看起来像...
profile usr.local.bin.taco_tuesday flags=(attach_disconnected) {
[stuff]
/run/redis/redis-server.sock rw
}
使用/run
而不是/var/run
因为/var/run
通常是 的符号链接/run
,并且 AppArmor 仅在真实路径上强制执行。