One-way SOCK_STREAM



我们正在使用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)上,套接字权限被忽略。可移植程序不应该依赖此功能来保证安全性。

最新更新