在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。
答案1
与许多放弃特权的应用程序一样,OpenVPN 在仍具有 root 权限时会打开各种文件句柄,然后这些句柄会一直存在。一旦放弃特权,只要这些句柄保持打开状态,该进程仍然能够以打开它们的模式访问它们。
在这种情况下,进程被攻陷openvpn
不会使文件受到更改,因为文件(可能,我还没有检查)是以只读方式打开的。需要一个新的文件句柄才能以写入模式打开它,但这会失败,因为进程无法再创建句柄。