2012-03-27 3 views
4

Gibt es eine Möglichkeit für einen UNIX-Domain-Socket-Listener nur Verbindung von bestimmten Benutzer (chmod/chown funktioniert nicht für abstrakte Socket afaik) akzeptieren, oder mit einem anderen Wort, die UID der eingehenden Verbindung (unter Linux)?Gibt es eine Möglichkeit, die uid des anderen Endes einer Unix-Socket-Verbindung zu erhalten

Dbus, der unter Linux den abstrakten Unix-Socket verwendet, hat eine Funktion GetConnectionUnixUser, die von Polkit verwendet wird, um den Aufrufer zu bestimmen. Ich nehme an, die dbus-daemon muss eine Möglichkeit haben, das zu tun. Weiß jemand wie das geht?

Antwort

5

Der einfachste Weg, Peer-Anmeldeinformationen zu überprüfen ist, mit SO_PEERCRED. dies für Sockel tun 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. 

Aus tlpiexample. PostgreSQL hat ein paar Varianten für andere Unices. sehr viel

+0

Eigentlich ist das zu sein, was scheint, dass ich am Ende mit, obwohl ich nicht den Unterschied zwischen ihnen bemerkt haben bis jetzt . : P – yuyichao

+0

Es könnte auch wert sein, zu erwähnen, dass einige Linux-Systeme benötigen Sie '#define _GNU_SOURCE', bevor Sie' ' einer der Header-Dateien zu erhalten, um 'struct ucred' definiert. – mormegil

4

Ja - diese Operation zusammen mit FD Gang wird über eine ancilliary Nachricht mit dem SCM_CREDENTIALS Typ nicht unterstützt. Die beteiligten Anrufe sind in man 7 unix dokumentiert.

+0

THX. = D – yuyichao

+0

Also, indem Sie 'SCM_CREDENTIALS' die Nachricht vom Kernel aktiviert ist, aber es erfordert immer noch den Client die Nachricht zu senden. Gibt es eine Möglichkeit, dies nur auf der Serverseite zu tun? – yuyichao

+0

Nein; Soweit ich weiß, gibt es keine Möglichkeit, Anmeldeinformationen zu erhalten, ohne dass das andere Ende sie sendet. – duskwuff

Verwandte Themen