Fiabilité et Sécurité

6.6 Fiabilité et Sécurité

Objectifs d'apprentissage

À la fin de cette section, vous serez capable de :

  • Expliquer comment les systèmes d'exploitation protègent les systèmes informatiques
  • Discuter des fonctions clés du système d'exploitation liées à la sécurité
  • Expliquer comment le système d'exploitation aide le système informatique à se remettre des pannes
  • Discuter de la manière dont les avancées technologiques affectent la longévité d'un système d'exploitation

Rappelez-vous que nous considérons un système d'exploitation comme fiable s'il fournit un service sans erreurs ni interruptions. En plus de la fiabilité (reliability), un système d'exploitation doit offrir un niveau élevé de protection, de sécurité et de stabilité. Ici, nous abordons la protection, la sécurité, la récupération (recovery) et la longévité du système d'exploitation.

Protection

Le mécanisme (mechanism) général utilisé dans tout le système d'exploitation pour toutes les ressources qui doivent être protégées, telles que la mémoire, les processus, les fichiers, les périphériques, le temps CPU et la bande passante du réseau, est appelé protection (protection). Les objectifs du mécanisme de protection sont de permettre le partage (sharing) (ce qui, dans ce contexte, signifie utiliser le matériel pour faire plus d'une chose à la fois), d'aider à détecter et à contenir les erreurs accidentelles ou involontaires, et de prévenir les abus intentionnels/malveillants. Le principal défi en matière de protection est que les abus intentionnels sont beaucoup plus difficiles à éliminer que les accidents.

Un mécanisme de protection comporte trois aspects : l'authentification (authentication), l'autorisation (authorization) et l'application du contrôle d'accès (access enforcement). L'authentification identifie une partie responsable ou un principal derrière chaque action, l'autorisation détermine quels principaux sont autorisés à effectuer quelles actions, et l'application du contrôle d'accès contrôle l'accès en utilisant les informations d'authentification et d'autorisation. Une petite faille dans l'un de ces domaines peut compromettre l'ensemble du mécanisme de protection. Il est extrêmement difficile de faire fonctionner toutes ces techniques de mécanisme de protection de manière à ce qu'il n'y ait pas de failles pouvant être exploitées par des adversaires. La Figure 6.36 illustre la relation entre l'authentification, l'autorisation et l'application du contrôle d'accès.

Le diagramme montre : Nom d'utilisateur John Park, Mot de passe ****** -> Authentification : Êtes-vous un utilisateur authentifié ? -> Autorisation : Qu'êtes-vous autorisé à faire ? -> Application du contrôle d'accès : À quoi accédez-vous ?
Figure 6.36 La première étape du mécanisme de protection est l'authentification, qui vérifie le nom d'utilisateur et le mot de passe ; puis vient l'autorisation, qui vérifie les privilèges ; et, enfin, il y a l'application du contrôle d'accès, qui contrôle l'accès. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Sécurité

Le processus (process) de vérification si les identifiants d'un utilisateur correspondent aux identifiants d'une base de données d'utilisateurs autorisés ou d'un serveur d'authentification de données est appelé authentification (authentication). Le moyen traditionnel d'authentification implique que l'utilisateur fournisse un mot de passe, qui est une information secrète utilisée pour établir l'identité d'un utilisateur et qui doit être relativement longue et difficile à deviner. La plupart des systèmes stockent les mots de passe dans une base de données de mots de passe. Une base de données de mots de passe doit être protégée car elle est vulnérable la plupart du temps. Par exemple, les organisations et les utilisateurs devraient éviter de stocker les mots de passe sous une forme directement lisible.

Une autre forme d'authentification implique l'utilisation d'un insigne ou d'une clé. L'insigne (badge) est un système d'accès logique. L'insigne n'a pas besoin d'être gardé secret. Il peut être contrefait, mais si c'est le cas, le propriétaire le saura. L'insigne doit être bon marché à fabriquer mais difficile à dupliquer.

