如何安全地设置unix域套接字的组所有权?

时间:2016-06-29 09:24:48

标签: 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的东西的奖励积分。

1 个答案:

答案 0 :(得分:0)

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