我在 Debian11 上使用 chroot 安装了 bind9,如本教程所述:https://wiki.debian.org/Bind9#Debian_Jessie_and_later
它工作正常,但一旦我打开动态区域更新,它就会失败,并在系统日志中显示以下原因:
Jul 18 19:22:52 NS kernel: [12161.968582] audit: type=1400 audit(1658164972.109:107): apparmor="DENIED" operation="open" profile="named" name="/var/bind9/chroot/" pid=18104 comm="named" requested_mask="r" denied_mask="r" fsuid=106 ouid=0
我认为这可能是缺少一些选项,/etc/apparmor.d/local/usr.sbin.named
所以我添加了/var/bind9/chroot
它,现在文件看起来像这样:
/var/bind9/chroot/** r,
/var/bind9/chroot/etc/bind/** r,
/var/bind9/chroot/usr/** rw,
/var/bind9/chroot/var/** rw,
/var/bind9/chroot/dev/** rw,
/var/bind9/chroot/run/** rw,
然后我重新启动了apparmor
服务named
,但问题还是一样。如果我查看 withapparmor_status
命令,它会带来正确的命名进程 ID,因此不会有其他错误进程在运行。期待这一点,chrootednamed
工作正常。如果我关闭此配置文件的强制执行或完全禁用apparmor
,则动态更新也可以工作,但我想以某种方式修复此问题。
更新:
如果我修改/etc/apparmor.d/local/usr.sbin.named
为:
/var/bind9/chroot/** r,
/var/bind9/chroot/etc/bind/** rw,
/var/bind9/chroot/usr/** rw,
/var/bind9/chroot/var/** rw,
/var/bind9/chroot/dev/** rw,
/var/bind9/chroot/run/** rw,
然后动态区域更新就可以工作了。但仍然会收到我之前注意到的错误消息,并在触发动态区域更新时准确收到该错误消息。为什么我收到这些消息有点烦人。
答案1
日志消息(已换行以方便阅读)
Jul 18 19:22:52 NS kernel: [12161.968582] audit: type=1400 audit(1658164972.109:107): \
apparmor="DENIED" operation="open" profile="named" name="/var/bind9/chroot/" pid=18104 \
comm="named" requested_mask="r" denied_mask="r" fsuid=106 ouid=0
指示该named
进程试图读取该目录/var/bind9/chroot
但被拒绝。
规则示例如下man 5 apparmor.d
(强调我的):
当 AppArmor 查找目录时,所查找的路径名将以斜杠结尾(例如,
/var/tmp/
);否则它不会以斜杠结尾。只有与尾部斜杠匹配的规则才会匹配目录。一些例子,/tmp/
没有一个与目录本身匹配, 是:/tmp/* Files directly in /tmp. /tmp/*/ Directories directly in /tmp. /tmp/** Files and directories anywhere underneath /tmp. /tmp/**/ Directories anywhere underneath /tmp.
换句话说,你的第一条规则
/var/bind9/chroot/** r,
只允许读取文件在/var/bind9/chroot/
目录中,但是读取目录列表不允许。这显然就是我们named
想要做的。
要修复它,您需要添加一行:
/var/bind9/chroot/ r,
因为**
不会匹配空字符串。