Une autre forme d'authentification est l'authentification à deux facteurs (two-factor authentication), qui implique deux facteurs : le système appelle ou envoie un SMS au téléphone d'un utilisateur pour le mot de passe traditionnel lors de la connexion, en utilisant le téléphone portable comme clé. Par exemple, un site envoie un message texte au téléphone d'un utilisateur avec un code d'accès unique. L'utilisateur doit lire le code d'accès sur le téléphone et le saisir sur la page de connexion.

Dans l'authentification à deux facteurs, un attaquant doit avoir à la fois votre mot de passe et votre téléphone portable pour pirater votre compte. Cette approche est particulièrement efficace pour l'authentification aux sites web, car l'exigence du mot de passe et du téléphone portable physique constitue un moyen de dissuasion suffisant. Pour améliorer l'efficacité, le processus d'authentification à deux facteurs peut être optimisé pour les sites web. Une fois l'authentification terminée, un cookie est chargé dans votre navigateur. Ce cookie transforme ensuite votre navigateur en une sorte de clé, vous accordant la possibilité de vous connecter avec le mot de passe tant que le cookie persiste.

Chaque fois qu'un utilisateur doit se connecter depuis un navigateur ou une machine différente, l'authentification à deux facteurs est utilisée à nouveau. Après la connexion, l'identifiant de l'utilisateur est associé à chaque processus exécuté sous cette connexion, car l'identifiant de l'utilisateur est stocké dans le bloc de contrôle de processus (process control block) et les enfants héritent de l'identifiant de l'utilisateur de leurs parents. Une fois l'authentification terminée, l'étape suivante de la protection est l'autorisation.

Le processus de détermination de la relation entre les principaux, les opérations et les objets en définissant le type de principaux autorisés à effectuer une activité spécifique avec un ensemble défini d'objets est appelé autorisation (authorization). Ces principaux sont représentés à l'aide d'une matrice qui comprend une entrée pour chaque principal et une colonne pour chaque objet comme représentation des informations d'autorisation sur les opérations données. Par exemple, définir qui a l'autorisation de lire/visualiser, modifier ou supprimer le fichier. Chaque entrée de la matrice d'accès décrit la capacité de chaque principal sur chacun des objets. Lorsque la matrice inclut tous les principaux et tous les objets assignés, elle peut devenir complexe et difficile à gérer. La manière idéale de résoudre ce problème est d'utiliser une ligne directrice telle qu'une liste de contrôle d'accès. Une liste de contrôle d'accès (ACL) (access control list (ACL)) est un ensemble de lignes directrices qui définissent l'autorité de chaque utilisateur (c'est-à-dire quel utilisateur est autorisé à accéder à des ressources données). Une ACL contrôle l'accès et les privilèges en utilisant une conception matricielle.

L'ACL d'Oracle propose l'attribution d'utilisateurs à des rôles tels que utilisateurs de base, utilisateurs avancés, administrateur client, entre autres. Un rôle est configuré pour conférer des privilèges sur des objets plutôt que d'attacher des privilèges à des utilisateurs individuels, car cela serait beaucoup plus difficile à configurer et à maintenir. La forme la plus générale de définition des privilèges est la création d'une liste de paires utilisateur et privilège, appelée liste de capacités. Une liste de capacités (capability list) est une liste d'objets et d'opérations pour chaque utilisateur qui définit les droits et les capacités de l'utilisateur. Généralement, les capacités agissent également comme des noms pour les objets, ce qui signifie que la liste ne peut même pas nommer des objets non référencés dans votre liste de capacités. Pour simplifier, les utilisateurs peuvent être organisés en groupes avec une seule entrée ACL pour un groupe entier, et chaque groupe peut partager les mêmes privilèges. Alors que dans les systèmes d'exploitation Windows, les ACL sont très générales, elles sont relativement simples dans UNIX/Linux. Par exemple, dans UNIX/Linux, l'accès peut être en lecture, écriture et exécution, et il peut être accordé au propriétaire du fichier, au groupe du propriétaire du fichier, ou au « monde » de tous les utilisateurs. Dans de nombreux cas, l'utilisateur root a tous les privilèges pour toutes les opérations et a accès à toutes les permissions. Par exemple, l'utilisateur root peut visualiser, modifier et supprimer un fichier. Les ACL sont simples et peuvent être utilisées par n'importe quel système de fichiers sous Windows. L'utilisation implique le partage (sharing) d'un espace de noms à un niveau de visibilité élevé en le rendant public, tout en définissant un autre espace de noms comme privé — à l'image de l'encapsulation des objets en programmation orientée objet.

