10
La sécurité et la protection des objets externes
L'utilisateur qui confie des données à un
système informatique s'attend à un certain service, et en
particulier, désire une certaine garantie de retrouver ses données
à tout moment, dans l'état exact où il les a
laissées. Nous distinguerons d'une part, une altération due
à une mauvaise utilisation des opérations sur les données
et d'autre part, une altération de ces données par suite de
défaillance du matériel ou du logiciel. Dans le premier cas, on
parle de protection pour désigner l'ensemble des méthodes
qui spécifient les règles d'utilisation des opérations.
Dans le deuxième cas, on parle de sécurité pour
désigner l'ensemble des méthodes qui assurent que les
opérations se déroulent conformément à leur
spécification, même en cas de défaillance. La
sécurité concerne la spécification de chaque
opération, alors que la protection concerne les règles
d'utilisation des opérations.
10.1. Les mécanismes de protection
10.1.1. La protection par droits d'accès
Le premier mécanisme proposé par de nombreux
systèmes est basé sur la notion de droits d'accès. Pour
chaque objet externe et pour chaque utilisateur, on définit les
opérations qui sont autorisées. Lors d'une demande
d'établissement d'un lien entre un programme et un objet externe, les
paramètres de la demande précisent les opérations que le
programme désire effectuer sur l'objet externe, et le système
vérifie que l'utilisateur, pour le compte de qui travaille le programme,
est bien autorisé à effectuer ces opérations.
En général, on distingue peu d'opérations
différentes sur les objets externes. Les opérations essentielles
sont la lecture, l'écriture et éventuellement
l'exécution, sauf pour les répertoires où les
opérations essentielles sont la recherche, la
création et la modification d'une entrée, en plus de
l'opération de lecture de l'ensemble des entrées, pour en faire
une liste. Dans Unix les droits d'un utilisateur sur un objet sont
définis par trois bits appelés rwx:
r correspond au droit de lire le contenu de l'objet
quelle que soit sa nature,
w correspond au droit de modifier le contenu de l'objet
quelle que soit sa nature,
x sur un répertoire permet d'y rechercher une
entrée, alors que sur les autres objets, il permet de
l'exécuter.
Par ailleurs, lorsque le nombre d'utilisateurs du
système est important, il n'est guère envisageable de disposer
pour chaque objet des droits d'accès à cet objet pour chacun des
utilisateurs pris individuellement. D'une part ceci conduirait à une
occupation d'espace qui ne serait pas négligeable, mais d'autre part ceci
demanderait à être défini lors de chaque création
d'objet. Les systèmes proposent en général des restrictions
sur cette définition, et des règles implicites de
définitions. Il est courant, par exemple, d'établir des groupes
d'utilisateurs, et de définir les droits par groupe.
- Multics a introduit la notion de projet, pour
regrouper des utilisateurs; tout utilisateur lors de son identification par le
système (login), indique implicitement ou explicitement le projet sous
lequel il désire travailler. La protection peut alors être
définie par projet, c'est-à-dire, globalement pour tous ceux qui
travaillent sous ce projet, ou par utilisateur quel que soit le projet, ou enfin
pour un utilisateur particulier lorsqu'il travaille sous un projet donné.
Par exemple, la définition des droits
<r, COMPTABLE.*>, <rw, COMPTABLE.Jean, *.Paul>
permet
à tous ceux qui travaillent sous le projet
COMPTABLE de lire l'objet externe, alors
que peuvent le lire et y écrire, d'une part
Jean lorsqu'il travaille sous ce projet, et
d'autre part Paul quel que soit le projet
sous lequel il travaille.
- Dans Unix, on définit également la
notion de groupe d'utilisateurs, mais pour simplifier la représentation
de l'ensemble des droits d'accès à un objet externe, on ne peut
les définir que pour trois catégories d'utilisateurs: le
propriétaire, les membres d'un groupe donné attaché
à l'objet et les autres. Dans l'exemple précédent, si
Jean est propriétaire de l'objet et
membre du groupe COMPTABLE attaché
à l'objet, on peut définir les droits suivants:
rw- r-- ---
c'est-à-dire
rw au propriétaire,
r aux membres du groupe, et aucun
accès aux autres. Remarquons que l'on ne peut fournir l'accès
rw à Paul dans ce cas, à
moins de devoir le fournir à tous.
- Windows NT utilise également la notion de
groupe d'utilisateurs, un utilisateur pouvant appartenir à plusieurs
groupes en même temps. A chaque objet est associée une liste de
contrôle d'accès. Par exemple,
<~r, Pierre>, <r, COMPTABLE>, <rw, Paul>
interdit
à Pierre la lecture de l'objet, même s'il appartient au groupe
COMPTABLE, permet à tous ceux du
groupe COMPTABLE de lire l'objet externe,
et autorise Paul à lire et
écrire dans l'objet. Notons que, dans ce système, la nature des
accès contrôlés sont plus étendus que ceux vus
jusqu'à maintenant. Certains sont standards quelque soit le type de
l'objet, comme par exemple le droit de supprimer l'objet, d'autres sont
définis en même temps que la définition de ce
type.
- Dans beaucoup de systèmes les
utilisateurs sont rattachés à un numéro de compte qui sert
à la facturation du coût machine. Dans l'entreprise, ce
numéro de compte désigne alors un service ou un
département. La définition des droits d'accès se fait alors
en donnant la liste des numéros de compte autorisés à lire
et ceux autorisés à
écrire.
10.1.2. La protection par mot de passe
Le deuxième mécanisme de protection est
lié à l'utilisation de mots de passe. Lorsqu'un programme demande
d'établir un lien avec un objet externe, le système recherche,
dans une première étape, l'objet lui-même. S'il le trouve,
et que son descripteur indique la présence d'un mot de passe, le
système interrompt provisoirement l'opération d'ouverture, avec un
code d'erreur particulier. Le programme peut récupérer cette
erreur et exécuter une séquence d'instructions qui a pour but de
fournir le mot de passe. Au retour de cette séquence d'instructions, le
système contrôle la validité de ce mot de passe, et termine
l'ouverture correspondante. Si le programme n'a pas prévu de
récupérer cette erreur, ou s'il l'a récupérée
mais n'a pas fourni le bon mot de passe, la liaison n'est pas établie, et
le programme arrêté. Un mécanisme analogue est mis en place
lors de la création d'un objet avec mot de passe. De cette façon,
le mot de passe n'apparaît pas dans le langage de commande qui
définit la liaison, mais est toujours fourni par le programme
lui-même.
Notons que la protection par mot de passe n'est efficace que
si les mots de passe ne sont pas divulgués, et ne peuvent être
découverts qu'avec grande difficulté.
10.2. Les mécanismes de sécurité
Le problème de la sécurité est en grande
partie lié aux défaillances du matériel ou du logiciel. Il
est plus ou moins bien résolu par deux méthodes, la redondance
d'informations et la sauvegarde périodique. Notons que la sauvegarde
périodique est également une certaine forme de
redondance.
10.2.1. La sécurité par redondance interne
La redondance interne consiste à structurer les
données de telle sorte que toute information de structure puisse
être déterminée de deux façons au moins, l'une
étant l'information dite primaire, l'autre étant
l'information secondaire. L'information primaire est l'information de
base, l'information secondaire est souvent utilisée pour
accélérer les accès. On vérifie en permanence la
cohérence entre les informations primaires et les informations
secondaires. En cas d'incohérence, ou de perte des informations
secondaires on utilise les informations primaires pour reconstruire les
informations secondaires.
On peut imaginer par exemple que chaque secteur (ou
éventuellement bloc) du disque comporte deux parties,
l'en-tête et le contenu. L'en-tête contient les
informations primaires permettant de savoir à quel objet appartient ce
secteur, quelle est sa position relative dans l'objet (numéro logique) et
quelle est sa position absolue sur le disque. Le contenu est la partie de
l'objet externe qui est mémorisée dans ce secteur. Les
informations primaires ne sont pas utilisées pour localiser les objets ou
les parties d'objets, mais pour contrôler que le secteur
accédé est bien celui qui est recherché,
c'est-à-dire, qu'il appartient bien à l'objet, qu'il correspond
bien à la position physique demandée sur le disque et à la
position relative demandée dans l'objet. L'objet lui-même peut
être complété par un en-tête mémorisé
dans un secteur dont le contenu contient la désignation symbolique
absolue de l'objet ainsi que des informations complémentaires
situées dans le descripteur (protection, identification du
propriétaire, nature, etc...). Cet en-tête est également une
information primaire. Les informations secondaires sont situées dans les
divers répertoires et les descripteurs des objets, qui sont
utilisés normalement pour les accès efficaces. En cas d'anomalie,
on voit qu'il est possible (mais long) de parcourir tous les secteurs du disque
pour accéder aux informations primaires, et reconstruire les informations
secondaires correspondantes.
Un mécanisme de ce type a été mis en
œuvre dans l'Alto et le système Pilot de Xerox. Certains
contrôleurs de disques implantent une partie de cette méthode, en
mémorisant dans l'en-tête des secteurs, lors du formatage, le
numéro de disque, cylindre, face et secteur, et vérifient la
concordance lors de la lecture ou l'écriture d'un secteur.
Cette méthode est en fait assez lourde, et occupe de la
place. Aussi beaucoup de systèmes ne l'appliquent que partiellement. Par
exemple, MS-DOS dispose de deux exemplaires de la FAT sur le disque. Un seul
exemplaire est lu en mémoire centrale lorsque nécessaire, la
recopie sur disque étant faite systématiquement dans les deux
exemplaires. S'il s'avérait que le système soit incapable de
relire le premier exemplaire, il accèderait alors au second, et le
recopierait immédiatement dans le premier. De même, dans la plupart
des systèmes, la représentation de l'espace libre sur disque est
une information secondaire. Elle peut être reconstruite en recherchant les
secteurs qui ne sont pas actuellement alloués à un objet
externe.
10.2.2. La sécurité par sauvegarde périodique
La redondance peut être obtenue par sauvegarde
périodique. Il s'agit alors de prendre une copie exacte de l'ensemble des
objets externes et de leur structure. Cependant, l'important est plus de pouvoir
reconstruire la structure que de pouvoir utiliser la copie. Il s'ensuit que la
sauvegarde peut se faire sur un support moins coûteux, comme par exemple
sur bandes magnétiques. Si l'on sauvegarde la totalité des objets,
on dit que l'on a une sauvegarde complète. Il faut noter cependant
que, avec un débit de 500 Ko/s, il faut 35 minutes et 7 bandes pour
sauvegarder 1 Go. C'est pourquoi, on ne peut la faire trop souvent.
On évite cette difficulté tout d'abord en
faisant la sauvegarde par volume. Pour avoir des volumes dont la taille soit
raisonnable pour ces sauvegardes, certains systèmes (MS-DOS ou Unix)
permettent de partitionner un disque physique en plusieurs volumes
indépendants. La notion d'arborescence unique telle qu'on la trouve dans
Unix permet de cacher ce partitionnement à l'utilisateur, tous les
volumes d'un disque donné étant montés en même temps
par l'opérateur. Il est alors judicieux de faire en sorte que les objets
soient placés sur les volumes en fonction de leur plus ou moins grande
évolution dans le temps. Par exemple, on peut dédier un volume
à l'ensemble des objets externes des utilisateurs, ou un volume par
groupe d'utilisateurs; un autre volume peut être réservé
à la documentation en ligne du système, un volume à
l'ensemble des outils courants de la chaîne de production de programmes,
etc... La sauvegarde périodique ne doit alors concerner que les volumes
des utilisateurs, les autres n'étant pas modifiés pendant de
longues périodes. On parle parfois de sauvegarde de reprise dans
ce cas.
L'inconvénient de la sauvegarde par volume telle
qu'elle vient d'être présentée est de sauvegarder
systématiquement les objets du volume, même s'ils n'ont pas
été modifiés depuis la dernière sauvegarde. On peut
éviter cet inconvénient si pour chaque objet on connaît la
date de sa dernière modification: il suffit de ne sauvegarder que ceux
dont cette date est postérieure à la dernière sauvegarde.
C'est ce que l'on appelle la sauvegarde incrémentale.
Périodiquement, un programme spécial est activé, qui
parcourt l'ensemble des objets de l'arborescence unique (ou par volume), et
recopie sur bande ceux qui ont été modifiés depuis la
dernière sauvegarde périodique. En général, on ne
recopie que les objets qui ne sont pas ouverts en modifications, pour garantir
que la copie soit intrinsèquement cohérente.
Lorsqu'on constate une incohérence ou une perte
d'objets, il faut restituer leur état le plus récent à
partir des sauvegardes. Ceci est obtenu en remontant les sauvegardes
incrémentales successives, jusqu'à trouver l'objet
concerné. Pour éviter de devoir remonter trop loin dans le temps,
on effectue de temps en temps des sauvegardes de reprise, qui permettent
d'arrêter cette recherche. Par ailleurs, lorsque la totalité du
volume est perdu, on utilise alors la dernière sauvegarde de reprise de
ce volume pour restaurer le volume dans un état initial, sur lequel on
applique ensuite les modifications constatées dans les sauvegardes
incrémentales postérieures, dans l'ordre des dates. Pour faciliter
l'accès aux sauvegardes incrémentales, celles-ci sont parfois
réalisées sur un disque dédié. Comme, en principe,
la proportion des objets modifiés est faible par rapport à
l'ensemble des objets, cela ne nécessite pas de doubler l'espace disque
total de l'installation.
La périodicité et la durée de
conservation des sauvegardes dépendent de leur nature. Le tableau suivant
donne une idée de la valeur de ces paramètres.
nature de la sauvegarde
|
période
|
conservation
|
incrémentale
|
8 heures
|
15 jours
|
reprise
|
7 jours
|
3 mois
|
complète
|
1 mois
|
1 an
|
Notons que cela implique de conserver au total 45 sauvegardes
incrémentales, 13 sauvegardes de reprise et 12 sauvegardes
complètes. Si on suppose qu'une sauvegarde incrémentale
représente 5% de l'ensemble des objets, cela ne représente qu'un
peu plus de 2 sauvegardes complètes. La conservation représente
donc, en capacité, 27 fois l'espace total. La sauvegarde complète
doit être exécutée sans qu'aucun accès aux objets ne
soit autorisé, de façon à représenter une
véritable photographie de l'état de l'ensemble des objets. Cela
prendra donc 6 heures pour 10 Go. Les sauvegardes de reprise ne doivent pas
être effectuées pour l'ensemble des objets, mais par volume. On
peut donc les répartir sur tous les jours de la semaine, en sauvegardant
par exemple 1,4 Go par jour, ce qui prendra environ 50 minutes. Lors de la
sauvegarde de reprise d'un volume, ce volume ne doit pas être
modifié par les utilisateurs. Enfin les sauvegardes incrémentales
porteront sur 500 Mo, et prendront environ 17 minutes. Notons que celle-ci est
faite sans gêne pour les utilisateurs, l'ensemble des objets restant
accessibles.
L'ensemble de la procédure peut paraître
coûteuse, mais c'est le prix à payer pour offrir un minimum de
service continu fiable aux utilisateurs. Par ailleurs, les procédures
décrites n'offrent qu'une sécurité limitée, puisque
la sauvegarde incrémentale n'est effectuée que toutes les 8 heures
dans notre proposition. Si un incident survient juste à la fin de la
période, le travail effectué dans la période est perdu.
Dans un système temps partagé, le risque étant faible est
considéré comme supportable. Dans un contexte transactionnel, ce
n'est souvent pas acceptable. Les mécanismes mis en œuvre sont alors
dédiés à la base de données, mais sont assez voisins
dans le principe: un fichier journal mémorise les modifications
successives et joue le rôle de sauvegarde incrémentale
permanente.
10.2.3. Les disques à tolérance de panne
La capacité des disques est devenue telle que la
sauvegarde des informations peut prendre un temps considérable. D'un
autre côté, leur prix n'est plus un critère
économique important. On a donc imaginé des solutions qui
permettent de gérer une certaine redondance des données pour
diminuer les risques de perte entre deux sauvegardes espacées. C'est ce
que l'on appelle les disques RAID pour Redundant Array Inexpensive Disks.
5 types de RAID (1..5) ont été décrits initialement, et 2
sont effectivement utilisés (1 et 5).
Avant de les présenter, rappelons que nous avons vu en
9.2.3 qu'un volume pouvait être constitué de plusieurs partitions
situées sur des disques différents. Lorsque ces partitions sont de
même taille, il est possible de les découper en bandes de tailles
égales, chaque partition contenant le même nombre de bandes. On
peut alors entrelacer les bandes sur les différentes partitions comme
indiqué sur la figure 10.1: le volume commence sur la bande 1, se
poursuit sur la bande 2, puis la bande 3, etc. Notons que, en dehors de tout
aspect de tolérance aux pannes, cette organisation répartit les
accès sur l'ensemble des partitions et améliore les performances.
Ceci est parfois appelé RAID-0.
Fig. 10.1. Entrelacement des bandes sur
quatre partitions.
Les deux niveaux de RAID intéressants sont les
suivants:
- RAID-1, ou encore disques miroirs. La
redondance est obtenue en écrivant les données sur 2 disques ou
plus. En fait deux partitions sont nécessaires, par exemple les
partitions a et b, qui sont des copies l'une de l'autre. Lorsque la bande 1 est
écrite, elle est dupliquée sur la bande 2, et ainsi de suite. Les
lectures, par contre, peuvent être faites sur n'importe laquelle des
partitions. En cas de panne sur l'un des deux disques, les données sont
encore accessibles sur l'autre, sans aucune perte. On peut constater que la
moitié de l'espace disque est occupé par la
redondance.
- RAID-5, ou encore disques avec
parité. En reprenant la figure 10.1, pour chaque ligne horizontale,
l'une des bandes est la bande de parité des trois autres ("ou exclusif",
noté XOR); ainsi
b4 = b1 XOR b2 XOR b3.
Lors d'une écriture de b1, b2 ou b3, le système calcule la bande
de parité b4 et l'écrit dans la partition d. Notons qu'il n'est
pas nécessaire de connaître toutes les bandes pour calculer b4:
lorsqu'on change b1 en b1', la nouvelle valeur de la bande b4, est obtenue par
b4' = b4 XOR b1 XOR b1'.
Pour que le disque de la partition d ne soit pas surchargé, on
répartit les bandes de parités sur l'ensemble des partitions, par
exemple la suivante sera b5, puis b10, puis b15, etc. En cas de panne sur le
disque de la partition a, on peut reconstruire la bande
b1 = b2 XOR b3 XOR b4.
Notons que, si on utilise n disque, 1/n de l'espace est occupé par la
redondance.
Evidemment, au moment d'une panne, on passe
à un fonctionnement sans redondance. Cela peut être une panne
locale, par exemple dans le cas d'un bloc défectueux sur le disque, et il
suffit d'allouer un bloc de remplacement et de reconstruire son contenu. Cela
peut être une panne du disque complet qu'il faut alors remplacer, et
reconstruire ensuite les données sur ce nouveau disque.
On peut voir que dans chaque cas, on augmente le nombre
d'écriture à effectuer sur disque. Cependant, ces écritures
étant sur des disques distincts, peuvent être
exécutées en parallèle, si le système le permet. Par
ailleurs, les systèmes pratiquent de plus en plus
l'écriture paresseuse: une demande d'écriture par un
programme d'applications entraîne la modification de tampons en
mémoire centrale et la reprise de l'exécution du programme.
L'écriture effective sur le disque est différée à un
moment ultérieur.
Notons que ces techniques peuvent être
réalisées dans le contrôleur des disques, l'ensemble
étant vu du système comme un seul disque. De plus, il est parfois
possible de remplacer un disque de l'ensemble sans arrêter le
système.
10.3. Conclusion
+ La protection a pour
but de se prémunir contre les altérations des données
dûes à une mauvaise utilisation des opérations.
+ La protection par
droit d'accès permet de définir quels sont les utilisateurs qui
sont autorisés à effectuer une opération donnée sur
l'objet.
+ La protection par
mot de passe consiste à autoriser les accès si l'utilisateur
fournit le bon mot de passe.
+ La
sécurité a pour but de se prémunir contre les
altérations des données par suite d'une défaillance du
matériel ou du logiciel.
+ La
sécurité par redondance interne consiste à disposer des
informations de structure de plusieurs façons, et de contrôler la
cohérence entre elles.
+ La
sécurité par sauvegarde périodique consiste à
recopier régulièrement tout ou partie des objets externes sur un
autre support, pour permettre de les restituer en cas d'incident.
+ Un système
RAID est un ensemble de disques où l'un d'eux contient des informations
redondantes de celles contenues dans les autres, et qui permet de ne perdre
aucune information en cas de panne de l'un des disques de l'ensemble.