Question

Existe-t-il un moyen de modifier l'UID / le GID d'un seul thread dans un processus multithread?

La raison en est l'écriture d'une application de service de fichiers - les listes de contrôle d'accès et les quotas ne sont pas appliqués à moins que l'uid / gid de l'appelant ne soit défini sur le bon utilisateur, les nouveaux fichiers / répertoires ne sont pas créés avec le bon uid / gid, etc. .

Les applications réseau peuvent généralement forker () elles-mêmes au début et traiter chaque requête de l'utilisateur séparément. Si des données partagées sont nécessaires, elles doivent passer par une sorte de mémoire partagée. Cependant, par exemple FUSE (système de fichiers utilisateur Linux) utilise par défaut le multithreading et, en conjonction avec des liaisons python, il ne serait pas pratique d'essayer d'utiliser un modèle de forking.

L'UID "cohérent" pour tout un processus semble être conforme au standard POSIX, mais les anciens Linux ne suivaient pas le POSIX et autorisaient des uids différents pour différents threads. Les nouveaux noyaux semblent suivre POSIX, existe-t-il un moyen d'autoriser l'ancien comportement "cassé"?

Était-ce utile?

La solution

Les setfsuid () / setfsgid () spécifiques à Linux sont calculés par thread et non par processus. Ils sont conçus spécifiquement pour ce cas d'utilisation (serveur de fichiers).

Notez que access () vérifiera toujours l'accès en utilisant les véritables uid et gid - c'est-à-dire par leur conception (il est destiné à répondre à la question "si l'utilisateur qui a exécuté ce fichier binaire avoir accès à ce fichier ". ). Pour le cas setfsuid () / setfsgid () , vous devez simplement essayer l'opération demandée et détecter les échecs dus à l'absence de permission à ce moment-là.

Autres conseils

Pour modifier l'identifiant unique d'un seul thread, vous devez utiliser directement l'appel système: syscall (SYS_setresuid, ...); La fonction libc setresuid () la synchronisera pour tous les threads (en utilisant un singal qu’elle envoie à tous les threads)!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top