【发布时间】:2016-06-29 09:24:47
【问题描述】:
我想创建一个仅限于特定组的 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));
但是,fchown 在套接字has no effect 上,所以看起来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 的东西会加分。
【问题讨论】:
-
您可以让程序创建套接字 Set-GID 到所需的组,以便首先使用所需的组创建它。
-
我认为这没有帮助。我的程序已经有该组可用,并希望创建具有不同组的多个套接字。
-
一个类似的想法:至少在 linux 上,您可以授予您的程序
CAP_SETGID功能,然后您可以暂时采用您希望的任何组 ID。 -
我正在尝试减少进程的权限而不是增加权限;添加根功能与此相反。
标签: sockets file-permissions unix-socket