Le système Unix organise son information sous la forme d’une arborescence de répertoires et de fichiers. Les entrées d’un répertoire peuvent être des fichiers ordinaires, des liens sur d’autres fichiers, des pilotes de périphériques ou encore d’autres répertoires. A chacune de ces entrées correspond un ensemble d’informations comme le type et la taille du fichier, le nombre de liens et les différentes dates le concernant, c’est-à-dire date de création, de dernière modification et de dernier accès, et enfin le propriétaire, le groupe et les permissions qui lui sont associées. L’organisation des systèmes de fichiers varie suivant qu’il s’agit de Unix System V ou de Unix BSD. Actuellement, de nombreuses implémentations de Unix System V ont adopté l’organisation BSD.
Un système de fichiers traditionnel de Unix System V est contenu dans une partition de disque. Il est formé de quatre composants principaux :
- le boot bloc :
ð Le boot block est le bloc de démarrage. C’est un bloc physique de 512 octets destiné à contenir un programme que l’on appelle le programme de bootstrap. C’est le programme qui initialise le système lorsqu’il s’agit du système de fichier contenant la racine (root).
- le super bloc ;
ð Le super-bloc contient toutes les informations nécessaires au système pour gérer le système de fichier. C’est-à-dire :
§ le numéro du premier bloc allouable ;
§ la taille du système de fichiers ;
§ la table de gestion des blocs libres ;
§ la table de gestion des inodes libres ;
§ les verrous ;
§ la date de dernière mise à jour ;
§ le nombre de blocs libres ;
§ le nombre d’inodes libres ;
§ des informations sur le périphérique ;
§ le nom du système de fichier ;
§ le nom du volume ;
§ le type de système de fichier ;
- les inodes :
ð A la suite du super-bloc viennent des blocs qui contiennent les inodes des fichiers du système. Le nombre de blocs d’inodes varie en fonction de la taille du système de fichier. Il y a une inode par fichier ou répertoire. Une inode contient toutes les informations permettant de retrouver les données du fichier qu’il représente. Chaque inode occupe 64 octets et contient les informations suivantes :
§ le type de fichier ;
§ le mode (permissions d’accès) du fichier ;
§ le nombre de liens ;
§ l’identification du propriétaire (UID) ;
§ l’identification du groupe (GID) ;
§ la taille du fichier en nombre d’octets ;
§ la table des 13 blocs de données ou d’indirection structurée de la façon suivante :
· 10 adresses de blocs de données ;
· 1 adresse de bloc de simple indirection ;
· 1 adresse de bloc de double indirection ;
· 1 adresse de bloc de triple indirection ;
· les blocs de données ;
§ la date de création, de dernière modification et de dernier accès ;
- les blocs de données :
ð les blocs qui se trouvent à la suite du super-bloc contiennent les données des fichiers proprement dits où sont des blocs d’indirection qui contiennent des adresses d’autres blocs d’indirection ou de données.
A chaque fichier correspond une inode qui contient toutes les informations concernant ce fichier. C’est-à-dire :
- l’adresse des blocs de données sur le disque ;
- le type de fichier ;
- la taille du fichier en octets ;
- les dates de création, dernière modification et dernier accès ;
- le nombre de liens ;
- l’identification du propriétaire, l’UID ;
- l’identification du groupe, le GID ;
- les permissions d’accès ou mode.
Le champ représentatif des permissions est formé de trois groupes de trois caractères. Chacun des groupes représente les droits en lecture, écriture et exécution pour un certain ensemble de personnes. Les trois premiers caractères représentent les droits du propriétaire du fichier, les trois suivants concernent les droits des membres du groupe auquel appartient le propriétaire, en fin les trois derniers caractères sont les droits des autres utilisateurs, communément appelés le reste du monde. La signification de ces caractères est la suivante :
- r : permission de lecture (read) ;
- w : permission d’ecriture (write) ;
- x : permission d’exécution (execute) ;
- - : pas de permission.
Un utilisateur qui a le droit de lecture sur un fichier peut en consulter le contenu. Un utilisateur qui a le droit de lecture sur un répertoire peut consulter la liste des fichiers qu’il contient, ce qui ne signifie pas que cet utilisateur puisse consulter leur contenu. De plus, pour avoir la liste étendue des fichiers (ls –l) d’un répertoire autorisé en lecture, il faut aussi que ce dernier offre également le droit d’exécution.
Un utilisateur qui a le droit en lecture sur un répertoire peut consulter la liste des fichiers qui se trouve dans le répertoire.
Un utilisateur qui a le droit d’écriture sur un fichier peut modifier son contenu. Un utilisateur qui a ce même droit sur un répertoire peut y créer des fichiers, mais ne pourra modifier les fichiers existants que s’il possède aussi les droits d’écriture sur ces fichiers.
Un utilisateur qui a le droit en écriture sur un répertoire peut créer ou de supprimer les fichiers présents dans le répertoire, à condition de disposer aussi du droit d’exécution.
Le droit d’exécution signifie pour un fichier qu’il est exécutable comme une commande. Dans le cas d’un répertoire, le droit x est un droit de recherche dans ce répertoire.
Dans l’exemple suivant la commande ls-l permet d’obtenir la liste des droits concernant trois fichiers cmd1, F1 et liste :
-rwxr-x--- 1 marc sys 256 Nov 2 15:46 cmd1
-rw-rw--r - 1 nadege public 170 Aug 2 14:16 F1
-rw-rw- r- - 1 aurore public 3456 Dec 8 11:52 Liste
Le premier caractère indique le type de fichier :
- - : fichier ordinaire
- d : répertoire
- c ou b : fichier spécial.
Les 3 caractères suivants indiquent les droits d’accès du propriétaire :
- r : permission de lecture (read).
- w : permission d’écriture (write).
- x : permission d’exécution.
- - : pas de permission.
Ensuite, apparaissent les droits d’accès pour les membres du groupe auquel appartient le propriétaire du fichier : caractères 5, 6 et 7. En fin, les 3 derniers caractères (numéros 8, 9 et 10) représentent les droits des autres utilisateurs du système.
Dans la liste précédente, le fichier cmdl appartient à marc du groupe sys. Le propriétaire, marc, peut le lire, le modifier ou l’exécuter, les membres du groupe sys ont le droit de le lire ou de l’exécuter, mais ils n’ont pas le droit de le modifier, et les autres n’ont aucun droit. Les fichiers F1 et Liste qui appartiennent à nadege et aurore, du groupe public, sont lisibles par tous, mais ne peuvent être modifiés que par les membres du groupe public, dont bien sûr leurs propriétaires respectifs.
Certaines commandes posent le problème suivant : pour s’exécuter, elles doivent donner des permissions qu’un utilisateur ne devrait normalement pas avoir. L’exemple le plus évident est celui de la commande « passwd » qui permet de modifier le mot de passe. Cette commande modifie le fichier « /etc/passwd » (ou le fichier « /etc/shadow ») qui contient entre autres les mots de passe cryptés de tous les utilisateurs, alors que l’utilisateur normal n’a pas les permissions d’écriture sur ce fichier.
Pour résoudre ce problème, le système donne temporairement à un utilisateur, les droits nécessaires sur le fichier « /etc/passwd », et uniquement durant le temps le temps d’exécution de la commande. L’administrateur a donc la possibilité de positionner le « set user id » bit, qui assure de manière temporaire les droits du propriétaire. Le « set group id » bit donne les droits du groupe.
Un fichier dont le SUID bit est positionné est un fichier exécutable avec les droits de son propriétaire. Un fichier dont le SGID bit est positionné est un fichier exécutable avec les droits du groupe de son propriétaire. Un processus qui s’exécute avec le SUID bit positionné a son UID effectif égal à l’UID du propriétaire du programme correspondant. Un processus qui s’exécute avec le SGID bit positionné a son GID effectif égal au GID du programme correspondant.
Ces règles ne vont pas sans poser un certain nombre de problèmes au niveau de la sécurité. En effet, un utilisateur qui exécute un programme appartenant à root et dont le SUID est positionné dispose automatiquement des droits du super-utilisateur le temps de ce programme.
Le sticky bit a un rôle tout à fait particulier. Si un programme est très fréquemment utilisé, il peut être souhaitable, pour des raisons de performances, que son code réside en permanence en mémoire. On gagne ainsi à chaque appel le temps de chargement en mémoire à partir de son disque de résidence. Pour qu’il reste résident en mémoire, on positionne le sticky bit, ou plus exactement le « bit collant ». Tout fichier exécutable dont le sticky bit est positionné reste en mémoire après son exécution. Il y a, bien sûr, un équilibre à trouver entre la mémoire disponible et le temps d’exécution. Positionner le sticky bit est un privilège de l’administrateur du système. Les améliorations apportées à la gestion de la mémoire ont rendu son utilisation obsolète.
Modifier le statut d’un fichier revient à changer ses droits d’accès, ou son propriétaire ou son groupe, ou encore les trois attributs. Tout fichier ou répertoire créé sur UNIX appartient à un propriétaire qui est généralement le créateur du fichier, et par conséquent un utilisateur connu du système. Tout utilisateur du système UNIX fait partie d’un groupe utilisateurs et ce groupe fait partie des caractéristiques du fichier. Enfin, comme UNIX est Multi-Utilisateur, un fichier est protégé par des droits d’accès que seul son propriétaire peut modifier, si l’on fait exception des privilèges particuliers de l’administrateur du système. Modifier les droits d’accès d’un fichier ou d’un répertoire revient à modifier son mode.