2011-11-02 17 views

Respuesta

17

Las búsquedas en Internet sobre este tema arrojaron sorprendentemente pocos resultados. Pensé que publicaría la pregunta y la respuesta aquí para otras personas interesadas en este tema.

Las siguientes aplicaciones de cliente y servidor demuestran cómo lograr esto en Linux con el intérprete de Python estándar. No se requieren extensiones pero, debido al uso de constantes incorporadas, el código es específico de Linux.

Servidor:

#!/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() 

Por desgracia, las constantes SO_PEERCRED y SO_PASSCRED no se exportan por el módulo de toma de pitón por lo que deben ser introducidos manualmente. Aunque es poco probable que estos valores cambien, es posible. Esto debe ser considerado por cualquier aplicación que use este enfoque.

+0

No creo que puedan cambiar. En este caso, todas las aplicaciones existentes tendrían que ser recompiladas ... Pero podrían ser diferentes entre varios SO o varias plataformas. – glglgl

+2

Te quería +1, pero por un lado, esto no es en realidad el pase de credencial. 'SO_PASSCRED' permite recibir (no enviar) credenciales, pero esas se envían usando el mensaje' sendmsg' y ancillarry 'SCM_CREDENTIALS'. está leyendo 'SO_PEERCRED' que no depende de esto, solo que el socket es un socket de dominio unix o fue creado por' socketpair'. y solo obtiene las credenciales actuales (root puede enviar mensajes de credenciales que coincidan con otros usuarios) – Hasturkun

+2

Creo que SO_PEERCRED y SO_PASSCRED están en el módulo de socket en este momento (al menos en 3.3). No se encontró cuando se agregaron. Recuerdo que no estaban allí cuando encontré esta publicación por primera vez hace un año ... – yuyichao

Cuestiones relacionadas