« Gestion des ACL » : différence entre les versions
m (→Héritage des droits étendus : retouche) |
|||
Ligne 168 : | Ligne 168 : | ||
</code> | </code> | ||
Avec <code>-rw-rw----+</code>, on sait que le fichier possède un ACL (<code>+</code>), sans en connaître les constituants. | Avec <code>-rw-rw----+</code>, on sait que le fichier possède un ACL (<code>+</code>), sans en connaître les constituants. | ||
==Notes concernant la syntaxe de ''setfacl''== | |||
Les préfixes peuvent être développés et les permissions codées en octal (avec préfixe ''0'' optionnel) : <code>d:u:luce:rw,g:www-data:r,o:-</code> a donc le même sens que <code>default:user:luce:06,group:www-data:04,other:00</code> (ou <code>default:user:luce:6,group:www-data:4,other:0</code>). | |||
==Documents annexes== | ==Documents annexes== |
Version du 26 octobre 2005 à 03:23
<cadre type="note">Cet article vise à expliquer la mise en place et l'utilisation fondamentale des ACL sur une machine et non la théorie les concernant.</cadre>
Un ACL, ou Access Control List (en anglais : « liste de contrôle d'accès ») est, pour définir simplement la notion, une liste de permissions sur un fichier, un répertoire ou une arborescence, ajoutée aux permissions classiques de ce fichier. Ces permissions concernent des utilisateurs et/ou des groupes définis. Les ACL sont conformes aux normes POSIX.
Au moyen des ACL, on peut donc étendre le nombre d'utilisateurs et de groupes ayant des droits sur un même fichier. Rappelons que, dans le monde UNIX, chaque fichier ne peut normalement indiquer des permissions que pour un seul utilisateur et un seul groupe, qui s'opposent à une unique catégorie correspondant à « tous les autres ». Avec les ACL, on peut (entre autres) ajouter à un fichier d'autres utilisateurs et groupes et définir leurs droits séparément. On se rapproche ainsi du système de permissions pratiqué sur les plate-formes NT.
Les ACL sont très utiles (voire indispensables) dans des environnements informatiques axés sur le travail collaboratif et mutualisé ; de même, leur utilisation avec SAMBA permet d'en étendre les capacités.
Exemple pratique
Soit un fichier /var/www/index.php (page d'index d'un site web, par exemple) dont les droits sont les suivants :
$ ls -l /var/www/index.php
-rw-r----- 1 root www-data 18 2005-09-11 11:24 /var/www/index.php
En d'autres termes, root en est le propriétaire ; il peut le lire et le modifier ; le fichier est aussi accordé au groupe www-data (celui sous lequel, par exemple, tourne le serveur web), dont les membres peuvent le lire mais pas le modifier. Quant au reste du monde, il ne peut pas y accéder (le fichier contient des informations confidentielles telles qu'un mot de passe à une base de données MySQL).
Imaginons qu'on veuille rendre le fichier accessible en lecture aux utilisateurs Jean et Luce, en lecture et écriture à Khadija et Alice. On pourrait à la rigueur faire entrer Jean et Luce dans le groupe www-data mais cela introduirait une faille de sécurité car www-data peut accéder à des données qui ne les concernent pas. Il n'est en tout cas rationnellement pas prudent d'ajouter Khadija et Alice au groupe root. On ne peut non plus changer les permissions (en lecture et écriture pour tout le monde) ou modifier le propriétaire et le groupe.
Les ACL sont là une solution pratique et facile à gérer dans ce cas ; il suffit d'ajouter des permissions à l'ACL du fichier (grâce à des commandes décrites plus bas) pour qu'il se présente ainsi :
root: rw-
www-data: r--
Khadija: rw-
Alice: rw-
Jean: r--
Luce: r--
reste du monde : ---
Mise en place
Selon la version du noyau utilisée, le support des ACL peut ou non être déjà compilé. S'il l'est, il faut aussi que la partition contenant les fichiers dont on veut étendre les droits soit montée avec l'option idoine.
Noyau
Il faut d'abord savoir si le noyau a été compilé avec le support des ACL. Le plus simple est de le vérifier dans le fichier de configuration du noyau, fichier normalement situé sous /boot. Pour ce faire, utiliser la commande grep :
$ grep ACL /boot/config-version-du-noyau
Elle doit renvoyer la ligne suivante :
CONFIG_FS_POSIX_ACL=y
pour signaler que le support général des ACL est présent, et plusieurs lignes du type
CONFIG_[système de fichiers]_FS_POSIX_ACL=y
où [système de fichier] peut recevoir les valeurs (pour un noyau 2.6.8-2-386 à la date de rédaction) EXT3, JFS et XFS.
Si la valeur des options n'est pas correcte, vous devez recompiler votre noyau. N'oubliez pas de prévoir au moins un système de fichiers pour lequel les ACL seront permis.
Systèmes de fichiers/montage des partitions
Quand le noyau est disposé à gérer les ACL, on doit préparer les partitions montées dans un système de fichiers adapté (par exemple, il est exclu de vouloir utiliser ces permissions avec du vfat).
Montage et démontage à la volée
Il faut monter les partitions voulues avec l'option acl. Par exemple :
# mount -t ext3 -o defaults,acl /dev/hda2/ /var/www/
Si la partition est déjà montée, on peut modifier ses paramètres à la volée :
# mount -o remount,acl /var/www/
Configuration automatique
L'inscription dans /etc/fstab des options de gestion des ACL est recommandée quand leur utilisation est régulière. Par exemple, notre même couple partition/point de montage serait déclaré ainsi :
/dev/hda2 /var/www ext3 defaults,acl 0 0
À chaque montage automatique des partitions, le support des ACL sera activé.
Commandes
Il existe deux commandes essentielles : l'une pour manipuler l'ACL d'un fichier (setfacl) et l'autre pour le consulter (getfacl). Les commandes traditionnelles chmod et chown ne peuvent accéder aux ACL.
Ces deux commandes nécessitent, sous Debian, l'installation du paquetage « acl ». Pour l'installer :
# apt-get install acl
setfacl
Le nom de la commande se comprend set file's ACL (« régler l'ACL du fichier »). Elle possède de nombreuses options dont il convient de prendre connaissance en consultant la page de manuel (man setfacl
). La commande fonctionne bien sûr aussi de manière récursive (option -R
) :
# setfacl -Rm u:khadija:rw /var/www/
modifie l'ACL de tous les fichiers situés sous /var/www/ en leur attribuant une permission de lecture et d'écriture pour l'utilisateur Khadija.
Ajouter des permissions
La syntaxe fondamentale est simple. La commande
# setfacl -m u:khadija:rw /var/www/index.php
modifiera (-m
) l'ACL de /var/www/index.php en attribuant à l'utilisateur (préfixe u:
) Khadija les droits rw
. Les droits d'exécution n'étant pas indiqués, ce sont les droits normaux qui s'appliquent.
Les paramètres à connaître sont :
- préfixes :
u:
(droits pour un utilisateur, nommé ou désigné par son uid) ;g:
(droits pour un groupe, nommé ou désigné par son gid) ;m:
(masque de droits par défaut) ;o:
(droits pour other, le reste du monde) ;
- permissions : elles sont codées dans l'ordre
r
,w
etx
ouX
(ce dernier représentant, comme avec chmod, le droit d'entrée dans les répertoires ou celui d'exécution pour les fichiers qui ont déjà un marqueurx
). On les remplace par-
pour une interdiction explicite. Ne pas mentionner un droit revient aussi à une interdiction :# setfacl -m u:khadija:w /var/www/index.php
et# setfacl -m u:khadija:-w- /var/www/index.php
reviennent au même.
On peut construire des commandes plus complexes en enchaînant les entrées dans l'ACL :
# setfacl -m u:khadija:rw,g:site1:r--,o:--- /var/www/index.php
définit des permissions dans l'ACL de /var/www/index.php pour l'utilisateur Khadija, le groupe site1 et le reste du monde.
Cette commande permet aussi de modifier les permissions classiques (et remplace dans ce cas chmod) : l'utilisateur, le groupe et le reste du monde par défaut du fichier sont simplement désignés par le préfixe (u:
, g:
, o:
) suivi d'un nom vide : si un fichier index.php appartient à luce:www-data avec les droits r--r-----
, pour donner à l'utilisateur et le groupe les droits en lecture et écriture il suffit d'une commande # setfacl -m u::rw,g::rw /var/www/index.php
. Si l'utilisateur et le groupe possèdent déjà un droit qui ne serait pas mentionné dans la commande setfacl, ce droit sera annulé. Soit le fichier index.php avec les droits rw-r-----
pour luce:www-data. La commande # setfacl -m u::r,g::x index.php
modifiera les droits à r----x---
pour pour luce:www-data.
Noter qu'un fichier dont seules les permissions classiques ont été altérées par setfacl au lieu de chmod ne reçoit pas pour autant un ACL. De fait, il n'est pas référencé par ls -l
comme fichier à ACL (marqueur +
; voir plus bas).
Retirer des permissions
Pour annuler tout ou partie d'un ACL :
# setfacl -b /var/www/index.php
ôte tout le contenu de l'ACL du fichier, tandis que
# setfacl -x u:khadija,g:site1 /var/www/index.php
retire les permissions propres à Khadija et au groupe site1.
Le masque
Droits par défaut et héritage des droits étendus
Les droits étendus d'un objet parent ne sont pas automatiquement hérités par les objets contenus. Par exemple, si un répertoire (root:www-data, rwxr-x-r-x
) possède un ACL u:luce:rwx
, un fichier créé à l'intérieur (ou déjà présent avant l'adjonction de l'ACL) ne reçoit pas cet ACL.
On peut modifier ce comportement en ajoutant, aux répertoires seulement, un attribut default, codé d:
. Cet attribut se transmet à tous les fichiers créés dans le répertoire après l'ajout de l'ACL par défaut. Par exemple, setfacl -m d:u:luce:rwX /var/www
donne à Luce les droits de lecture et écriture (ainsi qu'« exécution » quand il s'agit de répertoires) pour tous les fichiers qui seront créés sous /var/www à partir de ce moment, jusqu'à ce que l'ACL « par défaut » soit annulé ou remplacé.
getfacl
Cette commande suivie d'un nom de fichier affiche l'ACL de ce fichier (get file's ACL « récupérer l'ACL du fichier »). Par exemple :
# getfacl /var/www
- file: var/www
- owner: root
- group: www-data
user::rwx
user:luce:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:khadija:rwx
default:group::rwx
default:group:www-data:r-x
default:mask::rwx
default:other::r-x
On voit qu'outre les droits traditionnels attribués à root:www-data, sont aussi définis :
- des droits complets pour Luce ;
- un ACL par défaut donnant des droits complets à Khadija sur tous les nouveaux fichiers créés sous /var/www/ ;
- un ACL par défaut donnant des droits de lecture et d'exécution au groupe www-data sur les mêmes fichiers.
Noter que user::
, group::
et other::
représentent le triplet utilisateur / groupe / reste du monde des permissions classiques. Appliquer cette commande sur un fichier qui n'a pas d'ACL défini donne les mêmes informations que ls -l
, dans un format différent :
# setfacl -b index.php # retirer les ACL pouvant exister
- ls -l index.php
-rw-r----- 1 root www-data 5055 2005-10-16 18:53 index.php
- getfacl index.php
# file: index.php
# owner: root
# group: www-data
user::rw-
group::r--
other::---
ls, cp et mv
Ces commandes doivent pouvoir lister, copier et déplacer les ACL en même temps que les fichiers. Pour les deux premières commande, il faut préciser que l'on veut afficher/conserver les droits : ls -l
, cp -a
. La commande mv, quant à elle, préserve toujours les droits. Quand les droits étendus ne peuvent être conservés (déplacement ou copie vers un système de fichier qui n'est pas configuré pour les recevoir), un message d'avertissement en informe l'utilisateur. Par exemple :
# setfacl -m u:luce:rw index.php
- cp -a index.php /mnt/vfat
cp: preserving permissions for `/mnt/vfat/index.php': Opération non supportée
Noter qu'un fichier comportant un ACL et listé par ls -l
n'affiche qu'un +
à la suite de ses permissions. Seule la commande getfacl, pour l'instant, permet d'avoir connaissance du détail. Par exemple :
# setfacl -m u:khadija:rw /var/www/index.php
- ls -l /var/www/index.php
-rw-rw----+ 1 khadija www-data 5055 2005-10-16 18:53 /var/www/index.php
Avec -rw-rw----+
, on sait que le fichier possède un ACL (+
), sans en connaître les constituants.
Notes concernant la syntaxe de setfacl
Les préfixes peuvent être développés et les permissions codées en octal (avec préfixe 0 optionnel) : d:u:luce:rw,g:www-data:r,o:-
a donc le même sens que default:user:luce:06,group:www-data:04,other:00
(ou default:user:luce:6,group:www-data:4,other:0
).
Documents annexes
Pages de manuel :
man acl
;man setfacl
;man getfacl
.
Copyright
© 25.10.05 Vincent Ramos
Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la GNU Free Documentation License, Version 1.2 ou n'importe quelle version ultérieure publiée par la Free Software Foundation; sans section invariante, sans page de garde, sans entête et sans page finale. |