Un composant d'un système d'exploitation doit être chargé d'appliquer les règles d'accès et de garantir l'authentification (authentication) et l'autorisation (authorization) pour offrir un niveau de sécurité élevé. Le mécanisme (mechanism) d'application du contrôle d'accès (access enforcement) du système a une autorité complète ; par conséquent, il doit être simple en programmation et de petite taille. Le noyau (kernel) de sécurité est une approche de substitution composée de matériel et de logiciel et servant de couche de protection (protection) interne du système d'exploitation. Généralement, tout type de gestion, comme la gestion de la mémoire et des interruptions, est fourni par un noyau de sécurité.

Récupération

Comme tout autre système, un système d'exploitation peut planter au milieu de sections critiques (critical section) ou pendant que le système est en cours d'exécution. Ces plantages peuvent entraîner une perte de données, des résultats inattendus et une incohérence. Par exemple, si le plantage s'est produit avant que le système n'ait stocké les informations d'un utilisateur dans la mémoire principale, le système aura perdu ces informations. Des résultats inattendus fournissent une sortie erronée et peuvent affecter d'autres calculs.

Une incohérence (inconsistency) est une situation qui entraîne la production d'erreurs ou une défaillance matérielle par le système. Des incohérences peuvent survenir lorsqu'une modification affecte plusieurs blocs ; un plantage peut se produire lorsque certains blocs ont été écrits sur le disque mais pas les autres. Par exemple, lorsque le système ajoute un bloc à un fichier, il met à jour la liste des blocs libres pour indiquer que le bloc est utilisé, mais si l'inœud (inode) n'est pas encore écrit pour pointer vers le bloc, cela entraînera une incohérence. Une autre incohérence peut se produire lorsque le système, lors de la création du lien vers un fichier pour créer une nouvelle entrée de répertoire (directory), fait référence à un inœud, mais que le compteur de références n'a pas encore été mis à jour dans l'inœud.

Le processus (process) de résolution des pannes ou erreurs du système d'exploitation est appelé récupération (recovery). Trois approches peuvent résoudre les problèmes d'incohérence :

  • Vérifier la cohérence pendant le redémarrage et réparer le problème. Un bon exemple de vérification d'incohérence est l'implémentation de la commande de vérification du système de fichiers (fsck) pour les systèmes de fichiers UNIX et de type UNIX. Le système exécute fsck dans le cadre de chaque séquence de démarrage du système afin de vérifier si le système a été arrêté correctement ou non. S'il a été correctement arrêté, il procède normalement. Dans l'alternative (par exemple, plantage, panne de courant ou toute autre raison), le processus de récupération démarrera. Le processus de récupération analysera le contenu du disque, identifiera les incohérences et les réparera. Les limitations de fsck sont les suivantes : il restaurera le disque à la cohérence, mais n'empêche pas la perte d'informations. Cette perte d'informations peut entraîner une instabilité. De plus, fsck présente des problèmes de sécurité car un bloc pourrait migrer du fichier de mots de passe vers un autre fichier aléatoire, ce qui pourrait le rendre visible pour des utilisateurs non autorisés. En outre, l'exécution de fsck peut prendre beaucoup de temps, et l'utilisateur ne pourra pas redémarrer le système tant que fsck n'aura pas terminé. Le processus de récupération avec fsck prendra plus de temps si la taille du disque est importante. La Figure 6.37 illustre un exemple des codes d'erreur produits par fsck et la signification de chaque code dans le système d'exploitation Linux.
