Есть ли способ получить UID другого конца соединения сокета Unix - PullRequest
5 голосов
/ 28 марта 2012

Есть ли способ для прослушивателя сокетов домена UNIX принимать соединение только от определенного пользователя (chmod / chown не работает для абстрактного сокета afaik), или, другими словами, получить идентификатор входящего соединения ( в Linux)?

Dbus, который использует абстрактный сокет Unix в Linux, имеет функцию GetConnectionUnixUser, которая используется polkit для определения вызывающей стороны. Поэтому я полагаю, что у dbus-daemon должен быть способ сделать это. Кто-нибудь знает, как это работает?

Ответы [ 2 ]

8 голосов
/ 22 сентября 2013

Самый простой способ проверить одноранговые учетные данные - SO_PEERCRED.Чтобы сделать это для сокета sock:

int len;
struct ucred ucred;

len = sizeof(struct ucred);
if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1)
    // check errno

printf("Credentials from SO_PEERCRED: pid=%ld, euid=%ld, egid=%ld\n",
        (long) ucred.pid, (long) ucred.uid, (long) ucred.gid);
SO_PEERCRED
          Return the credentials of the foreign process connected to
          this socket.  This is possible only for connected AF_UNIX
          stream sockets and AF_UNIX stream and datagram socket pairs
          created using socketpair(2); see unix(7).  The returned
          credentials are those that were in effect at the time of the
          call to connect(2) or socketpair(2).  The argument is a ucred
          structure; define the _GNU_SOURCE feature test macro to obtain
          the definition of that structure from <sys/socket.h>.  This
          socket option is read-only.

Из tlpi пример . PostgreSQL имеет несколько вариантов для других модулей.

4 голосов
/ 28 марта 2012

Да - эта операция, наряду с передачей FD, поддерживается посредством вспомогательного сообщения с типом SCM_CREDENTIALS.Соответствующие вызовы задокументированы в man 7 unix.

...