防止在绑定套接字时删除文件系统中的 Unix 域套接字文件



是否可以在Linux或MacOSX上阻止当前绑定的Unix域套接字文件(例如在/tmp中)被删除?我想要一个用户可以连接到但用户在守护程序运行时无法删除的模式 0777 套接字。

现在,普通用户可以"rm"套接字,阻止其他人访问它,直到守护程序重新启动。如果绑定,似乎它应该是"忙"的。

您可以创建一个新的子目录,并在创建套接字后对该目录设置只读权限:

mkdir /tmp/blah
cd /tmp/blah
# do stuff to create /tmp/blah/socket
chmod 555 /tmp/blah

rm /tmp/blah/socket
rm: cannot remove /tmp/blah/socket: Permission denied

(或等效于C/您选择的语言)

这完全取决于包含套接字的目录。 /tmp有点特别,因为它在目录上设置了"粘性位"(如果您执行ls -ld /tmp您将看到权限字段通常是:drwxrwxrwt或更有用的模式 1777。该粘滞位(末尾的t)在目录上设置时很重要。引用man chmod

受限删除标志或粘滞位是单个位,其解释取决于文件类型。 对于目录,它阻止非特权用户删除或重命名目录中的文件,除非他们拥有该文件或目录; 这称为 Re‐目录的严格删除标志,常见于全局可写目录(如/tmp)。 对于一些较旧的常规文件系统,该位将程序的文本图像保存在交换设备上,以便在运行时加载得更快;这称为粘性位。

这正是您想要的 - 针对用户删除文件的文件系统级保护。它也是 100% 可移植到所有现代类 UNIX 环境。

因此,如果要在/tmp中创建终结点,则已具有所需的保护。如果要在其他地方创建端点,例如 /opt/sockets ,只需chmod 1777 /opt/sockets 即可。获得所需保护的"技巧"的最后一部分是确保root用户是终结点的实际所有者。如果端点归用户fred所有,那么fred将始终能够删除端点,这可能是一件可取的事情。但如果没有,只需chown root:root /path/to/endpoint.

最新更新