Une capture d'écran montre # man fsck; 0 Aucune erreur; 1 Erreurs du système de fichiers corrigées; 2 Le système doit être redémarré; 4 Erreurs du système de fichiers non corrigées; 8 Erreur opérationnelle; 16 Erreur d'utilisation ou de syntaxe; 32 Vérification annulée par la demande de l'utilisateur; 128 Erreur de bibliothèque partagée.
Figure 6.37 L'exécution d'un processus de récupération avec fsck a entraîné ces codes d'erreur. La signification de chaque code dans le système d'exploitation Linux est également donnée. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)
  • Vérifier l'ordre des écritures. Cette approche évite certaines divergences en appliquant les modifications dans une séquence d'écriture spécifique. Par exemple, pour s'assurer que la liste des blocs libres ne contient pas encore le nouveau bloc du fichier, écrivez le contenu de la liste avant d'ajouter ce bloc au fichier. Après vous être assuré que la liste n'inclut pas ce bloc, créez une référence pour le nouveau bloc dans l'inœud. En utilisant cette approche, vous garantirez que vous n'écrirez jamais un pointeur avant d'initialiser le bloc vers lequel il pointe sans validation. La validation forcera le système à ne jamais effacer le dernier pointeur avant d'en définir un nouveau. L'avantage de cette approche est qu'elle réduit le temps d'attente, car il n'est pas nécessaire d'attendre fsck pendant le redémarrage. Cependant, il y a plusieurs inconvénients, tels que le potentiel de fuites de ressources (par exemple, lorsque le système exécute fsck pour récupérer certaines ressources perdues). Un autre inconvénient est que cette approche ralentit l'opération de fichier car l'écriture pendant l'exécution du système nécessite des métadonnées considérables.
  • Effectuer une journalisation avant écriture. Ce terme est connu sous le nom de système de fichiers journalisé et fait référence à la pratique d'enregistrer les modifications des informations dans un fichier journal séparé, parfois appelé fichier journal. Ces modifications seront enregistrées avant toute nouvelle modification ou mise à jour sur le système. Windows NTFS et Linux ext3 implémentent ce type de fichier journal. La procédure de journalisation est analogue à la façon dont les fichiers journaux sont utilisés dans un système de base de données pour permettre la correction des incohérences mises à jour, ce qui permet une guérison rapide en cas d'erreur. Avant d'effectuer toute opération, le processus de récupération stockera initialement les informations concernant l'opération dans un fichier journal spécial. L'étape suivante consiste à vider les informations sur le disque avant de mettre à jour d'autres blocs. Par exemple, une entrée de journal telle que « J'ajouterai le bloc 100101 à l'inœud 313 à l'index 90 » sera ajoutée au journal du système au cas où l'opération impliquerait l'ajout d'un bloc à un fichier. Cela garantira que les modifications réelles des blocs peuvent être effectuées. Le système restaurera le journal en cas de plantage pour s'assurer que toutes les mises à jour ont été enregistrées sur le disque. L'utilisation de la journalisation présente de nombreux avantages, tels que la réduction du temps nécessaire pour récupérer après toute panne. De plus, l'amélioration de la capacité de localisation des journaux sur le disque entraînera une amélioration des performances du système. Cependant, cette approche présente certains inconvénients, à savoir que la taille du fichier journal augmentera avec le temps, ce qui affectera le temps de traitement du système. Ce problème peut toutefois être résolu en effectuant des points de contrôle périodiques.

Longévité

Combien de temps dure un système d'exploitation ? Les entreprises ont-elles cessé de développer de nouveaux systèmes d'exploitation ? Comment le système d'exploitation actuel peut-il survivre ? Pour répondre à ces questions, nous devons discuter de concepts tels que la pagination (paging), les TLB, les disques, la latence de stockage et les multicœurs, ainsi que les machines virtuelles (virtual machine) (VM (VM)).

Technologie et systèmes d'exploitation

