3. Systèmes de fichiers

a. Arborescence et hiérarchie du système de fichier

Le système de fichiers est la manière dont l'OS organise, maintient la hiérarchie des fichiers au sein des périphériques de stockage, normalement des disques durs. Les utilisateurs du systèmes voient une arborescence de fichiers uniques. Mais celle ci est en fait l'unification de plusieurs arbres, chacun de ceux-ci pouvant être stockés sur un disque local, ou être un arbre distant, par le réseau. Celle-ci est réalisée en en attachant la racine d'une partition à un répertoire d'une partition déjà active : c'est ce qu'on apelle "monter" un système de fichiers. On va pouvoir ainsi cloisonner différentes parties de l'arborescence du système de fichier. Différentes arborescences contenant une catégorie de fichiers particulière peuvent être décrites ainsi (leur liste n'est pas exhaustive):

La sécurité du fonctionnement d'un système est fortement influé par la manière dont celui-ci est organisé, grâce à différents systèmes de fichiers. Si un système de fichiers est endommagé, les dégats seront ainsi limités à l'arborescence qu'il contenait. Une bonne division du système de fichier va permettre à l'administrateur de cloisonner l'espace pour certains utilisateurs ou programmes. Dans la mesure ou les droits de création de certains utilisateurs sont limités à certains répertoires, l'administrateur est certain qu'ils n'auront pas plus d'espaces que celui disponible sur la partition de ce système de fichier.

Note : De plus, le morcellement des fichiers (souvent appellé fragmentation) est limité au système de fichiers, et donc à la partition sur laquelle ceux-ci se trouvent.


