在OpenVPN 的加固文章中,建议服务器守护进程在 Linux 上启动后放弃其权限:
OpenVPN 经过精心设计,允许在初始化后删除 root 权限,并且此功能应始终在 Linux/BSD/Solaris 上使用。如果没有 root 权限,正在运行的 OpenVPN 服务器守护程序对攻击者的吸引力要小得多。
他们建议设置以下指令:
user nobody
group nobody
我假设这意味着守护程序将nobody
在启动完成后运行。
但是,OpenVPN 在运行时会访问几个文件,尤其是 CRL 文件:
当在 OpenVPN 中使用 crl-verify 选项时,每当新客户端连接或现有客户端重新协商 SSL/TLS 连接(默认每小时一次)时,都会重新读取 CRL 文件。这意味着您可以在 OpenVPN 服务器守护程序运行时更新 CRL 文件,并使新的 CRL 对新连接的客户端立即生效。
所以我很自然地担心这两个功能是否不兼容——如果守护进程在启动后放弃特权,它如何在运行时读取/etc/openvpn/server/crl.pem
(所有者root:root
、模式0600
;SELinux 强制)?
- 如果守护进程在运行时确实无法访问 CRL 文件,有没有好的方法可以规避这个问题?
- 如果守护程序可以在运行时访问 CRL 文件,我想知道这是怎么可能的。
操作系统是 RHEL8.5 x86_64,以防万一。
与许多放弃特权的应用程序一样,OpenVPN 在仍然具有 root 权限时会打开各种文件句柄,然后这些文件句柄会持续存在。一旦它删除了 privs,该进程仍然能够以打开它们的模式访问这些句柄,只要它们保持打开状态。
在这种情况下,该过程的妥协
openvpn
不会将文件暴露给更改,因为该文件(可能,我没有检查过)以只读方式打开。需要一个新的文件句柄才能以写入模式打开它,这将失败,因为该进程无法再创建一个。