De nombreuses idées fondamentales des systèmes d'exploitation ont été développées il y a 30 à 50 ans, lorsque la technologie était très différente. La question n'est pas seulement de savoir si ces idées seront encore pertinentes à l'avenir, mais si elles le sont même aujourd'hui. Après tout, la technologie a considérablement changé au cours des trente dernières années environ. Par exemple, les vitesses des CPU sont passées de 15 MHz en 1980 à plus de 2,5 GHz en 2024, soit une augmentation de 167 fois. La taille de la mémoire est passée de 8 Mo à plus de 16 Go, soit une augmentation de 2 000 fois. La capacité des disques est passée de 30 Mo à plus de 2 To, soit une augmentation de 6 667 fois. Le taux de transfert des disques est passé de 2 Mo/s à plus de 200 Mo/s, soit une augmentation de 100 fois. Les vitesses de réseau sont passées de 10 Mb/s à plus de 10 Gb/s, soit une augmentation de 1 000 fois. Comme vous pouvez le constater, il y a eu d'énormes augmentations de taille, de vitesse et d'autres capacités.

Comme vous vous en souvenez peut-être, la pagination est un mécanisme (mechanism) de stockage qui permet de récupérer les processus de la mémoire secondaire (secondary memory) et de les déplacer vers la mémoire principale à l'aide de pages. Dans les années 1960, la pagination vantait à l'origine une latence de vitesse de disque de 80 ms, un taux de transfert de données de 250 Ko/s, une taille de mémoire de 256 Ko. Ainsi, pour 64 pages, il fallait 6,4 secondes pour remplacer toute la mémoire afin de traiter les défauts de page individuels et 1 seconde pour traiter les défauts de page séquentiels. Aujourd'hui, nous avons une latence de vitesse de disque de 10 ms, un taux de transfert de données de plus de 150 Mo/s et une taille de mémoire de plus de 64 Go. Pour plus de 16 000 000 de pages, il faut plus de 44 heures pour remplacer toute la mémoire afin de traiter les défauts de page individuels, et plus de 320 secondes pour traiter les défauts de page séquentiels. Par conséquent, nous ne pouvons pas nous permettre de paginer quelque chose à moins que le système ne soit inactif pendant une longue période. Mais la vraie question est : la pagination a-t-elle encore un sens en tant que mécanisme de chargement incrémentiel des processus ? La réponse est oui, mais en lisant l'intégralité du binaire en une seule fois, car 15 Mo de binaire prennent 0,1 seconde à lire.

Les TLB n'ont pas suivi le rythme des tailles de mémoire ; 64 entrées offrent une couverture de 256 Ko. Au milieu des années 1980, cela représentait une fraction substantielle de la mémoire (c'est-à-dire 8 Mo). Aujourd'hui, les TLB ne peuvent couvrir qu'une infime fraction de la mémoire. Certaines TLB prennent en charge des tailles de page plus grandes de 1 Mo ou 1 Go, mais cela complique la gestion de la mémoire (memory management) du noyau (kernel).

La capacité des disques a augmenté plus rapidement que le temps d'accès ; la latence d'accès au stockage pour les disques est d'environ 10 ms, et elle est d'environ 100 µs pour la mémoire flash (flash memory). Il existe de nouvelles mémoires non volatiles, telles que le 3D XPoint d'Intel, qui améliorent la latence à 100ns–300ns.

Les améliorations de la technologie des puces ont permis aux fréquences d'horloge des processeurs de s'améliorer rapidement. Malheureusement, cependant, des fréquences d'horloge plus rapides signifient une plus grande dissipation de puissance, et maintenant les limitations de puissance limitent les améliorations de la fréquence d'horloge. Les concepteurs de puces utilisent maintenant la technologie pour placer plus de processeurs (cœurs) sur une puce. En général, tous les systèmes d'exploitation doivent maintenant être des systèmes d'exploitation multiprocesseurs. Cependant, il n'est pas clair comment utiliser ces cœurs, et les développeurs d'applications doivent écrire des programmes parallèles, ce qui est très difficile.

