Come viene eseguito il passaggio delle credenziali socket Unix in Python?Credenziali socket Unix che passano in Python
8
A
risposta
17
Le ricerche su Internet su questo argomento hanno prodotto sorprendentemente pochi risultati. Ho pensato di pubblicare la domanda e rispondere qui per gli altri interessati a questo argomento.
Le seguenti applicazioni client e server dimostrano come eseguire ciò su Linux con l'interprete python standard. Non sono richieste estensioni ma, a causa dell'uso di costanti incorporate, il codice è specifico per Linux.
Server:
#!/usr/bin/env python
import struct
from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET
SO_PEERCRED = 17 # Pulled from /usr/include/asm-generic/socket.h
s = socket(AF_UNIX, SOCK_STREAM)
s.bind('/tmp/pass_cred')
s.listen(1)
conn, addr = s.accept()
creds = conn.getsockopt(SOL_SOCKET, SO_PEERCRED, struct.calcsize('3i'))
pid, uid, gid = struct.unpack('3i',creds)
print 'pid: %d, uid: %d, gid %d' % (pid, uid, gid)
Cliente:
#!/usr/bin/env python
from socket import socket, AF_UNIX, SOCK_STREAM, SOL_SOCKET
SO_PASSCRED = 16 # Pulled from /usr/include/asm-generic/socket.h
s = socket(AF_UNIX, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_PASSCRED, 1)
s.connect('/tmp/pass_cred')
s.close()
Purtroppo, le costanti e SO_PEERCRED SO_PASSCRED non vengono esportati dal modulo zoccolo di pitone quindi devono essere inseriti manualmente. Anche se è improbabile che questi valori cambino, è possibile. Questo dovrebbe essere considerato da qualsiasi applicazione che utilizzi questo approccio.
Non penso che possano mai cambiare. In questo caso, tutte le applicazioni esistenti dovrebbero essere ricompilate ... Ma potrebbero essere diverse tra diversi sistemi operativi o diverse piattaforme. – glglgl
Vorrei fare +1 su di te, ma per una cosa, questo non è in realtà il passaggio delle credenziali. 'SO_PASSCRED' consente di ricevere (non inviare) credenziali, ma queste vengono inviate usando' sendmsg' e un messaggio di ancillarry 'SCM_CREDENTIALS'. stai leggendo 'SO_PEERCRED' che non dipende da questo, solo che il socket è un socket di dominio unix o è stato creato da' socketpair'. e ottiene solo le credenziali correnti (root può inviare messaggi credenziali corrispondenti ad altri utenti) – Hasturkun
Penso che SO_PEERCRED e SO_PASSCRED siano nel modulo socket adesso (almeno in 3.3). Non trovato quando sono stati aggiunti. Mi sono ricordato che non erano lì quando trovo questo post per la prima volta un anno fa ... – yuyichao