Сокеты домена UNIX недоступны для пользователей?

Я запускаю клиент/серверное приложение на Red Hat Enterprise, используя ZMQ для передачи сообщений. Сокет IPC, используемый для связывания клиента с сервером, реализуется с использованием сокета домена Unix.

Если пользователь A запускает серверный процесс, кажется, что только клиенты, запущенные пользователем A, могут подключаться к этому сокету и связываться с ним. Наш проект требует, чтобы клиенты могли работать разными пользователями, поэтому это важный момент.

Сокет находится в /tmp/ipc _assoc с разрешениями по умолчанию 755. chmod 777 не устраняет проблему. chown userB позволяет пользователю B обращаться к сокету, но пользователь A затем теряет доступ. Даже root не может получить доступ к сокету. На машине нет ACL или SeLinux.

Это типичное поведение для сокетов домена Unix? Кто-нибудь понял, как обойти это?

4 ответа

С некоторой помощью из списка рассылки ZMQ я сделал работу. Это уродливо, но, похоже, работает последовательно.

Мне нужно было создать подкаталог под /tmp и chmod 777. Теперь сервер создает сокет в этой новой папке. Он также программно chmod 777 сокет. Теперь, пока сервер запущен с правами администратора, любой пользователь может запустить клиент и поговорить с сервером.

Я не знаю, почему сокет домена UNIX ведет себя таким образом, но он определенно раздражает.


chmod (s.sun_path, 0777); после прослушивания сокета.

domain = AF_UNIX;
name = servname;
port = -1;
n = MakeLocalSocket(s);
if (n == 0) {
 fatal("can't create socket");
}
unlink(s.sun_path);
if (bind(fd, & s, n) < 0) {
 fatal("can't bind socket");
}
if (listen(fd, 5) != 0) {
 fatal("can't listen to socket");
}
/* UNIX domain sockets need to be mode 777 on 4.3 */
chmod(s.sun_path, 0777);


Временно измените umask:

mode_t umask_ = umask(0000); /* let the socket be mode 0777 so that other users can connect */
int err = bind(fd, (struct sockaddr *)&unix_bind_addr, sizeof(unix_bind_addr));
umask(umask_); /* restore old umask (0777 is a pretty bad choice for normal stuff) */
if (err) {
 /* handle bind error here */
}

Конечно, это плохая идея, если вы используете потоки.


Вы пытались добавить UserA и UserB в общую группу пользователей?

licensed under cc by-sa 3.0 with attribution.