Domanda

Esiste un modo per modificare UID / GID di un solo thread in un processo multithread?

Il motivo di ciò sta scrivendo un'applicazione per la pubblicazione di file: gli ACL e la quota non vengono applicati a meno che l'UID / GID del chiamante non sia impostato sull'utente corretto, i nuovi file / directory non vengono creati con l'UID / GID corretto, ecc. .

Le applicazioni di rete possono generalmente fork () all'inizio e processare ogni richiesta dell'utente in un processo separato. Se sono necessari dati condivisi, devono passare attraverso una sorta di memoria condivisa. Tuttavia, ad es. il FUSE (linux user filesystem) usa di default il multithreading e in congiunzione con i collegamenti python non sarebbe pratico provare a usare un modello di fork.

L'UID "coerente" per un intero processo sembra essere conforme allo standard POSIX, tuttavia i vecchi Linux non seguivano il POSIX e consentivano uid diversi per thread diversi. I nuovi kernel sembrano seguire POSIX, c'è un modo per consentire il vecchio comportamento "rotto"?

È stato utile?

Soluzione

Il setfsuid () / setfsgid () specifico per Linux sono per thread anziché per processo. Sono progettati specificamente per questo caso d'uso (file server).

Nota che access () controllerà comunque l'accesso usando il vero uid e gid - cioè in base alla progettazione (è destinato a rispondere alla domanda " dovrebbe l'utente che ha eseguito questo binario avere accesso a questo file " ). Per il caso setfsuid () / setfsgid () dovresti semplicemente provare l'operazione richiesta e rilevare l'errore a causa della mancanza di autorizzazione a quel punto.

Altri suggerimenti

Per cambiare l'UID solo per un thread devi usare direttamente syscall: syscall (SYS_setresuid, ...); La funzione libc setresuid () lo sincronizzerà per tutti i thread (usando un singal che invia a tutti i thread)!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top