On peut identifier plusieurs sous-arborescences importantes, dont le cloisonnement va dans le sens de la sécurité des systèmes. D'une manière générale, on va laisser "/bin" sur le système de fichiers racine ("/"), et "/etc", à fin qu'un système démarrant en mode dégradé, avec seule la partition racine et sans aucun autre système de fichers monté, puisse fonctionner de manière basique, avec les utilitaires systèmes essentiels et les fichiers de configuration système, pour pouvoir les modifier si un de ceux ci empêche le système de fonctionner normalement. Ainsi que cela a été vu précedemment, "/var", "/var/log" et "/tmp" contiennent des fichiers temporaires, ou dont la taille et le nombre seront appelés à fluctuer grandement, donc on va les placer sur des systèmes de fichiers bien séparés, et donc limiter les retentissement d'un DOS sur une de ces partitions sensibles. De la même manière, même si on place des quotas par utilisateurs, on va cloisonner la partition "/home" si des utilisateurs autres que le super-utilisateur utilisent cette machine. Traditionnellement, "/boot" est également séparée, mais cela vient du fait qu'historiquement, le le noyau devait se trouver avant le 1024ième cylindre du disque dur. "/usr" pourra aussi être placé sur un système de fichier séparé, et être ainsi monté en lecture seule, de manière à empêcher la modification des fichiers des logiciels installés sur ce système (lors de l'installation de nouveaux logiciels, on remontera temporairement ce système de fichier en écriture). Ce cloisonnement peut être étendu selon les spécificités du système Gnu/Linux et les services qu'il offre, donc il est difficile d'édicter des règles absolues, celles ci se font au cas par cas.

Note : On pourra créer des partitions de tailles identiques, de manière à pouvoir clôner des systèmes de fichiers à fin de sauvegarde.

b. Choix du système de fichiers

Le noyau Linux supporte différents systèmes de fichiers, ce qui permet à l'utilisateur d'avoir le choix entre ces différents systèmes.

Tous les systèmes d'exploitation modernes supportent plusieurs systèmes de fichiers, éventuellement très différents. Pour préserver la modularité de l'OS et pour fournir des applications avec une interface de programmation identique (API), une nouvelle couche d'abstraction qui implémente les fonctionnalités communes des différents systèmes de fichiers sous-jacents est ajoutée au noyau : c'est le Système de Fichiers Virtuel (VFS pour Virtual File System).


Le système de fichiers standard sous Gnu/Linux est à l'heure actuelle ext2fs. Ext2 fut créé par Wayne Davidson en collaboration avec Stephen Tweedie et Theodore Ts'o. C'est une amélioration du système de fichiers précédent ext fait par Rémy Card. Ext2fs est un système fondé sur l'i-node, qui contient les méta-données associées aux fichiers et les pointeurs vers les blocs physiques de celui-ci.


Pour accélérer les opérations d'E/S, les données résident temporairement en RAM au moyen des sous-systèmes de buffer cache et page cache. Le problème intervient lorsqu'un crash du à une coupure électrique survient avant que les données modifiées de la RAM (tampons "sales") n'aient été écrites sur le disque. Cela impliquerait une incohérence du système tout entier, par exemple un nouveau fichier qui n'avait pas été créé sur le disque ou des fichiers effacés mais dont les i-nodes et blocs de données correspondants résideraient encore sur le disque.


Un système de fichiers journalisé (SFJ) est un système qui réagit aux erreurs : l'intégrité des données est assurée au moyen de mises à jour des méta-données des fichiers dans des fichiers journaux (log files) écrits avant que les blocs disques originaux soient eux-mêmes mis à jour. Lors d'un évenement telle qu'une défaillance du système, un fichier exhaustif relatif au système de fichiers assure que le système de fichier est restauré. L'approche la plus commune est une méthode de journalisation ou de consignation (journaling or logging) des métadonnées des fichiers. Dès lors, à chaque fois que quelque chose est modifié dans ces métadonnées, cette nouvelle information est sauvegardée dans un endroit spécifique du système de fichiers. Celui-ci écrira les données elles-même seulement après l'écriture complète de ce log. Quand un crash surviendra, le programme de récupération du systéme analysera ces fichiers de métadonnées et essaiera de nettoyer seulement les fichiers incohérents en rejouant le fichier de log.


Le noyau Linux stable actuel reconnaît différents systèmes de fichiers journalisés. Il s'agit de Ext3, ReiserFS, XFS, et JFS. On recommandera l'utilisation de ce type de système de fichiers, car en cas de grosse défaillance du système, ceux ci vous assurerons une grande chance de récupération des données. Je conseillerais à titre personnel plutôt EXT3, de par sa compatibilité avec EXT2, système de fichier historique des systèmes GNU/Linux, donc lisible en tant que qu'EXT2 si vous devez procéder à une intervention d'urgence et ne disposez que d'un noyau Linux générique, donc incapable de lire les systèmes de fichiers journalisés. Si vos partitions sont en EXT2, vous pouvez les convertir facilement et à chaud, avec la commande suivante, si la partition à convertir est sda1 (premier périférique SCSI) :

mke2fs -j /dev/sda1


Différents test pourront vous prouverons que ReiserFS, Ext3, ou XFS sont plus perfomants que les autres systèmes de fichiers journalisés, mais ils seront rarement objectifs, car les performances dépendent grandement des conditions de test, ainsi ReiserFS est connu pour son efficacité sur les fichiers de petites tailles.


c. Sécurisation

Le système Gnu/Linux est vu sous forme de fichiers, il est donc primordial de gérer correctement les droits sur ces fichiers et répertoires. Il ne faut pas que les droits sur les fichiers sensibles soient trop laxistes. L'accès à une ressource ou à une commande sensible peut compromettre l'ensemble du système en cas d'attaque. Les protections positionnées sur les fichiers (et donc les répertoires, qui sont eux aussi des fichiers, en fait) sont constitués de trois triplets qui correspondent aux permissions données au propriétaire (user, utilisateur) du fichier, au groupe du propriétaire (group, groupe), et au reste du monde (others, autres). Chaque triplet est composé du droit de lecture (r pour rad, lecture), d'écriture (w pour write, écriture), et d'exécution (x pour execute, exécution). Les droits sont à toujours placer au plus restrictif, et les commandes suivantes permettent d'identifier les fichiers avec des droits potentiellement intéressants :


Trouver les fichiers en écriture pour tous :

# find / -type f -perm -o+w -ls


Trouver les répertoires en écriture pour tous :

# find / -type d -perm -o+w -ls


Note : deux répertoires particuliers doivent être accessibles en écriture pour tous, il s'agit de /tmp et de /var/tmp, mais ceux ci ont un droit particulier, appelé « sticky bit », n'autorisant que les créateurs des fichiers d'y accéder en écriture, et donc de les modifier et de les supprimer.


L'utilisation abusive des droits SETUID et SETGID constituent également une cause de vulnérabilité importante. Ces deux droits particuliers sont relatifs à l'identité de la personne exécutant les binaires sur lesquels ces droits sont positionnés (ceci ne concerne pas les scripts, seulement les binaires). Si le bit SETUID est positionné, tout utilisateur lançant ce programme le fera sous l'identité de l'utilisateur propriétaire du fichier, et sous l'identité du groupe propriétaire du fichier dans le cas du bit SETGID. Un utilisateur non privilégié peut ainsi acquérir des droits supplémentaires grâce à ces bits particuliers, et ainsi potentiellement exploiter une faille dans l'exécutable. On peut lister tous les programmes avec les bit SETUID et SETGID avec les deux lignes de commandes suivantes :


# find / -perm -4000 -type f -ls
# find / -perm -2000 -type f -ls


Une alternative très intéressante à ces droits particuliers est l'utilitaire sudo. Ce dernier permet de déléguer le droit à un utilisateur d'exécuter une commande particulière sous une identité qui n'est pas la sienne. Sa configuration est très simple, on édite les droits avec la commande « visudo », en spécifiant quel utilisateur ou groupe a le droit d'exécuter quelle commande depuis quel hôte, avec ou sans mot de passe.


Les options de montage des systèmes de fichiers permettent également d'améliorer la sécurité d'un système. On pourra par exemple interdire les bits SETUID et SETGID, ou monter une partition en lecture seule pour en interdire toute modification, très utile sur la partition /usr par exemple, de manière à empêcher toute modification des logiciels installés sur la machine.



2. Utilisateurs, mots de passes, et authentification
Sommaire
4. Réseaux