我正在尝试设置 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 的优秀指南