Protéger les fichiers sur un système Unix revient à les doter d’un ensemble de caractères spécifiques qui permettront au système, à tout instant, de déterminer qui a le droit de lire, qui a le droit d’écrire ou encore qui a le droit d’exécuter ce fichier si ce dernier est un module exécutable.
Le contrôle d’accès aux fichiers peut être de deux types, discrétionnaire ou mandaté.
En cas de contrôle d’accès discrétionnaire (DAC : Discretionnary access Control), l’utilisateur a la responsabilité du choix de protection des fichiers. C’est un mode de contrôle qui détermine l’accès aux fichiers en fonction de l’identité de l’utilisateur à qui ils appartiennent. Ce mode est donc fondé sur la notion de propriété. Le propriétaire d’un fichier est l’utilisateur qui l’a créé. Un fichier appartient donc à un utilisateur, et ce dernier indique au système quels sont ceux qui auront les permissions d’accès. Il y a en général trois types d’accès :
- l’accès en lecture signifie qu’un utilisateur donné a le droit de lire le contenu du fichier ;
- l’accès en écriture signifie qu’un utilisateur ayant ce droit peut modifier le fichier ou encore le détruire ;
- le droit d’exécution signifie qu’un utilisateur a le droit d’exécuter ce fichier, à condition toutefois qu’il s’agisse d’un code exécutable par le système.
Toutes les informations concernant le propriétaire et les droits d’accès à un fichier figurent dans l’en-tête de ce fichier ou dans un emplacement particulier du système de fichiers contenant les caractéristiques des fichiers.
Le monde des utilisateurs est en général divisé en trois ensembles :
- user représente l’utilisateur lui-même, celui qui a créé le fichier ;
- group représente le groupe d’utilisateurs, c’est-à-dire un ensemble d’utilisateurs dont fait partie le propriétaire du fichier ;
- other représente les autres ou encore le reste du monde.
Sur UNIX, chaque utilisateur peut créer des fichiers et des répertoires et appartient à un groupe. Il peut donc partager des fichiers avec les autres membres de son groupe. Enfin, il peut, s’il le désire, donner aux autres utilisateurs, quel que soit leur groupe d’appartenance, le droit d’accéder à certains de ses fichiers et de ses répertoires. Toutes ces autorisations d’accès sont gérées par la mise en place de droits d’accès aux fichiers et répertoires.
En cas de contrôle d’accès mandaté (MAC : Mandatory Access Control), ce sont les systèmes qui se chargent de la protection des fichiers. Ce type de contrôle concerne essentiellement les ordinateurs qui manipulent des données très sensibles du type Secret Défense. Chaque objet existant dans un système donné se voit affecté d’un code de sensibilité.
La notion d’objet, prise au sens large, concerne aussi bien des fichiers, des pilotes de périphériques, des répertoires ou des fenêtres. Cette liste n’est pas exhaustive. Ces objets sont manipulés par des acteurs, ou encore des sujets, qui sont représentés par les divers utilisateurs et les divers programmes que ces derniers utilisent. Chaque acteur est aussi doté d’un code de sensibilité. Pour un utilisateur, ce code représentera le degré de confiance qu’il est possible de lui accorder et, de ce fait, le code de sensibilité associé à un fichier représentera le degré de confiance que doit avoir un utilisateur pour pouvoir y accéder, c’est-à-dire au moins le lire et au plus le modifier.
A titre d’exemple, supposons que les fichiers F1 et F2 soient affectés de la classification SECRET et que les fichiers F3 et F4 soient affectés de la classification CONFIDENTIEL. Ces codes de sensibilité sont évidemment ordonnés : TOP SECRET, SECRET, CONFIDENTIEL, PUBLIC.
De manière similaire, l’utilisateur User1 est classé SECRET et l’utilisateur User2 est classé CONFIDENTIEL. Alors l’utilisateur User1 aura accès aux fichiers F1, F2, F3 et F4 puisque son degré de confiance est supérieur au code de sensibilité des fichiers F3 et F4, et qu’il est égal au code de sensibilité des fichiers F1 et F2. Par contre l’utilisateur User2 n’aura pas accès aux fichiers F1 e F2, ne disposant pas d’un degré de confiance suffisant pour ces informations. Il peut cependant, suivant les cas, avoir seulement un accès en écriture ; ce qui signifie qu’il peut compléter la base d’informations de F1 et F2, sans pour autant avoir le droit d’aller lire ce que d’autres utilisateurs, ayant le même degré de confiance que lui, ont écrit.
D’autre part, l’utilisateur User1 peut fort bien avoir le droit de lire les fichiers F1 et F2, sans pour autant avoir le droit d’en modifier le contenu.
Tout utilisateur d’un système Unix dispose d’un identificateur (username) et d’un mot de passe (password). Ces deux éléments combinés avec le répertoire d’accueil représentent le point d’entrée ou compte (account) d’une personne sur le système. Cela ne signifie pas qu’une personne donnée ne puisse pas avoir plusieurs points d’entrée dans le système, mais que chacun d’entre eux correspondra à un identificateur différent. Un identificateur sur Unix est toujours unique et sa longueur est comprise entre un et huit caractères. Il est toujours préférable que cette longueur soit supérieure à trois.
Le fichier « /etc/passwd » est utilisé par le système pour définir ses utilisateurs. Chaque ligne de ce fichier correspond à un identificateur et décrit un certain nombre de paramètres qui lui sont liés. Chaque paramètre de la ligne est séparé du suivant par le caractère deux-points ( : ).
Le fichier « /etc/passwd » est accessible en lecture à tous les utilisateurs du système.
Certains identificateurs de login comme daemon, bin, sys ou uucp ne correspondent à aucun utilisateur véritable et représentent des services permanents du système. L’identificateur root correspond à l’administrateur du système.
La structure d’une ligne de ce fichier se présente sous la forme :
login :mot de passe :UID :GID :nom :répertoire-accueil :shell
Par exemple :
marc Identificateur.
iU8fT6/Dgf5Tbik Mot de passe chiffré.
1051 Numéro d’utilisateur : User Id ou UID.
1000 Numéro de groupe de l’utilisateur : GID.
Marc Boget Nom réel de l’utilisateur.
/users/marc Nom du répertoire d’accueil.
/bin/sh Nom du shell à la connexion.
Il existe différentes manières pour un utilisateur de se faire authentifier par un système informatique (empreinte digitale ou vocale, carte à puce, mot de passe …), le mot de passe est le système d’authentification privilégié par les systèmes Unix. Si cette technique n’est pas la plus sûre, c’est certainement la plus simple à mettre en œuvre.
En réponse à la procédure de connexion, le mot de passe est le premier élément d’authentification demandé par le système, c’est le moyen par lequel il saura que l’utilisateur est bien celui qu’il prétend être, à moins qu’il se soit fait voler son mot de passe.
Login : marc
Password : XXXXXX
En général, un utilisateur a droit à plusieurs essais. La tentative de connexion est cependant la plupart du temps conservée dans un fichier de trace. Sur certains systèmes, le nombre de tentatives pour un identificateur de login donné peut être limité ; lorsque cette limite est atteinte, il devient impossible de se connecter avec cet identificateur et seul l’administrateur du système peut redonner l’accès à la machine.
Pour disposer d’un bon système de mots de passe, la première règle consiste à ne jamais les écrire en clair quel que soit le support susceptible d’être utilisé. Les mots de passe cryptés sont effectivement conservés dans le fichier « /etc/passwd » (ou le fichier « /etc/shadow »), après avoir été cryptés par la fonction crypt(). Ce mot de passe n’est jamais déchiffré lors des connexions ultérieures ; en effet, la procédure le login se contente de chiffrer le mot de passe qui lui est fourni et de comparer le résultat avec le contenu du champ correspondant du fichier « /etc/passwd ». La fonction crypt() utilise un algorithme basé sur le DES (Data Encryption Standard) ou le MD5 (Message Digest 5). Un mot de passe chiffré par cette fonction ne peut plus être déchiffré, même en disposant du code source de la fonction crypt(). Lorsqu’on n’a pas mis en œuvre une gestion rigoureuse des mots de passe et de leur structure, une façon de procéder pour pénétrer dans un système Unix consiste à chiffrer tous les mots du dictionnaire et à vérifier si, par hasard, il n’y en aurait pas un identique dans le fichier « /etc/passwd ».
Pour un utilisateur, un bon mot de passe est un mot facile à retenir. Malheureusement, dans ce cas, ce qui est bon pour l’utilisateur est très mauvais pour la sécurité du système. Il existe différentes possibilités pour obliger les utilisateurs à changer souvent de mot de passe et pour une durée minimale, sinon il serait très facile de remettre tout de suite l’ancien mot de passe. Dans les cas extrêmes, il est préférable d’imposer le mot de passe aux utilisateurs, il sera soit généré aléatoirement par le système, soit décidé par l’administrateur lui-même. Le défaut évident de cette technique est que les utilisateurs auront la plupart du temps tendance à conserver leur mot de passe par écrit, puisque, ne l’ayant pas choisi eux-mêmes, ils auront du mal à s’en souvenir.
Les dernières versions d’Unix offrent aussi la possibilité de conserver les mots de passe cryptés dans des fichiers dits fantômes (shadow password file, « /etc/shadow »). Ces fichiers fantômes ne sont accessibles qu’à un tout petit nombre d’administrateurs afin d’éviter leur lecture et éventuellement leur décodage par comparaison avec un dictionnaire de mots cryptés.
Les notions d’identificateur d’utilisateur (UID) ou de groupe (GID) ont déjà été rencontrées. Il faut maintenant en préciser la définition et l’usage.
Chaque utilisateur d’un système Unix est doté d’un identifiant numérique que l’on appelle l’UID en abréviation de User-Identifier. Cet identifiant est un nombre codé sur seize bits utilisé par le système pour identifier l’utilisateur ; en principe, chaque utilisateur a un UID unique, mais le système ne l’impose pas et, si deux utilisateurs ont le même numéro d’UID, Unix les considérera comme une seule et même personne, ce n’est pas très sain du point de vue de la sécurité.
En règle générale, les UID dont la valeur va de zéro (0) à neuf (9) sont réservés aux tâches d’administration du système. Dans la plupart des cas, l’administrateur du système fera commencer les UID des utilisateurs à la valeur 50 ou 100, ou encore utilisera un facteur 10 ou 100 du numéro du groupe.
Il s’agit des différents utilisateurs standard que l’on peut rencontrer sur la plupart des systèmes Unix. Les plus courants sont les suivants :
- UID 0 : root
ð C’est en principe le super-utilisateur (UID 0), c’est celui qui a tous les droits et qui réalise l’administration du système. Tout utilisateur ayant une valeur d’UID égale à zéro est super-utilisateur, il faut toujours se souvenir que c’est la valeur de l’UID qui permet au système d’identifier un utilisateur et non pas son nom de connexion.
- UID 1 : daemon
ð Cet utilisateur a pour fonction d’exécuter des processus systèmes du type serveurs comme syslogd, rpc.statd, rpc.pcnfsd …
- UID 2 : bin
ð Il est propriétaire de certains programmes exécutables.
- UID 5 : uucp
ð C’est l’utilisateur du sous-système de copie de machine à machine (Unix to Unix copy program). Il est le propriétaire de toutes les commandes du sous-système uucp.
- UID -2 : nobody
ð C’est un numéro d’utilisateur utilisé par NFS.
Le super-utilisateur est l’utilisateur dont l’UID a pour valeur zéro ; en général il s’agit de root. C’est l’utilisateur qui dispose de tous les droits sur le système, c’est lui qui est propriétaire des fichiers sensibles et des commandes systèmes. Cet identificateur de login est utilisé pour mettre en œuvre les procédures de connexion et de déconnexion, la gestion des périphériques d’entrée/sortie, la gestion des numéros de compte…
5.3.1.B.3.b.1° - Les droits de l’administrateur du système :
L’utilisateur root dispose de nombreux droits, ces droits sont aussi attribués aux processus initialisés par le super-utilisateur puisque ces processus ont alors une valeur d’UID égale à zéro.
Le super-utilisateur peut modifier les priorités d’exécution des processus, leur envoyer des signaux (d’interception notamment), modifier les paramètres d’exécution comme le temps CPU, la taille des différents segments, le nombre de processus simultanés autorisé. Il a aussi la responsabilité de la comptabilité et des processus d’audit.
C’est aussi lui qui gère les processus serveurs de réseaux ou de périphériques. Il a la haute main sur tous les fichiers du système, sur les identifiants des utilisateurs, etc.
Cependant, il existe un certain nombre d’actions qu’il ne peut pas réaliser, comme déchiffrer les mots de passe des utilisateurs ou modifier un système de fichier monté en lecture.
Les utilisateurs font toujours partie d’au moins un groupe. Ces groupes ont un numéro de groupe, le GID (Groupe Identifier), et en général un nom. C’est l’administrateur du système qui affecte les utilisateurs à un groupe ou à plusieurs groupes. Lorsqu’il y a plusieurs groupes, il existe un groupe privilégié, dit primaire, dont le numéro figure dans le fichier « /etc/passwd ». Parmi ces groupes, il en existe qui disposent de droits particuliers, ce sont en général des groupes d’administration du système.
La répartition en groupes permet de différencier les utilisateurs suivant leur activité, suivant leurs droits.
Les différents groupes du système sont définis dans le fichier « /etc/group ».
La structure d’une ligne de ce fichier « /etc/group » se présente de la façon suivante :
- le premier champ représente le nom du groupe.
- le second champ représentait à l’origine le mot de passe du groupe, il n’a plus d’utilité et il est remplacé par un astérisque.
- le troisième champ est le numéro du groupe, c’est-à-dire le GID.
- le dernier champ représente la liste des membres du groupe.
Il s’agit des différents groupes que l’on peut rencontrer sur la plupart des systèmes Unix. Les plus courants sont les suivants :
- GID 0 : root
ð C’est en principe le groupe du super-utilisateur (GID 0), c’est celui qui permet à ses membres de devenir administrateur du système. Il porte aussi les noms de groupe « wheel » ou groupe « system ».
- daemon :
ð les membres de ce groupe sont les utilisateurs du type daemon, il possède les droits d’accès sur le répertoire « /var/spool », s’occupent de toutes les commandes liées au réseau et au transfert de données.
- tty :
ð ce groupe est propriétaire des pilotes de périphériques des terminaux.
Pour identifier un utilisateur à son arrivée, le système demande un nom d’utilisateur (login), puis un mot de passe. Ce mot de passe est ensuite chiffré, puis comparé avec celui correspondant au login dans la base d'utilisateurs « /etc/passwd » ou « /etc/shadow ». Le problème de cette méthode « traditionnelle » est la difficulté de changer la procédure. Par exemple dans le cas simple où nous ne souhaitons autoriser les logins du root que sur les deux premières consoles (tty1 et tty2), il est obligatoire de modifier les sources des programmes concernés, avec tous les risques que cela comporte.
Les Pluggable Authentification Modules sont destinés à simplifier la vie de l’administrateur système. Ils permettent de changer la politique d’authentification sans avoir à recompiler le moindre programme. La seule chose à faire est de modifier un fichier de configuration.
Comme son nom l’indique, PAM est constitué de modules. Ainsi, pour chaque type de service, on peut définir le ou les modules de son choix. Il existe quatre grandes familles de modules :
- modules auth : ils sont utilisés pour une authentification classique (login et mot de passe).
- modules account : ils ont la charge de vérifier si l’identification est autorisée (expiration de compte, plage horaire de connexion).
- modules password : comme le nom l’indique, ils sont utilisés pour vérifier les mots de passe.
- modules session : ils sont utilisés à l’intérieur de la session de l’utilisateur (après authentification). Ils permettent de contrôler par exemple l'accès aux répertoires home et aux boîtes aux lettres.
Il est également possible de combiner les modules pour obtenir les effets de son choix avec les services de son choix. Chaque application utilisant PAM définit un service. Ainsi, le programme login utilise le service login, ftpd le service ftp, rlogin le service rlogin, etc.