我们正在使用AF_UNIX(本地文件)上的SOCK_STREAM创建套接字。我们在系统上有许多进程,它们都是客户端,我们只对向这些客户端广播消息感兴趣。操作系统为Ubuntu 14.04.5 LTS。
如果文件权限为666,则这一切都有效,但是作为安全措施,我们希望将其更改为644。但是,当客户端尝试使用以下代码进行连接时,这会导致权限异常:
int XyzClient::establish_connection() {
int fd;
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
throw XyzException(strerror(errno));
}
sockaddr_un addr = {};
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, DEFAULT_SOCKET_PATH, sizeof(addr.sun_path)-1);
if (connect(fd, (sockaddr*)&addr, sizeof(addr)) == -1) {
// connect failed, close fd and throw exception
close(fd);
throw XyzException(strerror(errno));
}
return fd;
}
问题可能是上述代码试图建立对文件的读写访问,从而导致权限错误。
是否有可能做一个单向的SOCK_STREAM,这样我们就可以锁定文件为只读,除了所有者/广播者?
创建只读unix域套接字并通过文件权限强制执行是不可能的。从相关手册页unix(7)
在Linux上,连接到流套接字对象需要对该套接字具有写权限;同样,向数据报套接字发送数据报也需要对该套接字具有写权限。POSIX没有对套接字文件的权限效果做出任何声明,并且在某些系统(例如,较旧的bsd)上,套接字权限被忽略。可移植程序不应该依赖此功能来保证安全性。