我正在尝试为 SLAPD 配置 TLS,但它一直失败,并显示错误“TLS init def ctx failed”。我能够将错误追溯到守护进程尝试打开 CA 证书文件的系统调用 ( open("/etc/ssl/certs/ca.crt", O_RDONLY) = -1 EACCES
)。它使用 O_RDONLY 标志打开 CRT 文件并获取 EACCES 作为响应。但是,文件本身是所有人都可读的。此外,我运行后sudo -u openldap cat /etc/ssl/certs/ca.crt
文件输出正常(openldap 确实是守护进程的用户和组)。有什么建议吗?
编辑:
文件的权限为 644,所有者为 root:root,所有父目录的权限为 755,所有者为 root:root。我尝试将所有者/组更改为 openldap,还尝试将权限更改为 777。还尝试将文件移动到 /,但都没有成功。还尝试以 root 身份运行,即不使用 -u 和 -g 选项运行,但仍然失败。
strace 输出的最后几行:http://paste.ubuntu.com/1147299/
答案1
应用装甲可能拒绝访问该文件,请检查/var/log/kern.log
以确认这一点:
grep audit /var/log/kern.log
如果是这种情况,请编辑/etc/apparmor.d/usr.sbin.slapd
该文件并授予其权限。
/etc/ssl/certs/ r,
/etc/ssl/certs/* r,
sudo service apparmor reload
修改配置文件后运行。
答案2
这听起来很像 SELinux 或其他安全模块。selinux 启用了吗?您可以查看/var/log/audit/audit.log
指示 selinux 已阻止操作的消息。您也可以尝试通过运行以下命令禁用 selinux:
# setenforce 0
现在启动slapd
。如果可以运行,那么这就是你的问题,有两种方法可以解决它:
- 永久禁用 selinux。具体如何操作取决于您的发行版。
- 创建一个允许 slapd 读取证书的 selinux 策略。
您可以使用该audit2allow
程序来生成适当的 selinux 策略。
如果您拥有的是 AppArmor 而不是 SElinux,请参阅 mgorven 的回答以了解该怎么办。