Unbound 似乎无法读取 DNS-over-TLS 的证书文件,并显示“权限被拒绝”

Unbound 似乎无法读取 DNS-over-TLS 的证书文件,并显示“权限被拒绝”

我正在尝试设置 DNS-over-TLS (DoT)未绑定解析器。即,我正在尝试加密客户端和非绑定之间的连接,我没有尝试加密非绑定的解析器→上游连接,互联网上的许多指南都在讨论这一点。

我在配置文件中有以下内容,如手册页中所述,并且还描述了这里

 server:
   interface: 0.0.0.0@853

   tls-port: 853
   tls-service-key: "/etc/letsencryp/live/DOMAIN/privkey.pem"
   tls-service-pem: "/etc/letsencryp/live/DOMAIN/fullchain.pem"

但是,当我尝试重新启动 unbound 时,我收到证书文件上被拒绝的以下权限。

package-helper[778]: /var/lib/unbound/root.key has content
package-helper[778]: success: the anchor is ok
unbound[813]: [1586107523] unbound[813:0] error: error for cert file: /etc/letsencryp/live/DOMAIN/fullchain.pem
unbound[813]: [1586107523] unbound[813:0] error: error in SSL_CTX use_certificate_chain_file crypto error:0200100D:system library:fopen:Permission denied
unbound[813]: [1586107523] unbound[813:0] error: and additionally crypto error:20074002:BIO routines:file_ctrl:system lib
unbound[813]: [1586107523] unbound[813:0] error: and additionally crypto error:140DC002:SSL routines:use_certificate_chain_file:system lib
unbound[813]: [1586107523] unbound[813:0] fatal error: could not set up listen SSL_CTX
systemd[1]: unbound.service: Main process exited, code=exited, status=1/FAILURE

我尝试将文件移出此目录,并尝试将root或设置unbound为所有者。我唯一能使它起作用的方法是将文件直接放在目录中/etc/unbound/。指向 letsencrypt 管理文件的同一位置的符号链接也不起作用。这并不理想,因为每当发生证书续订时,我都需要定期将证书文件从 letsencrypt 目录中复制出来和/或不必要地重新启动 DNS 解析器。

我已经彻底检查过,配置文件、默认设置或二进制文件中均未配置 chroot。事实上,Debian 中已默认禁用 chroot(错误报告

为什么 unbound 无法读取文件,即文件unbound:unbound所有者为:组,并且权限设置为可读?

如果它有任何重要性的话,我正在 Debian buster (10) 上使用未绑定版本 1.9.0-2+deb10u1。

答案1

这本身不是permission问题,因为 Unbound 在放弃权限之前会以 root 身份读取文件。您可以保留 letsencrypt 证书文件,root:root它们仍会正常工作。

阻止 unbound 读取证书的原因是 AppArmor。Debian(和许多其他发行版)出于安全目的限制服务器二进制文件。您可以在以下位置查看默认的 AppArmor 配置/etc/apparmor.d/usr.sbin.unbound,它不允许读取/etc/unbound、(通过指令)和其他一些目录之外的/var/lib/unbound/内容。由于您的 letsencrypt 证书位于另一个目录中,因此即使以 root 身份运行,unbound 也无法访问它。/etc/openssl#include <abstractions/openssl>

您可以通过允许 unbound 读取证书文件(以及指向它们的“实时”链接)来解决此问题。这是 AppArmor 的本地覆盖配置,该文件包含在主文件中。

$ cat /etc/apparmor.d/local/usr.sbin.unbound
/etc/letsencrypt/archive/** r,
/etc/letsencrypt/live/** r,

一旦更改了此文件,就需要通过运行以下命令来激活更改:

$ apparmor_parser --replace /etc/apparmor.d/usr.sbin.unbound

一旦您按照这些步骤操作,unbound 在读取密钥材料时就不会遇到任何问题。

您可以从以下位置获取有关 AppArmor 的更多信息Ubuntu 的优秀指南

相关内容