Enfin, la tendance actuelle/chaude pour le développement des systèmes d'exploitation est le centre de données, qui coordonne des milliers de machines travaillant ensemble pour atteindre une communication à très faible latence.

Machines virtuelles

Comme vous l'avez appris plus tôt dans ce chapitre, une machine virtuelle (virtual machine) est une émulation logicielle d'un ordinateur physique qui crée un environnement pouvant exécuter des programmes et gérer des opérations comme s'il s'agissait d'une entité physique distincte. Cette émulation permet à plusieurs systèmes d'exploitation (operating system) isolés les uns des autres de s'exécuter simultanément sur une seule machine physique. En substance, une VM (VM) fournit la fonctionnalité d'un ordinateur physique, y compris un CPU virtuel, de la mémoire, un disque dur, une interface réseau et d'autres périphériques.

Rappelez-vous que la technologie sous-jacente permettant les VM est appelée hyperviseur (hypervisor) ou moniteur de machine virtuelle (VMM). Cette technologie réside soit directement sur le matériel (hyperviseur de type 1 ou bare-metal), soit au-dessus d'un système d'exploitation (hyperviseur de type 2 ou hébergé). L'hyperviseur est responsable de l'allocation des ressources physiques à chaque VM et de s'assurer qu'elles restent isolées les unes des autres. Cette isolation (isolation) garantit que les processus s'exécutant dans une VM n'interfèrent pas avec ceux s'exécutant dans une autre et améliore ainsi la sécurité et la stabilité. Les VM sont largement utilisées à diverses fins, y compris la virtualisation (virtualization) de serveurs, les tests et le développement de logiciels, et la virtualisation de postes de travail. Les machines virtuelles sont devenues un composant fondamental de l'informatique en nuage, car elles permettent aux fournisseurs de services d'infonuage d'offrir des ressources informatiques évolutives et flexibles aux utilisateurs sur une base de paiement à l'usage.

Figure 6.38 illustre la différence entre un moniteur de machine virtuelle de type 1 et un environnement de conteneurs tel que via Docker. Un conteneur (container) est une unité logicielle standardisée qui isole logiquement une application, lui permettant de s'exécuter indépendamment des ressources physiques.

Un diagramme montre des différences notables entre la machine virtuelle et les conteneurs. Il montre Machines virtuelles ; MV1 Windows, MV2 Unix, MV3 Linux ; Hyperviseur ; Infrastructure. VS Conteneurs ; C1, C2, C3 ; Docker ; OS ; Infrastructure.
Figure 6.38 Une différence notable entre la machine virtuelle et les conteneurs est que les VM permettent l'utilisation de plusieurs systèmes d'exploitation, tandis que les conteneurs partagent un seul OS. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Lorsque l'OS complet s'exécute au sein d'une VM, le système est alors appelé système d'exploitation invité (guest operating system). Les VM sont largement utilisées dans l'informatique en nuage, notamment par Microsoft Azure, Amazon Web Services, Google Cloud Platform et IBM Cloud.

Questions de réflexion

VM vs. Informatique sur site

Les VM sur l'infonuage représentent un changement de paradigme dans la façon dont nous utilisons les ressources informatiques, offrant des avantages considérables par rapport à l'informatique traditionnelle sur site. Les VM basées sur l'infonuage offrent une extensibilité, une flexibilité et une rentabilité, ce qui en fait une technologie prometteuse pour les entreprises et les particuliers. Dans une configuration traditionnelle sur site, une entreprise ou un utilisateur doit investir dans du matériel physique, entretenir ce matériel et souvent surprovisionner les ressources pour gérer les périodes de forte demande. Cette approche immobilise du capital et des ressources dans des équipements qui peuvent rapidement devenir obsolètes ou sous-utilisés.

Pourquoi les machines virtuelles sur l'infonuage sont-elles une technologie prometteuse par rapport à l'utilisation d'un ordinateur sur site ?