2009-08-03 23 views
5

¿Hay alguna forma de cambiar el UID/GID solo de un hilo en un proceso multiproceso?Cambiar UID/GID solo de un hilo en Linux

El motivo es escribir una aplicación de servicio de archivos: las ACL y la cuota no se aplican a menos que el uid/gid de la persona que llama esté configurado para el usuario correcto, los nuevos archivos/directorios no se crean con el uid/gid correcto etc.

Las aplicaciones de red generalmente pueden fork() al principio y procesar cada solicitud de usuario en un proceso separado. Si hay una necesidad de datos compartidos, debe pasar por algún tipo de memoria compartida. Sin embargo, p. el FUSE (sistema de archivos de usuario de Linux) usa de forma predeterminada el multihilo y, en conjunción con los enlaces de python, no sería práctico intentar usar un modelo de bifurcación.

El UID 'coherente' para todo un proceso parece estar de acuerdo con el estándar POSIX, sin embargo, los Linuxes antiguos no seguían el POSIX y permitían diferentes uids para diferentes hilos. Los nuevos núcleos parecen seguir a POSIX, ¿hay alguna forma de permitir el viejo comportamiento "roto"?

Respuesta

5

¿Ha comprobado si setfsuid()/setfsgid() son por subproceso o por proceso? Están diseñados específicamente para este caso de uso (servidor de archivos).

+0

Esto es mejor, lo he comprobado y, sorprendentemente, he descubierto que son realmente por subproceso. Esta probablemente sea la forma preferida. Sin embargo, el motivo por el que no lo probé es que la cuota() y el acceso() no funcionan. Otras cosas funcionan, por lo que probablemente se trate de un error de Linux. – ondra

+0

Sí, eso suena como un error, ya que los comentarios en el código del kernel para sys_setfsuid() mencionan específicamente access() ... – caf

+0

@Ondrej, por favor, publique el código (o un enlace), demostrando que 'fsuid' es , a diferencia de otras construcciones UID/GID, por subproceso y no por proceso. Especifique también las versiones de kernel y glibc, así como su implementación de threading (NPTL, LinuxThreads, OndrejThreads, etc.). – pilcrow

5

Para cambiar el uid solo para un hilo, necesita usar el syscall directamente: syscall (SYS_setresuid, ...); La función libc setresuid() lo sincronizará para todos los hilos (¡utilizando un singal que envía a todos los hilos)!

Cuestiones relacionadas