J'ai changé les permissions d'un fichier (chmod g+w testfile
) et en exécutant ls -l testfile
donne :
-rwxrwxr-x 1 user1 user1 0 2011-01-24 20:36 testfile
J'ai ensuite ajouté un utilisateur à ce groupe ("/etc/group ” a user1:x:1000:user2
ligne), mais je ne parviens pas à modifier ce fichier en tant qu'utilisateur2. Pourquoi en est-il ainsi ?
Réponse acceptée :
user2
doit se déconnecter et se reconnecter. Les autorisations de groupe fonctionnent comme suit :
- Lorsque vous vous connectez, vos processus obtiennent une appartenance à un groupe dans votre groupe principal mentionné dans
/etc/passwd
, ainsi que tous les groupes où votre utilisateur est mentionné dans/etc/group
. (Plus précisément, lepw_gid
champ dansgetpw(your_uid)
, ainsi que tous les groupes dont votre utilisateur est un membre explicite. Au-delà de/etc/passwd
et/etc/group
, les informations peuvent provenir d'autres types de bases de données d'utilisateurs telles que NIS ou LDAP.) Le groupe principal devient l'ID de groupe effectif du processus et les autres groupes deviennent ses ID de groupe supplémentaires. - Lorsqu'un processus effectue une opération nécessitant l'appartenance à un certain groupe, comme l'accès à un fichier, ce groupe doit être soit l'ID de groupe effectif, soit l'un des ID de groupe supplémentaires du processus.
Comme vous pouvez le voir, votre modification de l'appartenance au groupe de l'utilisateur ne prend effet que lorsque l'utilisateur se connecte. Pour les processus en cours d'exécution, il est trop tard. L'utilisateur doit donc se déconnecter et se reconnecter. Si cela pose trop de problèmes, l'utilisateur peut se connecter à une session distincte (par exemple, sur une autre console ou avec ssh localhost
).
Sous le capot, un processus ne peut que perdre privilèges (ID utilisateur, ID de groupe, capacités). Le noyau lance l'init
processus (le premier processus après le démarrage) s'exécutant en tant que root, et chaque processus descend finalement de ce processus¹. Le login
processus (ou sshd
, ou la partie de votre gestionnaire de bureau qui vous connecte) s'exécute toujours en tant que root. Une partie de son travail consiste à supprimer les privilèges root et à basculer vers l'utilisateur et les groupes appropriés.
Il y a une seule exception :l'exécution d'un programme setuid ou setgid. Ce programme reçoit des autorisations supplémentaires :il peut choisir d'agir sous divers sous-ensembles d'appartenances au processus parent, plus l'appartenance supplémentaire à l'utilisateur ou au groupe qui possède l'exécutable setxid. En particulier, un programme setuid root a des permissions root, donc peut tout faire²; c'est ainsi que des programmes comme su
et sudo
peuvent faire leur travail.
¹ Il y a parfois des processus qui ne sont pas dérivés d'init (initrd, udev) mais le principe est le même :démarrer en tant que root et perdre les privilèges avec le temps.
² Interdire les cadres de sécurité à plusieurs niveaux tels que SELinux.