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.
	<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.
	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.
	<~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.

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:
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.