sockets - 如何安全设置Unix域套接字的组所有权?

标签 sockets file-permissions unix-socket

我想创建一个限于特定组的Unix域套接字。因此,我理想地要做的是(忽略错误检查)类似:

// Set the "address" (ie filesystem path)
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "./my.sock");

int fd = socket(AF_UNIX, SOCK_DGRAM, 0);  // create the socket

// Set the group owner and permissions
fchmod(fd, 0770); // This seems to succeed
fchown(fd, -1, wanted_group_id);  // Silently fails

// Create the filesystem entry
bind(fd, (struct sockaddr *)&addr, sizeof(addr));

但是,套接字has no effect上的fchown,因此之后的chown似乎是设置组的唯一方法。我想避免使套接字临时可供不应被允许访问的进程访问。

我最好的主意是:
int fd = socket(...);
fchmod(fd, 0700);  // Remove group permissions
bind(fd, ...);     // Create fs entry
chown("./my.sock", -1, wanted_group_id); // set the correct group owner
fchmod(fd, 0770);  // And restore group permissions

当然,要使用Unix套接字,这是很常见的事情,并且有一种规范的方法可以实现这一点,但是我还没有找到明确的答案。

我只对Linux真正感兴趣,但是对仅依赖POSIX的东西有加分。

最佳答案

这样做的方法是将套接字放入具有正确权限的目录中。目录可以原子地创建(或重命名),一旦目录存在,套接字本身的权限就不是很重要。这在Unix上也适用,在Unix上并不总是尊重套接字本身的权限。

关于sockets - 如何安全设置Unix域套接字的组所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38095467/

相关文章:

java - Java 中的多工套接字通信

php - 将套接字资源转换为流套接字

c++ - c++客户端和node.js服务器示例

c - 使用 Unix 套接字获取 "Address already in use"错误

c# - 如何使用 .NET Framework 获取所有事件的 TCP 连接(无非托管 PE 导入!)?

java - 从单独的方法中引用套接字

Python dist-packages 权限

bash - 设置 Mongodb 文件夹的读/写权限

php - AWS EC2 - 使用 html 表单授予文件夹对上传文件的权限