Back To Basis : ACL management
Retour aux bases, et une qui ne fera pas de mal : la gestion des ACL.
Une ACL est une Access Control List, une sorte de liste recensant des permissions d'accès diverses avec pleins d'utilisateurs dedans.
Je vais peut-être paraître polémique, mais j'ai pu discuter avec un admin Windows (j'ai dit un, je ne généralise pas) et constater que pour lui, les ACL étaient exclusivement réservées à Windows et n'existaient pas pour Linux.
Bah ce n'est pas vrai. C'est même plutôt loin du compte ! D'autant plus que c'est une solution relativement mure et très facilement utilisable.
Démonstration.
Installation
Les ACLs sont, à ce jour, supportées par la majorité des distributions et accessibles via un package acl. Une fois n'est pas coutume, j'ai procédé à l'installation depuis les dépôts et ce, pour 2 raisons :- C'est un package qui existe depuis relativement longtemps (près de 2 ans !), donc qui a de grandes chances d'être stable et intégré dans la distribution
- Cela permet de vérifier que le noyau les supporte nativement (et sans complication)
$ grep POSIX_ACL /boot/config* # enfin, le config de votre noyau actuel CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_JFS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y CONFIG_XFS_POSIX_ACL=y CONFIG_OCFS2_FS_POSIX_ACL=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_JFFS2_FS_POSIX_ACL=yVoilà. Mon noyau a bien été compilé avec ce qu'il faut pour supporter les ACL. En revanche, comme il s'agit d'enrichir les modes de permission de base (nos fameux rwx), il faut parfois passer par un montage particulier afin de spécifier explicitement le support des acl. Le support ou non des acl sur un type de partition (ext3, ext4...) est mentionné dans le man du mount, mais à priori, cela fonctionne pour ext2, ext3, ext4 et reiserfs.
$ mount /dev/sda3 on /home type ext3 (rw,acl)Je dis bien parfois, car j'ai pu tester sur un export NFS, sans utiliser l'option acl, et cela a fonctionné correctement. Bref, faites le test, et si cela ne fonctionne pas, vous saurez d'où ça vient. Une fois le package installé, on peut commencer à jouer :
$ touch bux $ ll bux -rw-r--r-- 1 kbux kbux 0 2011-03-16 15:44 bux $ getfacl bux # file: bux # owner: kbux # group: kbux user::rw- group::r-- other::r-- $ ll bux -rw-r--r--+ 1 kbux kbux 0 2011-03-16 15:44 buxRemarquez ? un + est venu s'ajouter après modification des acl. Seconde remarque, le getfacl : comme son nom l'indique, il vous montre de quoi il en retourne, sur qui, comment. Bien entendu, il va de pair avec un setfacl, qui lui sera en charge d'appliquer les modifications que vous lui avez fourni en ligne de commande.
Ready ?
Ajouter des permissions
La syntaxe est la suivante : setfacl -m [type d'objet]:[nom de l'objet]:[permissions] file :- type d'objet : u (user), g (group), m (mask, pas de nom d'objet à fournir), o (other, même remarque que pour mask)
- nom d'objet : nom d'utilisateur ou uid, nom de group ou gid
- permissions : r (read), w (write), x (execute) au choix ou combinés
- file : le nom de la ressource
$ setfacl -m u:nbux:w bux $ getfacl bux # file: bux # owner: kbux # group: kbux user::rw- user:nbux:-w- group::r-- mask::rw- other::r--Attention : dans le cas où l'on donne une acl sur un répertoire, il faut s'attendre à ce que les éléments contenus dans celui-ci n'héritent pas des permissions spécifiques dictées par l'acl. Pour forcer l'application de l'héritage, il faut utiliser l'option d (default) : setfacl -m d:u:nbux:rw /home/kbux. Dans ce cas, l'annulation de l'acl par défaut passera par l'option setfacl -k.
Supprimer les permissions
De la même manière, la suppression de privilèges est effectuée via l'option -x. La syntaxe de la commande est en tout point semblable à l'ajout de privilèges.$ setfacl -x u:nbux bux $ getfacl bux # file: bux # owner: kbux # group: kbux user::rw- group::r-- mask::r-- other::r--
Restaurer des permissions
La restauration des permissions se base sur un dump des permissions fait en amont de la modification que l'on souhaite annuler. Le dump en lui-même est possible grâce à la redirection du résultat d'un getfacl en récursif (option -R). La preuve par l'exemple :$ getfacl -R bux # file: bux # owner: kbux # group: kbux user::rw- group::r-- mask::r-- other::r-- $ getfacl -R bux > buxbackup $ setfacl -x u:nbux bux $ getfacl -R bux # file: bux # owner: kbux # group: kbux user::rw- user:nbux:-w- group::r-- mask::rw- other::r-- $ setfacl --restore=buxbackup $ getfacl -R bux # file: bux # owner: kbux # group: kbux user::rw- group::r-- mask::r-- other::r--Bref, CQFD !