- Apprendre
- Informatique et numérique
- Informatique
- Systèmes d’exploitation : processus, mémoire et fichiers
- Protection, isolation et machines virtuelles
Protection, isolation et machines virtuelles
IntermédiaireUnité 9 sur 9 de la formation Formation : Systèmes d’exploitation : processus, mémoire et fichiers
Ce que tu vas apprendre
- Décris les modes du processeur, les points d’entrée contrôlés et les protections mémoire qui empêchent les programmes de se nuire entre eux ou de nuire au noyau, ainsi que les mécanismes qui rendent les attaques contre eux plus difficiles.
- Sépare le mode utilisateur du mode noyauExplique les niveaux de privilège et les instructions privilégiées, ainsi que ce qui se produit lorsqu’un programme tente une opération réservée au noyau.
- Entre dans le noyau en toute sécurité par les appels systèmeSuis un appel système depuis le déroutement jusqu’à la vérification des permissions, et explique pourquoi le noyau doit se méfier de chaque argument reçu.
- Protège la mémoire et les périphériquesUtilise les permissions des tables des pages, les projections mémoire réservées au noyau et l’IOMMU pour expliquer comment le noyau limite chaque processus à sa propre mémoire.
- Rends les attaques contre les programmes et le noyau plus difficilesExplique comment la mémoire non exécutable, la randomisation des adresses, les filtres d’appels système, le démarrage sécurisé et les journaux d’audit augmentent le coût de l’exploitation des failles et en conservent une trace.
- Sépare le mode utilisateur du mode noyau
- Explique comment un système d’exploitation vérifie l’identité d’un utilisateur, stocke les mots de passe en toute sécurité, utilise d’autres facteurs d’authentification et associe l’identité obtenue à chaque processus.
- Associe des identités aux processusSuis une connexion depuis la demande du mot de passe jusqu’à l’exécution d’un interpréteur de commandes, et explique les identifiants utilisateur, les groupes, l’héritage et les programmes qui modifient les privilèges, comme les programmes setuid et sudo.
- Stocke et vérifie les mots de passe en toute sécuritéExplique le hachage, le salage et les fonctions lentes de hachage des mots de passe, et calcule comment ils modifient le coût des attaques par essais de mots de passe.
- Authentifie-toi grâce à ce que tu possèdes et à ce que tu esCompare les mots de passe, les jetons et la biométrie, combine-les dans une authentification multifacteur et authentifie les services et les machines sans personne au clavier.
- Associe des identités aux processus
- Représente les droits sous forme de matrice d’accès, mets-les en œuvre avec des listes de contrôle d’accès ou des capacités, lis et définis les permissions Unix et Windows, et compare les modèles discrétionnaire, obligatoire et fondé sur les rôles.
- Compare les listes de contrôle d’accès et les capacitésStocke les mêmes droits par objet ou par sujet et évalue les deux approches pour vérifier, examiner, déléguer et révoquer les accès.
- Lis et définis les permissions sous Unix et WindowsInterprète les bits de permission et les modes octaux, applique les règles de vérification Unix aux fichiers et aux répertoires, et lis les ACL POSIX et les entrées de contrôle d’accès Windows.
- Compare les contrôles d’accès discrétionnaire, obligatoire et fondé sur les rôlesDistingue les modèles où les propriétaires décident de ceux où une politique commune à tout le système décide, et utilise des rôles pour gérer les droits de nombreux utilisateurs.
- Compare les listes de contrôle d’accès et les capacités
- Explique comment un hyperviseur partage le processeur, la mémoire et les périphériques d’un ordinateur entre plusieurs systèmes d’exploitation complets tout en les isolant.
- Décris les machines virtuelles et les hyperviseursDéfinis les machines virtuelles et les hyperviseurs, distingue les architectures de type 1 et de type 2, et explique les usages de la virtualisation et les limites de son isolation.
- Virtualise le processeurExplique l’interception et l’émulation, pourquoi le x86 classique ne pouvait pas les utiliser directement, et comment la traduction binaire, la paravirtualisation et la prise en charge matérielle ont résolu le problème.
- Virtualise la mémoireTraduis une adresse virtuelle d’un invité en adresse réelle de la machine et compare les tables des pages fantômes à la pagination imbriquée matérielle.
- Virtualise les périphériques et isole les machines virtuelles les unes des autresCompare les périphériques émulés, paravirtuels et directement affectés, et explique les forces et les limites de l’isolation entre machines virtuelles.
- Décris les machines virtuelles et les hyperviseurs
- Construis un conteneur à partir de fonctions du noyau (espaces de noms pour ce qu’un processus peut voir, groupes de contrôle pour ce qu’il peut utiliser et limites de privilèges pour ce qu’il peut faire) et décide quand utiliser un conteneur ou une machine virtuelle.
- Limite ce qu’un processus voit avec les espaces de nomsExplique les types d’espaces de noms Linux, crée et rejoins des espaces de noms, et interprète les espaces de noms PID, de montage, réseau et utilisateur.
- Limite les ressources qu’un processus utilise avec les groupes de contrôleOrganise les processus en groupes de contrôle et fixe des limites de processeur, de mémoire, de nombre de processus et d’entrées-sorties, en interprétant les valeurs de ces limites.
- Restreins les conteneurs et choisis entre conteneurs et machines virtuellesRéduis ce qu’un processus en conteneur est autorisé à faire, explique le risque d’un noyau partagé et choisis des conteneurs, des machines virtuelles ou les deux pour une charge de travail donnée.
- Limite ce qu’un processus voit avec les espaces de noms
Protection, isolation et machines virtuelles : cours
1Explique comment le matériel et le noyau protègent le système
Les programmes s’exécutent rapidement parce que les instructions ordinaires s’exécutent directement sur le processeur. Les permissions matérielles et les points d’entrée contrôlés du noyau rendent cette liberté assez sûre pour permettre le partage d’une machine. Suis cette frontière depuis les privilèges du processeur jusqu’aux accès à la mémoire et aux périphériques, en passant par les vérifications des appels système, puis découvre comment les restrictions d’exécution, la randomisation, la vérification du démarrage et les journaux limitent les attaques contre les programmes et le noyau.
1.1 Sépare le mode utilisateur du mode noyau
Un programme a besoin d’assez de liberté pour calculer rapidement sans prendre le contrôle de tout l’ordinateur. Le mode utilisateur lui permet d’exécuter directement les instructions ordinaires. Le mode noyau, aussi appelé mode superviseur, donne au système d’exploitation accès aux instructions qui contrôlent la machine.
Laisse le matériel faire respecter les privilèges
Le processeur possède un niveau de privilège courant. Les additions, chargements, écritures et sauts s’exécutent normalement à pleine vitesse, sous réserve des permissions mémoire. Le noyau n’examine pas chaque instruction par logiciel. C’est l’exécution directe limitée : les instructions s’exécutent directement jusqu’à ce qu’une opération protégée ou une interruption nécessite l’intervention du noyau.
Une instruction privilégiée provoque un déroutement si le code utilisateur tente de l’exécuter. Sur x86-64, HLT, l’écriture dans le registre de base de la table des pages CR3 et l’installation d’une table des interruptions avec LIDT exigent les privilèges du noyau. Sinon, une application pourrait arrêter le processeur, remplacer ses propres limites mémoire ou rediriger le traitement des interruptions.
Supposons qu’une application exécute HLT. Le processeur déclenche une exception de protection générale au lieu de s’arrêter. Il entre dans le gestionnaire enregistré par le noyau. Linux envoie normalement SIGSEGV au processus, ce qui le termine tandis que les autres programmes continuent. L’application ne peut pas choisir une adresse qui lui convient dans le noyau et commencer à y exécuter du code.
Franchis la frontière par une entrée contrôlée
Les déroutements, exceptions et interruptions entrent par des adresses enregistrées par le noyau. Le matériel change le niveau de privilège et transmet le contrôle au gestionnaire ; le code d’entrée du noyau conserve l’état nécessaire au retour. Une instruction de retour spéciale reprend l’exécution en mode utilisateur au compteur ordinal sauvegardé. Sur x86-64, le retour peut utiliser SYSRET ou IRETQ.
L’horloge rend ce contrôle utile même lorsqu’un programme ne demande jamais de service. Avant de l’exécuter, le noyau programme une horloge. Lorsque l’interruption arrive, l’ordonnanceur peut choisir un autre processus. Le code utilisateur ne peut pas désactiver les interruptions ni reprogrammer cette horloge : une boucle sans fin ne peut donc pas conserver un cœur indéfiniment.
Lis correctement les schémas de privilèges
| Architecture | Application | Noyau | Autres niveaux |
|---|---|---|---|
| x86 | Anneau 3 | Anneau 0 | Les anneaux 1 et 2 existent, mais les noyaux Linux et Windows ordinaires ne les utilisent pas |
| ARMv8-A | EL0 | EL1 | EL2 prend en charge un hyperviseur ; EL3 prend en charge le moniteur du micrologiciel sécurisé |
| RISC-V | Mode U | Mode S | Le mode M possède les privilèges machine |
Les conventions de numérotation diffèrent : un numéro d’anneau x86 plus faible signifie davantage de privilèges, tandis qu’un niveau d’exception ARM plus élevé signifie davantage de privilèges. La virtualisation Intel ajoute aussi les modes VMX root et non-root ; ils sont distincts du numéro d’anneau.
Distingue l’identité du mode du processeur
Root est une identité d’utilisateur, UID 0, que le logiciel du noyau reconnaît. Le code ordinaire d’une application root s’exécute toujours en mode utilisateur et entre dans le noyau par des appels système. Un pilote de périphérique exécuté en mode noyau dispose d’un pouvoir direct bien plus important : un bogue mémoire à cet endroit peut endommager l’état du noyau sans passer par une vérification des permissions de fichier.
La couche qui fait respecter une frontière doit contrôler la couche située à l’intérieur. Le noyau fait respecter les frontières entre processus à l’aide des modes du processeur et des tables mémoire. De même, un hyperviseur contrôle les systèmes d’exploitation invités grâce à la prise en charge matérielle de la virtualisation.
Points clés
- Les instructions utilisateur s’exécutent directement jusqu’à ce que le matériel exige une entrée dans le noyau.
- Les opérations privilégiées protègent les tables des pages, les interruptions, les horloges et le contrôle des périphériques.
- L’horloge permet à l’ordonnanceur de reprendre un cœur à une boucle sans fin.
- L’identité root ne place pas une application en mode noyau.
- La numérotation des privilèges dépend de l’architecture.
1.2 Entre dans le noyau en toute sécurité par les appels système
Un appel système est une demande contrôlée adressée au noyau pour obtenir un service. Ouvrir des fichiers, créer des processus et envoyer des données sur le réseau exigent des décisions qu’une application ne peut pas prendre elle-même en toute sécurité. L’entrée dans le noyau donne de l’autorité au gestionnaire ; elle ne donne pas à l’appelant la permission de faire tout ce qu’il a demandé.
Suis la demande
Une fonction d’enveloppe de la bibliothèque C telle que open() place le numéro de l’appel et ses arguments dans des registres. Elle utilise SYSCALL sur x86-64, SVC sur ARM64 ou ECALL sur RISC-V. Le noyau :
- Entre par son point d’entrée enregistré et sauvegarde les registres utilisateur.
- Choisit le gestionnaire dans la table des appels système et rejette tout numéro inconnu.
- Lit l’identité et les identifiants de l’appelant dans le processus courant.
- Vérifie les arguments, les droits d’accès et les objets concernés.
- Effectue l’opération ou renvoie une erreur.
- Restaure l’état sauvegardé et revient en mode utilisateur.
L’identité provient des identifiants du processus, et non d’un nom fourni par l’utilisateur. Un appelant ne peut pas obtenir les droits d’un autre utilisateur en ajoutant le nom de celui-ci à une demande.
Considère les arguments comme non fiables
Un pointeur n’est qu’un nombre fourni par l’appelant. Le noyau doit vérifier toute la zone de mémoire utilisateur demandée, y compris sa longueur et le sens de l’accès. Linux utilise des routines qui effectuent des vérifications, telles que copy_from_user et copy_to_user, pour franchir cette frontière en toute sécurité.
Pour read(fd, buf, 4096), un buf qui pointe dans la mémoire du noyau ne doit pas devenir une destination pour les données du fichier. Linux signale EFAULT pour ce tampon utilisateur invalide. Une autre erreur a une autre cause : write() sur un descripteur ouvert avec O_RDONLY échoue avec EBADF, car le droit d’écriture n’a jamais été accordé à ce descripteur. Une demande ordinaire refusée renvoie une erreur ; elle ne termine pas automatiquement le processus. En C, la fonction d’enveloppe renvoie généralement −1 et définit errno.
Vérifie l’objet réellement utilisé
Une condition de concurrence entre vérification et utilisation (TOCTTOU) sépare une décision de l’objet qu’elle devait protéger. Un programme auxiliaire privilégié vérifie access("/tmp/report", W_OK), puis ouvre le chemin. Entre ces opérations, un attaquant remplace le chemin par un lien symbolique vers /etc/passwd. Le nom ne change pas, mais l’objet ouvert est différent.
La correction consiste à effectuer l’accès avec les identifiants prévus sur l’objet réellement ouvert. Abandonne les privilèges avant l’ouverture et utilise des options telles que O_NOFOLLOW lorsque les liens symboliques ne sont pas souhaités. Copier une seule fois les arguments en mémoire noyau évite aussi de faire confiance à plusieurs reprises à des données utilisateur modifiables ; la structure copiée doit toutefois être validée.
Identifie ce qui doit être fiable
Un moniteur de référence contrôle les accès. Il doit être invoqué chaque fois qu’un accès est obtenu, être protégé contre les modifications et être assez petit pour être examiné soigneusement. Une fois que le noyau a accordé une projection mémoire, chaque lecture et chaque écriture passe par les vérifications de permissions de la MMU ; chacune ne déclenche pas un appel système.
La base informatique de confiance (TCB) comprend le matériel, le micrologiciel et les logiciels privilégiés dont le bon fonctionnement conditionne la protection. Elle inclut le processeur, la chaîne de démarrage, le noyau et les composants de connexion de confiance. Déplacer les pilotes ou les systèmes de fichiers dans des serveurs en mode utilisateur peut réduire la partie de cette base située dans le noyau, comme le font les architectures à micronoyau. Une application ordinaire compromise utilise à mauvais escient les droits qui lui ont été accordés ; un composant de confiance compromis peut affaiblir les vérifications elles-mêmes.
Points clés
- L’entrée dans le noyau et la permission d’effectuer une opération sont deux choses distinctes.
- Valide les zones désignées par les pointeurs et les droits d’accès avant d’utiliser les arguments utilisateur.
- Une condition de concurrence TOCTTOU peut faire qu’un nom vérifié désigne un autre objet.
- Un moniteur de référence doit résister au contournement et aux modifications.
- La TCB ne se limite pas au noyau.
- Un appel système refusé renvoie généralement une erreur que le programme peut traiter.
1.3 Protège la mémoire et les périphériques
La mémoire virtuelle protège les programmes en plus de traduire les adresses. Un processus peut atteindre les cadres physiques désignés par sa table des pages active, selon les permissions définies par le noyau. Les cadres privés d’un autre processus en sont absents ; les projections volontaires de mémoire partagée constituent une exception explicite.
Vérifie chaque accès mémoire
L’unité de gestion mémoire (MMU) vérifie les entrées de table des pages lors des accès. Parmi les permissions importantes figurent la présence ou validité, l’autorisation d’écriture, l’accès en mode utilisateur et l’exécution. Sur x86, U/S distingue les pages accessibles en mode utilisateur de celles réservées au superviseur ; NX ou XD désactive l’exécution. ARM appelle XN sa restriction d’exécution.
Une violation déclenche un défaut de page. Le défaut indique l’échec d’une vérification matérielle ; le noyau détermine si cet échec est attendu et peut être corrigé. Considérons deux écritures dans des pages en lecture seule :
- Un processus écrase une page de code qui n’est pas en copie sur écriture. Le noyau traite cela comme une écriture invalide et envoie normalement
SIGSEGV. - Après
fork(), un processus écrit dans des données partagées marquées en copie sur écriture. Le noyau alloue une copie privée, modifie la projection pour y autoriser l’écriture et réessaie l’instruction.
Les deux défauts proviennent d’un bit de protection. Les informations du noyau expliquent pourquoi les projections étaient en lecture seule et déterminent la réponse. Un défaut de page n’est donc pas automatiquement une panne ni une demande de lecture de données sur disque.
Protège les projections du noyau dans les deux sens
Les organisations traditionnelles projettent la mémoire du noyau dans les espaces d’adressage des processus en la réservant au superviseur, ce qui facilite l’entrée dans le noyau tout en bloquant les lectures et écritures en mode utilisateur. L’attaque Meltdown de 2018 a montré que certains processeurs pouvaient divulguer de telles données par l’exécution spéculative. L’isolation des tables des pages du noyau (KPTI) retire la plupart des projections du noyau pendant l’exécution du code utilisateur sur les systèmes concernés.
Le code noyau doit aussi être protégé contre une redirection vers une mémoire contrôlée par l’utilisateur. Sur x86, SMEP empêche l’exécution en mode noyau depuis des pages utilisateur. SMAP bloque les accès aux données des pages utilisateur en mode noyau, sauf pendant des opérations de copie explicitement autorisées. ARM fournit des protections apparentées avec PXN et PAN. Ces vérifications réduisent les possibilités pour un attaquant d’exploiter un bogue du noyau afin d’exécuter du code ou de fournir de fausses données au noyau.
L’accès en lecture seule protège l’intégrité, pas le secret. Si un processus peut lire une page projetée, il peut en connaître le contenu même lorsque les écritures échouent. Les données confidentielles doivent être inaccessibles à ce processus : ne les projette pas ou applique une restriction appropriée au superviseur.
Donne aux périphériques leur propre frontière
Les applications demandent généralement à un pilote d’effectuer des opérations sur un périphérique. Les registres des périphériques sont normalement réservés au noyau, même si un processus autorisé peut recevoir certaines projections, comme avec les pilotes graphiques ou les entrées-sorties Linux en espace utilisateur.
Un périphérique qui effectue un accès direct à la mémoire (DMA) lit ou écrit dans la mémoire vive sans faire passer ces accès par la MMU du processeur. Les seules permissions de page du processeur ne peuvent pas empêcher un périphérique défectueux d’écraser les cadres d’un autre processus. Une IOMMU traduit et limite les adresses des périphériques à l’aide de projections propres à chacun. Intel VT-d et AMD-Vi fournissent ce mécanisme.
Pour un périphérique attribué à une machine virtuelle, l’IOMMU limite le DMA à la mémoire attribuée à cette machine. Le processeur a besoin d’une frontière parallèle : une seconde étape de traduction des pages associe les adresses physiques de l’invité uniquement aux cadres autorisés par l’hyperviseur. Protéger une charge de travail exige de couvrir à la fois les accès du processeur et ceux des périphériques.
Points clés
- La MMU applique les projections et les bits de permission installés par le noyau.
- Un défaut de page peut déclencher une récupération, une copie sur écriture ou un signal fatal.
- L’accès en lecture seule ne rend pas les données confidentielles.
- KPTI retire la plupart des projections du noyau pendant l’exécution en mode utilisateur.
- SMEP et SMAP limitent l’utilisation des pages utilisateur par le noyau.
- L’IOMMU limite le DMA qui contourne la MMU du processeur.
1.4 Rends les attaques contre les programmes et le noyau plus difficiles
Un bogue de sûreté mémoire peut donner lieu à une attaque lorsque des données corrompues modifient le flot de contrôle du programme. Un débordement de tampon sur la pile, par exemple, peut écraser une adresse de retour sauvegardée. Les défenses du système d’exploitation limitent ce qu’un attaquant peut faire avec ce bogue ; elles ne corrigent pas l’écriture fautive.
Sépare les données du code exécutable
Le bit NX marque les pages de données comme non exécutables. Windows appelle cela Data Execution Prevention (DEP). Injecter des instructions dans un tampon de la pile est moins utile lorsqu’un saut vers ce tampon provoque un défaut.
W^X, écriture ou exécution exclusive, est plus strict : aucune page n’est accessible en écriture et exécutable en même temps. DEP seul n’interdit pas à un programme de demander explicitement une telle projection. Avec W^X, un compilateur à la volée écrit le code généré dans une mémoire accessible en écriture, puis modifie ses permissions avant de l’exécuter.
Un attaquant peut aussi réutiliser des instructions exécutables existantes. La programmation orientée retour (ROP) enchaîne de courtes séquences d’instructions appelées gadgets. La randomisation de l’espace d’adressage (ASLR) change les emplacements des piles, des tas, des bibliothèques et des programmes indépendants de leur position, ce qui rend les adresses des gadgets difficiles à prévoir.
Avec une base de bibliothèque choisie uniformément parmi emplacements, une tentative à l’aveugle réussit avec une probabilité de 1 sur 268 435 456. Avec seulement emplacements et une disposition conservée après les pannes des processus travailleurs, essayer des emplacements distincts nécessite au plus 256 tentatives et 128,5 en moyenne. Une adresse divulguée à l’intérieur d’une bibliothèque connue révèle sa base et les déplacements des gadgets dans cette bibliothèque. Une pile randomisée séparément peut toutefois rester inconnue.
Réduis les services qu’un attaquant peut demander
Les filtres seccomp de Linux limitent les appels système qu’un processus peut effectuer. Un processus de rendu de navigateur, par exemple, peut se voir refuser les appels permettant de lancer des programmes ou d’ouvrir directement des fichiers. Les processus fils héritent des filtres, qui ne peuvent pas être retirés ; des filtres ultérieurs peuvent renforcer les restrictions. Un processus de rendu compromis conserve les opérations qui lui sont autorisées : un filtre constitue donc une frontière autour des services, et non une preuve que le programme est exempt de bogues. pledge d’OpenBSD et App Sandbox de macOS fournissent des restrictions apparentées.
Vérifie le démarrage et conserve les preuves
Le démarrage sécurisé vérifie les signatures tout au long de la chaîne de démarrage. Le micrologiciel vérifie un chargeur de démarrage de confiance ; le chargeur vérifie le noyau ; le noyau peut exiger des modules signés. Un composant modifié sans signature reconnue comme fiable est refusé. Cela aide à empêcher les modifications persistantes des logiciels de démarrage, mais une signature valide ne prouve pas que le logiciel est exempt de vulnérabilités.
Le démarrage mesuré enregistre les empreintes des composants chargés, généralement à l’aide d’un module de plateforme sécurisée (TPM). Ces mesures permettent une attestation : un tiers peut comparer ce qui a démarré à un état attendu. Mesurer et refuser de démarrer sont deux opérations différentes.
La journalisation d’audit enregistre les connexions, les échecs d’authentification, les refus de permission, les modifications de comptes et les actions privilégiées telles que sudo. Les journaux facilitent la détection et la reconstitution. Un attaquant qui contrôle un hôte peut effacer les enregistrements locaux ; une journalisation protégée ou distante permet donc de conserver des preuves ailleurs que sur cet hôte.
Les attaquants peuvent combiner une fuite d’adresse, un bogue de corruption mémoire et une évasion de bac à sable. Les mises à jour suppriment les vulnérabilités sous-jacentes que ces défenses laissent en place.
Points clés
- NX bloque l’exécution depuis les pages de données marquées ; W^X interdit aussi les permissions simultanées d’écriture et d’exécution.
- L’ASLR rend plus difficiles à prévoir les adresses utilisées pour la réutilisation de code.
- La divulgation d’une adresse de bibliothèque ne révèle pas nécessairement les zones randomisées séparément.
- Les filtres d’appels système limitent les services accessibles à un processus compromis.
- Le démarrage sécurisé vérifie que les composants de démarrage sont fiables ; le démarrage mesuré enregistre ce qui a été chargé.
- Les journaux d’audit facilitent la détection et la reconstitution : protège-les donc contre la suppression.
2Authentifie les utilisateurs et attribue une identité aux processus
Un nom d’utilisateur ne devient utile au noyau que lorsqu’il est associé à des identifiants de processus fiables. Suis une connexion jusqu’à l’exécution d’un interpréteur de commandes, y compris la gestion attentive des programmes auxiliaires disposant de privilèges élevés. Examine ensuite comment les empreintes de mots de passe salées rendent plus difficiles les attaques contre les données de vérification volées, et comment les clés, les codes fondés sur le temps et la biométrie modifient la preuve d’identité avant les vérifications ordinaires de permissions.
2.1 Associe des identités aux processus
Une connexion réussie associe l’identité d’une personne aux identifiants de processus détenus par le noyau. L’authentification vérifie l’identité déclarée ; l’autorisation détermine ce que cette identité peut faire. Un principal peut être une personne ou un compte de service, et les processus agissent pour son compte.
Transmets l’identité aux programmes en cours d’exécution
Les systèmes de type Unix identifient les utilisateurs par des UID numériques et les groupes par des GID. /etc/passwd associe les noms aux UID, aux répertoires personnels et aux interpréteurs de commandes. Les comparaisons du noyau utilisent les nombres : deux noms de compte ayant un même UID représentent une seule identité pour les vérifications d’accès. L’UID 0 est celui de root et contourne la plupart des vérifications ordinaires de permissions.
Windows utilise des identifiants de sécurité (SID) pour les utilisateurs et les groupes. Le jeton d’accès d’un processus enregistre son SID utilisateur, ses SID de groupe et ses privilèges. Sur les deux plateformes, les identifiants du programme en cours d’exécution fournissent l’identité utilisée pour les décisions ultérieures.
Une connexion Linux typique par mot de passe suit cette séquence :
- Un service de connexion privilégié, tel que
login,sshdou un gestionnaire de connexion graphique, reçoit les identifiants. - PAM les vérifie par l’intermédiaire des modules d’authentification configurés.
- Le service définit les groupes supplémentaires et le GID de l’utilisateur, puis change l’UID pour abandonner les privilèges root.
- Il lance l’interpréteur de commandes. Les processus fils héritent de ces identifiants par
fork()et les conservent normalement aprèsexecve().
L’ordre compte. Abandonner les privilèges root avant de définir les groupes peut empêcher le processus de remplacer la liste de groupes privilégiés dont il a hérité. De plus, modifier l’appartenance d’un compte à des groupes ne réécrit pas les identifiants des processus déjà en cours d’exécution ; une nouvelle session de connexion reçoit la nouvelle liste.
Comprends un changement de privilège contrôlé
Un processus possède un UID réel, qui indique normalement qui l’a lancé ; un UID effectif, utilisé pour la plupart des vérifications d’accès ; et un UID sauvegardé, qui permet un retour contrôlé après une réduction temporaire. Dans les programmes ordinaires, les trois sont égaux.
Le fichier /usr/bin/passwd, qui appartient à root, illustre setuid. Son mode 4755, affiché -rwsr-xr-x, donne l’UID effectif de root lorsqu’un utilisateur ordinaire l’exécute. Si alice a l’UID 1000, son UID réel reste 1000 tandis que l’UID effectif devient 0. Le programme peut mettre à jour /etc/shadow et utilise l’identité réelle de l’appelant pour limiter les mots de passe qu’il peut modifier. Un exécutable setgid modifie de la même façon le groupe effectif.
Ce petit programme de confiance détient un pouvoir dangereux. Un bogue peut exposer les droits root : les systèmes limitent donc le nombre de programmes setuid et abandonnent les privilèges dès que possible. Pour un service qui n’a besoin que d’un port de numéro inférieur, CAP_NET_BIND_SERVICE accorde un privilège Linux plus limité que les droits root complets.
Administre sans partager une identité
sudo authentifie l’utilisateur qui l’invoque, vérifie quelles commandes il peut exécuter sous quelle identité cible et journalise l’utilisation. Sa politique se trouve généralement dans /etc/sudoers. Les identités individuelles permettent d’attribuer les actions à chaque personne, ce que le partage d’un mot de passe root ne permet plus. Sous Windows, UAC lance normalement les programmes d’un administrateur avec un jeton filtré et demande son accord pour l’élévation des privilèges.
Les applications courantes devraient s’exécuter avec des droits ordinaires et les services devraient disposer de comptes dédiés tels que www-data. Un lecteur de documents compromis hérite alors de ces identifiants limités au lieu des pleins pouvoirs d’un administrateur.
Points clés
- L’authentification établit l’identité ; l’autorisation vérifie les droits.
- Unix vérifie les UID et GID numériques ; Windows utilise des SID et des jetons.
- Définis les groupes avant d’abandonner définitivement le privilège de les modifier.
- L’UID effectif sert à la plupart des vérifications d’accès sous Unix.
- Les programmes auxiliaires setuid exigent des vérifications soigneuses, car ils détiennent des privilèges élevés.
- Les processus existants conservent leur ancienne liste de groupes après la modification d’un compte.
2.2 Stocke et vérifie les mots de passe en toute sécurité
Un système de vérification des mots de passe doit reconnaître un mot de passe correct sans en stocker une copie récupérable. Il stocke une empreinte de mot de passe avec les informations nécessaires pour répéter la vérification. Lors de la connexion, il recalcule l’empreinte à partir du mot de passe saisi et compare les résultats ; il ne déchiffre jamais l’empreinte stockée.
Protège les données de vérification stockées
Sous Linux, /etc/shadow contient les empreintes de mots de passe protégées. Le fichier /etc/passwd, lisible par un grand nombre d’utilisateurs, contient les informations des comptes et un x à la place du mot de passe. Un champ de mot de passe de shadow enregistre un identifiant d’algorithme, des paramètres de coût, un sel et l’empreinte obtenue. $y$ désigne yescrypt, utilisé par défaut dans Debian 11, Ubuntu 22.04, Fedora 35 et les versions ultérieures ; $6$ désigne SHA-512-crypt.
Un fichier d’empreintes volé permet une attaque hors ligne. L’attaquant calcule les empreintes de ses propositions sur un autre matériel, sans subir les délais du service de connexion. Une attaque par force brute énumère les chaînes ; une attaque par dictionnaire commence par les mots probables, les mots de passe divulgués et des variantes telles que « Password1! ».
Avec exactement huit lettres minuscules, chaînes sont possibles. À essais par seconde, parcourir tout l’espace prend environ 21 secondes. À essais par seconde, cela prend environ secondes, soit à peu près 242 jours. Ce sont des durées de recherche exhaustive, pas des garanties pour un mot de passe donné. Douze lettres minuscules donnent environ chaînes, soit à peu près 110 jours même au débit le plus élevé.
Rends l’attaque de chaque compte coûteuse
Un sel est une nouvelle valeur aléatoire stockée à côté de chaque empreinte de mot de passe. Il fait produire des empreintes différentes à des mots de passe identiques et rend inutilisables les tables précalculées réutilisables. Le sel est public ; son rôle est d’imposer un travail distinct pour chaque compte.
Considérons 1 000 comptes et une liste de propositions, vérifiées à raison de calculs d’empreinte par seconde. Sans sel, calculer une fois les empreintes de la liste prend 100 secondes et suffit pour tous les comptes. Des sels uniques exigent calculs, soit environ secondes ou 27,8 heures. Un mot de passe courant peut toutefois être trouvé près du début de la liste.
Les méthodes de hachage des mots de passe telles que bcrypt, scrypt, yescrypt, Argon2 et PBKDF2 ont des coûts de calcul réglables. Scrypt, yescrypt et Argon2 imposent aussi des coûts en mémoire. Une connexion pratique peut tolérer une fraction de seconde ; une vaste campagne d’essais répète ce coût des millions de fois. Un seul calcul SHA-256 rapide ne présente pas ce coût délibéré.
Conçois la politique de connexion autour des essais
NIST SP 800-63B-4 (2025) exige des sels d’au moins 32 bits et un coût de hachage des mots de passe aussi élevé que possible en pratique. Ses recommandations exigent au moins 15 caractères pour une authentification par mot de passe seul, ou au moins huit lorsque le mot de passe fait partie d’une authentification multifacteur, et recommandent d’accepter au moins 64 caractères.
Elles rejettent les mélanges obligatoires tels qu’un chiffre et un symbole ainsi que les changements de mot de passe périodiques imposés. Elles exigent de bloquer les choix courants ou compromis, de limiter les essais en ligne et d’imposer un changement lorsque la compromission est avérée. Les limites de débit en ligne protègent le service actif ; un hachage lent avec sel protège les données de vérification volées. Un mot de passe plus long choisi de manière prévisible dans une liste courante peut rester faible.
Points clés
- La connexion recalcule une empreinte de mot de passe ; elle ne déchiffre pas un mot de passe.
- Les essais hors ligne contournent les limites de débit du service de connexion actif.
- Un sel public unique empêche de réutiliser le travail de hachage d’un compte à l’autre.
- Un coût de calcul réglable rend chaque essai coûteux.
- La longueur des mots de passe et les listes de blocage aident davantage que des règles de composition prévisibles.
2.3 Authentifie-toi grâce à ce que tu possèdes et à ce que tu es
Les mots de passe prouvent une connaissance. D’autres authentificateurs prouvent la possession d’un objet ou une caractéristique physique. Le système d’exploitation finit par associer l’identité authentifiée aux processus, mais la manière d’établir cette identité influe sur la facilité avec laquelle un attaquant peut usurper l’identité de l’utilisateur.
Combine différents types de facteurs
Les trois types de facteurs sont ce que tu sais, comme un mot de passe ou un code PIN ; ce que tu possèdes, comme un téléphone, une carte à puce ou une clé de sécurité ; et ce que tu es, comme une empreinte digitale. L’authentification multifacteur combine des types différents. Un mot de passe associé à une question de sécurité répète le facteur de connaissance.
Les mots de passe à usage unique fondés sur le temps (TOTP) utilisent un secret partagé et une période, généralement de 30 secondes, pour produire des codes correspondants sur un authentificateur et un serveur. La RFC 6238 définit cette méthode. Un code expire rapidement, mais une fausse page de connexion peut transmettre un code récent avant son expiration. Les codes d’application évitent l’échange de carte SIM ; les codes SMS dépendent du contrôle du numéro de téléphone et peuvent être détournés si celui-ci est compromis.
Prouve la possession sans envoyer la clé
Un authentificateur à clé publique signe un nouveau défi avec une clé privée. Le serveur vérifie la signature à l’aide d’une clé publique stockée, qui ne peut pas elle-même être réutilisée pour signer une connexion. Les clés de sécurité FIDO2 et les clés d’accès associent aussi l’authentification à l’identité du site : une réponse destinée à un faux site ne peut donc pas authentifier l’utilisateur sur le vrai. Une clé SSH ordinaire prouve aussi la possession, mais il ne faut pas supposer qu’elle dispose du même mécanisme de liaison au site web.
Le stockage modifie le risque. Les clés liées à un appareil, dans une clé de sécurité matérielle, un TPM ou une enclave sécurisée, signent dans le matériel sans exposer la clé privée. Les clés d’accès synchronisées copient les éléments de clé chiffrés entre les appareils par l’intermédiaire d’un compte de plateforme, ce qui facilite la récupération tout en intégrant ce compte à la frontière de confiance. Une clé privée SSH ordinaire est un fichier protégé par des permissions et, éventuellement, une phrase secrète.
Interprète les erreurs biométriques
Un système biométrique compare les traits mesurés à un gabarit enregistré. Il accepte lorsque le score de similarité atteint un seuil ; il n’exige pas une image identique à chaque fois.
| Taux | Population utilisée comme dénominateur | Erreur comptée |
|---|---|---|
| Taux de fausse acceptation (FAR) | Tentatives d’imposteurs | Imposteurs acceptés |
| Taux de faux rejet (FRR) | Tentatives légitimes | Utilisateurs légitimes rejetés |
Deux imposteurs acceptés sur 10 000 donnent un FAR de 0,02 %. Trente rejets sur 1 000 tentatives légitimes donnent un FRR de 3 %. Relever le seuil de similarité diminue le FAR tout en augmentant le FRR. Une correspondance plus exigeante réduit les usurpations réussies, mais rend les nouvelles tentatives légitimes plus fréquentes.
Une caractéristique biométrique divulguée ne peut pas être changée comme un mot de passe, et les capteurs ont besoin de protections contre les photos ou les empreintes copiées. Une conception utile emploie la biométrie localement pour déverrouiller une clé protégée et n’envoie qu’une signature au serveur.
Authentifie aussi les processus
Pour une connexion locale de domaine Unix, SO_PEERCRED sous Linux obtient les identifiants du processus distant auprès du noyau au lieu de faire confiance à un nom envoyé par le client. Entre machines, les services utilisent des clés, des certificats ou des jetons stockés avec un accès réservé au compte de service. Après la connexion, les vérifications d’accès ordinaires du système d’exploitation utilisent l’UID ou le jeton d’accès ; elles ne demandent pas si l’utilisateur a saisi un mot de passe ou touché une clé.
Points clés
- L’authentification multifacteur combine différents types de facteurs, et non simplement deux questions.
- Les codes TOTP peuvent être transmis tant qu’ils sont valides.
- La connexion par clé publique prouve la possession sans envoyer la clé privée.
- FIDO2 lie l’authentification au site prévu.
- Le FAR et le FRR utilisent des populations de tentatives différentes.
- Un seuil biométrique plus strict réduit les acceptations d’imposteurs au prix d’une hausse des rejets légitimes.
- Les identifiants d’un processus distant local devraient provenir du noyau.
3Contrôle l’accès aux fichiers et aux autres ressources
Une identité authentifiée nécessite encore une décision pour chaque ressource demandée. Représente les droits dans une matrice d’accès, puis compare les listes associées aux objets aux jetons détenus par les processus. Étudie les permissions des fichiers et des répertoires avant d’ajouter les politiques obligatoires et les rôles professionnels. Une même demande peut faire intervenir une référence ouverte, des bits de mode ordinaires et une frontière de protection du service appliquée de façon centralisée.
3.1 Compare les listes de contrôle d’accès et les capacités
Une décision d’accès comporte trois éléments : un sujet demande à effectuer une opération sur un objet. Le sujet est généralement un processus agissant pour un principal ; les objets comprennent les fichiers, les périphériques et les autres processus. Une matrice d’accès représente les droits dans des cases, avec les sujets en lignes et les objets en colonnes.
Stocke les mêmes droits de deux façons
Supposons qu’alice puisse lire et modifier report.txt, que bob puisse seulement le lire et que le service de sauvegarde puisse lire à la fois report.txt et payroll.db. Bob peut aussi lire et modifier payroll.db. Alice et bob peuvent utiliser l’imprimante ; le service de sauvegarde ne le peut pas. Dans un système réel, la matrice est beaucoup plus grande et la plupart de ses cases sont vides.
Une liste de contrôle d’accès (ACL) stocke une colonne avec son objet. La liste de report.txt nomme alice, bob et backup avec leurs droits respectifs. Une liste de capacités stocke une ligne avec le sujet. Bob détient des jetons pour lire le rapport, lire et modifier les données de paie, et utiliser l’imprimante.
| Question | ACL | Liste de capacités |
|---|---|---|
| Qui peut utiliser cet objet ? | Examiner sa liste | Trouver tous les détenteurs |
| Que peut utiliser ce sujet ? | Examiner de nombreux objets | Examiner ses jetons |
| Comment déléguer des droits limités ? | Ajouter ou modifier des entrées | Transmettre certains jetons sans ajouter de droits |
| Qu’est-ce qui rend la révocation difficile ? | Des références déjà accordées peuvent subsister | Des copies de jetons peuvent s’être propagées |
Une capacité désigne à la fois un objet et les opérations autorisées ; son détenteur ne peut ni la falsifier ni en étendre les droits. La copie et la délégation autorisées sont possibles. Le noyau peut détenir le véritable jeton tandis que le code utilisateur détient un indice ; une autre architecture protège le jeton par cryptographie.
Suis un descripteur après l’ouverture
Unix combine les deux approches. open() vérifie les droits de l’appelant par rapport aux permissions du fichier, puis renvoie un descripteur de fichier qui enregistre l’accès accordé. Les lectures et écritures ultérieures vérifient cette référence ouverte. Un processus fils peut en hériter par fork(), ou un processus peut la recevoir par une socket de domaine Unix.
Alice ouvre app.log en écriture. Son propriétaire change le mode en 444. Le descripteur déjà ouvert d’alice permet toujours d’écrire ; une nouvelle tentative d’ouverture du fichier en écriture se heurte au nouveau mode. Mettre à jour l’ACL qui régit les ouvertures futures n’annule pas toutes les capacités déjà délivrées. Les handles Windows suivent le même principe général.
Capsicum de FreeBSD rend cela utile pour le confinement. Après cap_enter(), un processus ne peut pas ouvrir un chemin absolu arbitraire. Il peut agir au moyen des descripteurs existants, recevoir des descripteurs et utiliser openat() sous un descripteur de répertoire qu’il détient. Un processus père peut donc donner à un processus travailleur exactement les fichiers dont il a besoin. Les noyaux fondés sur les capacités tels que seL4 et Fuchsia étendent l’idée aux objets du noyau en général.
Distingue l’autre sens de capacité sous Linux
Les capacités Linux répartissent les privilèges de root en catégories. CAP_NET_BIND_SERVICE permet de se lier aux ports de numéro inférieur ; CAP_DAC_OVERRIDE contourne les vérifications ordinaires d’accès aux fichiers. Ces privilèges ne désignent pas un objet particulier : ils diffèrent donc d’une capacité au sens de la matrice d’accès. Un seul privilège Linux peut autoriser une catégorie d’opérations sur de nombreux objets.
Points clés
- Les ACL organisent les droits par objet ; les listes de capacités les organisent par sujet.
- Une capacité ne peut pas être falsifiée ni étendue par son détenteur.
- Les descripteurs conservent l’accès accordé à l’ouverture d’un objet.
- Modifier le mode d’un fichier ne révoque normalement pas les descripteurs existants.
- Les capacités Linux répartissent les privilèges de root et ne désignent pas d’objets particuliers.
3.2 Lis et définis les permissions sous Unix et Windows
Les permissions Unix associent des droits au propriétaire, au groupe propriétaire et à tous les autres. Pour décider d’un accès, identifie d’abord l’opération et l’objet concerné. Lire le contenu d’un fichier, traverser un répertoire et supprimer un nom exigent des permissions différentes.
Décode et sélectionne les bits
La lecture vaut 4, l’écriture 2 et l’exécution 1. Additionne ces valeurs pour chaque classe : 754 signifie rwxr-xr-- ; 640 signifie rw-r-----. chmod 640 notes.txt définit un mode, tandis que chmod g+w,o-r notes.txt modifie certains bits. Le propriétaire ou root peut modifier le mode ; changer le propriétaire exige les privilèges root, représentés par CAP_CHOWN sous Linux.
Le noyau sélectionne la première classe correspondante : propriétaire si l’UID effectif correspond, sinon groupe si un groupe du processus correspond, sinon autres. Il ne combine pas les classes et n’essaie pas une classe plus généreuse. Alice possède un fichier de mode 077 : ses bits de propriétaire n’accordent aucun droit, elle ne peut donc pas le lire même si le groupe et les autres ont tous les droits. En tant que propriétaire, elle peut toutefois modifier le mode.
Root contourne normalement les vérifications de lecture et d’écriture. Pour exécuter un fichier ordinaire soumis aux vérifications discrétionnaires habituelles de Linux, au moins un bit d’exécution doit être activé. Une politique obligatoire peut imposer d’autres restrictions.
Interprète les bits des répertoires et les bits spéciaux
Pour un répertoire, la lecture permet de répertorier les noms ; l’exécution autorise la traversée et la recherche ; l’écriture associée à l’exécution permet de créer, supprimer et renommer des entrées. Supprimer un nom modifie son répertoire : un fichier de mode 000 peut donc être supprimé par une personne disposant des droits nécessaires sur le répertoire.
Setuid ajoute 4000 en octal au mode d’un exécutable et change l’identité utilisateur effective lors de son exécution. Setgid ajoute 2000 et change de la même façon le groupe ; sur un répertoire, il fait hériter aux nouveaux fichiers le groupe du répertoire. Le bit de restriction de suppression ajoute 1000. Un répertoire tel que /tmp, de mode 1777, n’autorise la suppression ou le renommage que par le propriétaire du fichier, le propriétaire du répertoire ou un processus privilégié, les permissions ordinaires sur le répertoire restant nécessaires.
Retire des bits lors de la création de fichiers
Un umask désactive des bits du mode demandé par un programme. C’est une opération sur les bits, pas une soustraction octale. Avec les demandes habituelles de 666 pour les fichiers et de 777 pour les répertoires :
| Umask | Nouveau fichier | Nouveau répertoire |
|---|---|---|
| 022 | 644 | 755 |
| 027 | 640 | 750 |
| 000 | 666 | 777 |
Un umask ne peut pas ajouter des droits d’exécution absents de la demande pour le fichier.
Lis des listes d’accès plus détaillées
Les ACL POSIX ajoutent des utilisateurs et des groupes nommés. setfacl -m u:bob:r report.txt donne à bob une entrée nominative de lecture ; getfacl l’affiche et ls -l marque l’ACL étendue avec +. Le masque d’ACL limite les utilisateurs nommés, les groupes nommés et le groupe propriétaire : une entrée nominative peut donc afficher plus de droits que ceux qui sont effectifs.
Windows NTFS utilise un descripteur de sécurité avec un SID propriétaire et une DACL composée d’ACE ordonnées qui autorisent ou refusent des droits. L’évaluation s’arrête dès qu’un droit demandé est refusé ou que tous les droits demandés ont été accordés ; les droits non accordés sont refusés. L’ordre recommandé place les entrées explicites avant les entrées héritées, avec les refus avant les autorisations dans chaque groupe. Une autorisation explicite peut donc régler une demande avant qu’un refus hérité soit atteint. Une SACL distincte sélectionne les événements d’accès à auditer.
Points clés
- Choisis la classe de permission Unix correspondante avant de vérifier ses bits.
- Les permissions du répertoire régissent les noms ; celles du fichier régissent son contenu.
- Le bit de restriction de suppression ajoute une vérification de propriété pour la suppression et le renommage.
- Un umask désactive les bits demandés et n’en ajoute jamais.
- Le masque d’ACL POSIX limite les droits de la classe du groupe et des entrées nominatives.
- L’évaluation d’une DACL Windows dépend de l’ordre des ACE.
- Une SACL sélectionne les accès à auditer au lieu d’accorder des accès.
3.3 Compare les contrôles d’accès discrétionnaire, obligatoire et fondé sur les rôles
Les différents modèles de contrôle d’accès répondent à différentes questions de gestion. Qui peut accorder un accès ? Un programme compromis peut-il partager les données d’un utilisateur ? Comment un administrateur peut-il changer les droits de nombreux employés sans modifier chaque fichier ? Un même système d’exploitation peut appliquer plusieurs modèles à une même demande.
Distingue le choix du propriétaire de la politique système
Dans le contrôle d’accès discrétionnaire (DAC), le propriétaire d’un objet décide qui peut l’utiliser. Les modes et les ACL Unix sont des mécanismes courants. Leur faiblesse est qu’un programme malveillant agissant sous l’identité de l’utilisateur peut exercer les droits de celui-ci, notamment copier ailleurs les données qu’il peut lire.
Dans le contrôle d’accès obligatoire (MAC), une politique définie par l’administrateur pour l’ensemble du système limite les accès indépendamment des souhaits du propriétaire. Le noyau applique le MAC en plus du DAC. Les deux vérifications doivent autoriser l’accès : un mode de fichier permissif ne l’emporte donc pas sur un refus obligatoire.
Le modèle de Bell–LaPadula protège la confidentialité à l’aide de niveaux ordonnés et de deux règles : pas de lecture vers le haut et pas d’écriture vers le bas. Un processus Secret peut lire des données Confidentiel et écrire vers une destination Très Secret. Il ne peut pas lire des données Très Secret ni écrire des données Confidentiel. Un programme ne peut pas transférer des informations de Secret vers Confidentiel simplement en les lisant et en les réécrivant. Le modèle de Biba inverse les directions de lecture et d’écriture pour protéger l’intégrité.
Confine un service même lorsqu’il est root
SELinux attribue des étiquettes de type aux fichiers et exécute les processus dans des domaines. Une politique indique quel domaine peut effectuer quelles opérations sur chaque type ; les accès non répertoriés sont refusés. Un serveur web dans httpd_t peut lire les pages étiquetées httpd_sys_content_t tout en étant bloqué pour user_home_t, même si les modes Unix ordinaires autorisent la lecture. ls -Z affiche les étiquettes.
En mode enforcing, SELinux bloque et journalise les violations. En mode permissive, il les journalise sans les bloquer. Root dans un domaine confiné doit toujours respecter une politique appliquée en mode enforcing. L’UID 0 et l’accès sans restriction sont donc deux affirmations différentes.
AppArmor confine les programmes avec des profils fondés sur les chemins de fichiers et les capacités autorisées. Il est couramment utilisé sur Ubuntu et SUSE. SELinux et AppArmor fonctionnent par l’intermédiaire des points d’accroche des modules de sécurité Linux (LSM) lors des décisions de sécurité. Android combine des UID propres aux applications avec SELinux ; les systèmes Apple utilisent aussi des profils de bac à sable pour les applications.
Attribue des rôles professionnels plutôt que des droits individuels
Dans le contrôle d’accès fondé sur les rôles (RBAC), les permissions sont associées aux rôles et les utilisateurs sont affectés à des rôles. Faire passer une personne d’un poste à un autre modifie ses rôles plutôt que de nombreuses permissions indépendantes sur les objets.
Supposons que 50 employés aient chacun besoin de 20 permissions. Une attribution directe nécessite 1 000 liens entre utilisateurs et permissions. Si cinq rôles détiennent chacun 20 permissions et que chaque employé a un rôle, la gestion nécessite 50 liens entre utilisateurs et rôles et 100 liens entre rôles et permissions : 150 au total. L’économie provient des profils de poste partagés, pas de la suppression de permissions nécessaires.
Les groupes Windows utilisés comme rôles et les politiques sudo fondées sur les groupes mettent en œuvre ce principe. Le DAC convient aux fichiers gérés par leur propriétaire, le MAC confine les services selon des règles appliquées de façon centralisée et le RBAC organise les attributions administratives. Un service peut recevoir les droits liés à sa fonction par un rôle, tandis que le DAC et le MAC vérifient tous deux son accès effectif aux fichiers.
Points clés
- Le DAC laisse les propriétaires choisir les accès ; le MAC applique une politique commune à tout le système.
- Une demande doit être autorisée à la fois par le DAC et par le MAC appliqué en mode contraignant.
- Bell–LaPadula bloque les lectures vers le haut et les écritures vers le bas.
- Les domaines et les types SELinux peuvent confiner les processus root.
- Le RBAC gère les permissions par des rôles professionnels.
4Exécute des systèmes d’exploitation dans des machines virtuelles
Exécuter plusieurs noyaux sur un ordinateur ajoute une couche de protection sous le système d’exploitation. Un hyperviseur doit préserver la vue de chaque invité tout en gardant le contrôle du temps processeur physique, de la mémoire et des périphériques. Suis les mécanismes depuis les instructions interceptées jusqu’à la traduction des adresses en deux étapes, puis compare les interfaces de périphériques et les voies restantes par lesquelles un invité pourrait affecter son hôte.
4.1 Décris les machines virtuelles et les hyperviseurs
Une machine virtuelle donne à un système d’exploitation complet l’apparence de disposer de son propre ordinateur. Ce système d’exploitation est le système invité. L’ordinateur physique est l’hôte, et l’hyperviseur, ou moniteur de machine virtuelle (VMM), attribue aux invités du temps processeur réel, de la mémoire et des périphériques.
Préserve le comportement tout en gardant le contrôle
Le cadre défini par Popek et Goldberg en 1974 identifie trois propriétés. L’équivalence signifie que les programmes se comportent comme sur une machine réelle, à l’exception des temps d’exécution et des ressources disponibles. Le contrôle des ressources signifie que l’hyperviseur garde la maîtrise du matériel. L’efficacité signifie que la plupart des instructions de l’invité s’exécutent directement sur le processeur.
L’hyperviseur ordonnance les processeurs virtuels (vCPU) sur les cœurs physiques. Une commutation de machine sauvegarde l’état d’exécution complet d’une machine virtuelle, y compris les registres privilégiés et les paramètres d’interruption, puis restaure celui d’une autre. Un invité voit son propre état même lorsqu’il partage un cœur physique avec d’autres invités.
| Architecture | Où s’exécute l’hyperviseur | Exemples |
|---|---|---|
| Type 1, sur matériel nu | Contrôle directement le matériel | ESXi, Xen, Hyper-V |
| Type 2, hébergé | S’exécute comme une application sur un système d’exploitation hôte | VirtualBox, VMware Workstation, Parallels Desktop |
KVM transforme le noyau Linux lui-même en hyperviseur et est généralement classé dans le type 1. Un hôte Linux complet reste disponible, ce qui rend la distinction simple entre les deux types moins nette. Pour raisonner sur la protection, identifie le composant qui contrôle réellement la virtualisation du processeur et de la mémoire.
Utilise l’abstraction de la machine
La consolidation des serveurs regroupe des systèmes peu utilisés. Douze serveurs utilisant chacun en moyenne 5 % d’un ordinateur à huit cœurs ont besoin, ensemble, de 60 % d’un tel ordinateur. Cette moyenne laisse penser que la consolidation est possible, mais les pics simultanés, les besoins en mémoire vive et les demandes aux périphériques exigent encore une marge.
Un instantané sauvegarde l’état d’une machine virtuelle pour une restauration ultérieure. Copier une image disque seule ne capture pas l’état d’un processeur en cours d’exécution et de sa mémoire. La migration à chaud transfère une machine virtuelle en cours d’exécution vers un autre hôte, en copiant la mémoire et en basculant l’exécution après une courte pause. Ces opérations sont possibles parce que l’état machine de l’invité est représenté par des données que l’hyperviseur gère.
Les machines virtuelles permettent aussi de tester d’anciens systèmes, de séparer des logiciels incompatibles et d’exécuter différents systèmes d’exploitation sur du matériel compatible. Un invité Windows peut s’exécuter dans une machine virtuelle à côté d’un invité Linux, chacun avec son propre noyau. Les instances de serveur dans le cloud utilisent couramment cette frontière.
Distingue la virtualisation de l’émulation complète
Un émulateur peut interpréter ou traduire un jeu d’instructions pour un autre processeur, comme du code ARM sur x86. La virtualisation matérielle exécute normalement les instructions de l’invité directement sur un processeur compatible et intervient lors d’événements sensibles. Cela explique à la fois sa vitesse et son besoin d’une prise en charge par le processeur.
Des noyaux invités distincts forment une frontière utile : prendre le contrôle d’un noyau invité ne donne pas directement le contrôle du noyau hôte. Cette frontière dépend toutefois du bon fonctionnement du code de l’hyperviseur et du modèle de périphérique. Une évasion de machine virtuelle exploite cette couche, tandis qu’un canal auxiliaire peut divulguer des données par le matériel partagé sans accorder d’accès mémoire ordinaire. Choisir une machine virtuelle réduit les interfaces exposées à un invité non fiable ; cela ne rend pas le matériel partagé infaillible.
Points clés
- Une machine virtuelle présente une machine complète à son système d’exploitation invité.
- L’équivalence, le contrôle des ressources et l’efficacité décrivent le rôle d’un VMM.
- Un vCPU est ordonnancé sur un processeur physique.
- Les instantanés et la migration reposent sur la sauvegarde et le transfert de l’état machine.
- La consolidation exige une marge pour les pics de demande, et pas seulement une moyenne faible.
- L’isolation des machines virtuelles dépend du bon fonctionnement de l’hyperviseur, du modèle de périphérique et du matériel.
4.2 Virtualise le processeur
Un noyau invité s’attend à contrôler sa machine. L’hyperviseur doit préserver cette apparence sans lui céder l’ordinateur réel. La virtualisation du processeur permet aux instructions ordinaires de l’invité de s’exécuter directement et intercepte les opérations qui doivent modifier l’état de la machine virtuelle.
Intercepte et émule l’état virtuel
Dans le mécanisme classique d’interception et émulation, le noyau invité est déprivé. Sa tentative de charger un registre de table des pages ou d’installer une table des vecteurs de déroutement provoque un déroutement vers l’hyperviseur. Celui-ci met à jour le registre ou la table virtuelle de l’invité et reprend l’exécution. Il ne laisse pas l’invité remplacer les structures de contrôle réelles de l’hyperviseur.
Dans cette architecture, un appel système de l’invité peut nécessiter plusieurs franchissements. L’application invitée provoque un déroutement vers le gestionnaire réel de l’hyperviseur. Celui-ci transfère l’exécution au gestionnaire enregistré du noyau invité avec des privilèges réduits. Lorsque le noyau invité revient, ce retour privilégié provoque un nouveau déroutement ; l’hyperviseur effectue le retour réel vers l’application invitée.
La condition de Popek et Goldberg pour cette technique est que toute instruction sensible soit privilégiée. Sensible signifie qu’elle modifie la configuration de la machine ou se comporte différemment selon les privilèges. Privilégiée signifie qu’elle provoque un déroutement hors du mode le plus privilégié. Les différences silencieuses ne peuvent pas être émulées si l’hyperviseur n’apprend jamais qu’elles se sont produites.
Comprends l’obstacle du x86 classique
L’analyse de Robin et Irvine en 2000 a identifié 17 instructions x86 sensibles non privilégiées. Par exemple, POPF peut restaurer l’indicateur d’activation des interruptions avec des privilèges suffisants, mais le laisse silencieusement inchangé avec des privilèges réduits. Un invité déprivé peut croire qu’il a désactivé les interruptions alors qu’aucun déroutement n’a informé l’hyperviseur qu’il devait mettre à jour son état virtuel des interruptions.
Trois approches résolvent ce problème :
| Approche | Comment elle intercepte l’opération | Modification de l’invité |
|---|---|---|
| Traduction binaire | Réécrit les instructions problématiques du noyau invité avant exécution et met le code traduit en cache | Aucune modification du code source |
| Paravirtualisation | Remplace les opérations privilégiées par des hyperappels explicites | Noyau invité modifié |
| Assistance matérielle | Fournit un mode distinct pour l’invité et des sorties de machine virtuelle contrôlées | Un invité non modifié peut s’exécuter |
VMware a utilisé la traduction binaire en 1999 ; Xen a utilisé la paravirtualisation en 2003. Intel VT-x est arrivé en 2005 et AMD-V en 2006. Les applications ordinaires de l’invité peuvent toujours s’exécuter directement lorsque le code du noyau nécessite une traduction ou des hyperappels.
Distingue le numéro d’anneau du mode de virtualisation
Avec Intel VT-x, l’hyperviseur s’exécute en mode VMX root et un invité en mode non-root. Le noyau invité peut y utiliser l’anneau 0. L’anneau 0 dans un invité ne donne pas le contrôle de l’hôte physique.
Les événements configurés provoquent une sortie de machine virtuelle, qui sauvegarde l’état du vCPU dans une structure de contrôle telle que la VMCS. L’hyperviseur traite l’événement et reprend l’exécution par une entrée en machine virtuelle. De nombreux appels système peuvent rester entièrement à l’intérieur de l’invité. ARM utilise EL2 pour l’hyperviseur ; RISC-V fournit une extension pour hyperviseur.
Si un invité exécute HLT et que cet événement est configuré pour provoquer une sortie, l’hyperviseur marque son vCPU comme étant en attente et ordonnance un autre travail jusqu’à l’arrivée d’une interruption virtuelle. Le cœur physique n’a pas besoin de rester inactif. Les sorties et les entrées prennent toutefois du temps, généralement de centaines à des milliers de cycles : le regroupement et les interfaces paravirtuelles restent donc utiles.
Points clés
- L’interception et l’émulation appliquent les opérations sensibles à l’état de la machine virtuelle.
- L’interception et l’émulation classiques exigent que les instructions sensibles provoquent un déroutement.
- La traduction binaire réécrit le code ; la paravirtualisation modifie l’interface de l’invité.
- L’anneau 0 d’un invité sous VT-x reste distinct du mode VMX root.
- Les sorties de machine virtuelle sont des événements contrôlés qui ont un coût réel en performances.
4.3 Virtualise la mémoire
Une application invitée utilise une adresse virtuelle de l’invité. Son noyau la traduit en adresse physique de l’invité, qui correspond à la représentation de la mémoire vive par l’invité. L’hyperviseur associe ensuite cette adresse à une adresse physique de l’hôte, ou adresse machine. Chaque invité peut croire que sa mémoire vive commence à zéro tout en utilisant des cadres réels différents.
Conserve le déplacement dans la page
Utilise des pages de 4 KiB. L’invité associe la page virtuelle 2 au cadre 7 de l’invité ; l’hyperviseur associe le cadre 7 de l’invité au cadre machine 42. Pour l’adresse 0x2ABC :
- Décompose-la en page 2 et déplacement
0xABC. - Remplace la page 2 par le cadre 7 de l’invité, ce qui donne
0x7ABC. - Remplace le cadre 7 de l’invité par le cadre machine 42, soit
0x2Aen hexadécimal. - Conserve le déplacement, ce qui donne l’adresse machine
0x2AABC, soit 174 780 octets à partir de l’adresse zéro.
Seul le numéro de page change. Traiter l’adresse physique de l’invité comme une adresse réelle en mémoire vive contournerait la décision d’allocation et d’isolation de l’hyperviseur.
Compare la traduction logicielle et matérielle
Les tables des pages fantômes associent directement les pages virtuelles de l’invité aux cadres machine. La MMU réelle utilise ces tables construites par l’hyperviseur. Celui-ci protège en écriture les pages contenant les tables des pages de l’invité et intercepte les modifications et les changements de table de l’invité afin que ses tables fantômes restent cohérentes. Des changements fréquents d’espace d’adressage de l’invité provoquent donc des déroutements supplémentaires.
La pagination imbriquée, Intel EPT ou AMD NPT, confie les deux étapes à la MMU. Le matériel parcourt les tables de l’invité et les tables qui associent les adresses physiques de l’invité aux adresses machine. Les mises à jour des tables des pages de l’invité n’ont plus toutes besoin d’être interceptées par logiciel. Le TLB met en cache la traduction finale combinée.
Un échec de recherche dans le cache peut rester coûteux. Avec quatre niveaux à chaque étape, chacune des quatre entrées de la table de l’invité nécessite quatre accès à la table imbriquée, plus l’accès à l’entrée elle-même : 20 accès. La traduction de l’adresse physique finale des données de l’invité en ajoute quatre, soit 24 accès de traduction avant l’accès aux données. Les pages de grande taille et les caches de parcours des tables des pages réduisent ce travail dans le pire des cas, sans résultat en cache.
Récupère de la mémoire malgré une connaissance limitée de l’invité
La surallocation mémoire promet aux invités plus de mémoire au total que l’hôte n’en possède. Quatre machines virtuelles de 16 GiB totalisent 64 GiB sur un hôte de 48 GiB. Cela ne fonctionne que tant que leurs besoins effectifs tiennent dans la mémoire disponible ; si elles deviennent toutes occupées, il faut récupérer de la mémoire ou utiliser l’espace d’échange.
Un pilote de ballonnement dans un invité alloue des pages à la demande de l’hyperviseur. Le système invité choisit ce qu’il libère, tandis que l’hyperviseur récupère les cadres machine correspondant aux pages du ballon. Cela réduit le déficit d’information : l’invité sait quelles données comptent, tandis que l’hyperviseur voit les allocations sans en connaître tout le sens.
Le partage de pages, comme avec KSM de Linux, fusionne les pages identiques en une copie en lecture seule et les sépare en cas d’écriture. L’échange de pages par l’hyperviseur offre un autre recours, mais peut faire de mauvais choix faute de disposer des connaissances de l’invité. Un périphérique directement affecté à la machine virtuelle a aussi besoin d’une IOMMU pour traduire et limiter ses adresses DMA.
Le partage de pages identiques entre clients a un coût pour la confidentialité : la durée d’une copie sur écriture peut révéler si un autre invité détient les mêmes données. Les fournisseurs de cloud désactivent couramment cette forme de partage entre clients, même si elle économise de la mémoire.
Points clés
- Les adresses virtuelles de l’invité, physiques de l’invité et machine appartiennent à des couches différentes.
- Le déplacement dans la page reste inchangé au cours des deux traductions.
- Les tables fantômes exigent que l’hyperviseur suive les modifications des tables de l’invité.
- La pagination imbriquée effectue les deux étapes dans le matériel et met le résultat combiné en cache.
- La surallocation dépend du maintien de la demande sous la capacité disponible.
- Le ballonnement utilise les connaissances de l’invité ; le partage de pages peut exposer des informations par les temps d’accès.
4.4 Virtualise les périphériques et isole les machines virtuelles les unes des autres
Une machine virtuelle a besoin de stockage, d’un réseau et d’autres périphériques en plus du temps processeur et de la mémoire vive. L’interface de périphérique influe sur la compatibilité, les performances et le code qu’un invité non fiable peut atteindre. Une interface rapide et une interface de confiance restreinte sont des choix de conception liés, mais ne constituent pas la même propriété.
Choisis comment l’invité accède à un périphérique
| Approche | Interface de l’invité | Principal compromis |
|---|---|---|
| Émulation | Modèle d’un périphérique physique connu | Les pilotes existants fonctionnent, mais les opérations sur les registres demandent un traitement logiciel |
| Périphérique paravirtuel | Pilote conçu pour la virtualisation et files partagées | Regroupement efficace, mais l’invité a besoin du pilote |
| Affectation directe | Périphérique physique ou fonction virtuelle attribué | Accès proche des performances natives, mais partage et migration plus difficiles |
Un programme auxiliaire tel que QEMU peut émuler une carte réseau Intel e1000. Le pilote ordinaire de l’invité écrit dans des registres connus ; le programme auxiliaire en réalise les effets. Des accès fréquents aux registres peuvent provoquer de nombreuses sorties et opérations logicielles.
Un pilote virtio, lui, échange des requêtes par des files en mémoire partagée. Il peut placer plusieurs opérations dans une file et notifier une seule fois le composant qui les traite. Les périphériques vmxnet3 de VMware et VMBus de Hyper-V suivent des architectures apparentées conçues pour la virtualisation. Un pilote de périphérique paravirtuel ne signifie pas que tout le noyau invité doit utiliser des opérations processeur paravirtuelles.
Avec l’affectation directe de périphérique, l’invité dispose d’un périphérique physique ou d’une fonction virtuelle SR-IOV. L’IOMMU limite le DMA à la mémoire de la machine virtuelle. L’affectation directe réduit les interventions logicielles, mais le transfert de l’état du périphérique vers un autre hôte peut rendre la migration à chaud difficile.
Traite les disques virtuels comme un état géré
Un disque virtuel est généralement un fichier sur l’hôte, tel que qcow2, VMDK ou VHDX, ou un volume de stockage. Les images à copie sur écriture permettent à de nombreux invités de partager une base tout en enregistrant des modifications distinctes. Les instantanés peuvent conserver l’état du disque à faible coût, et un instantané complet d’une machine en cours d’exécution nécessite aussi son état d’exécution et sa mémoire. Le clonage et la migration reposent sur la capacité de l’hyperviseur à gérer ces représentations.
Repère la frontière qu’un attaquant doit franchir
Un noyau invité compromis contrôle déjà sa machine virtuelle, mais atteindre l’hôte exige une évasion de machine virtuelle ou une autre défaillance de frontière. La faille VENOM de 2015 touchait le contrôleur de lecteur de disquettes émulé de QEMU et pouvait permettre au code invité de s’exécuter dans le processus QEMU de l’hôte. Maintenir l’émulation des périphériques dans un processus distinct placé dans un bac à sable limite les pouvoirs exposés par un tel bogue.
Les caches de processeur, les prédicteurs de branchement et les bus mémoire partagés créent aussi des canaux auxiliaires. Spectre et L1TF ont montré que l’isolation ne peut pas être jugée à partir des seules projections de pages. Les mesures d’atténuation comprennent les mises à jour du processeur et du microcode, l’effacement de l’état pertinent entre invités et l’évitement du placement simultané de clients différents sur les fils d’exécution matériels d’un même cœur.
L’informatique confidentielle, notamment AMD SEV-SNP et Intel TDX, protège la mémoire de l’invité contre l’hyperviseur grâce à des clés de chiffrement détenues par le matériel et permet l’attestation de l’environnement lancé. Elle étend la frontière de confiance face à un hôte ou à un opérateur compromis. Elle ne supprime ni tous les canaux auxiliaires ni toutes les possibilités pour un hôte d’interrompre le service. La sécurité des machines virtuelles dépend toujours de l’hyperviseur, des interfaces de périphériques, du matériel et de leur configuration.
Points clés
- L’émulation favorise la compatibilité ; les files paravirtuelles réduisent les sorties répétées.
- L’affectation directe exige que l’IOMMU limite le DMA du périphérique.
- Les disques virtuels et l’état machine sauvegardé permettent les instantanés et la migration.
- Les bogues du modèle de périphérique peuvent permettre une évasion de machine virtuelle.
- Le matériel partagé peut divulguer des informations sans violation ordinaire des permissions mémoire.
- L’informatique confidentielle protège la mémoire de l’invité contre l’hôte dans les limites des garanties matérielles.
5Isole les applications avec des conteneurs
Les conteneurs construisent un environnement isolé autour de processus ordinaires utilisant le noyau de l’hôte. Leurs vues privées, leurs limites de ressources et leurs pouvoirs proviennent de différentes fonctions du noyau, qui exigent chacune une attention distincte. Lis les correspondances des espaces de noms et les paramètres des groupes de contrôle, puis relie-les aux restrictions de privilèges. Utilise la frontière du noyau partagé pour déterminer si des conteneurs, des machines virtuelles ou une combinaison des deux conviennent à une charge de travail.
5.1 Limite ce qu’un processus voit avec les espaces de noms
Un conteneur Linux est un ensemble de processus utilisant le noyau de l’hôte avec des vues et des privilèges restreints. Il n’a ni noyau distinct ni ordinateur émulé. Les espaces de noms donnent aux processus des instances privées de ressources qui seraient autrement globales.
Associe chaque espace de noms à sa vue
| Espace de noms | Ce qu’il sépare |
|---|---|
| Montage | Systèmes de fichiers montés et arborescence visible |
| PID | Numéros de processus et visibilité des processus |
| Réseau | Interfaces, adresses, routes, ports et règles de pare-feu |
| UTS | Nom d’hôte et nom de domaine NIS |
| IPC | Objets IPC System V et files de messages POSIX |
| Utilisateur | Correspondances des identifiants d’utilisateur et de groupe et capacités limitées à un périmètre |
| Cgroup | Partie visible de la hiérarchie des cgroups |
| Temps | Décalages des horloges monotone et de démarrage |
clone() avec des options d’espace de noms crée un processus fils dans les nouveaux espaces de noms sélectionnés. unshare() sépare le contexte des espaces de noms, et setns() rejoint un espace de noms existant par un descripteur tel que celui ouvert depuis /proc/1234/ns/net. La réassociation PID affecte les processus fils créés ensuite sans déplacer l’appelant. Pour les espaces de noms temps, unshare(CLONE_NEWTIME) prépare aussi un espace de noms pour les processus fils créés ensuite ; setns() peut déplacer l’appelant dans un espace de noms temps existant. Les espaces de noms temps sont créés avec unshare().
Ainsi, unshare --pid --fork --mount-proc bash utilise --fork pour créer l’interpréteur dans le nouvel espace de noms PID. Cet interpréteur y est le PID 1, même si son PID sur l’hôte est 48213. Le PID 1 adopte les processus orphelins ; s’il se termine, le noyau met fin aux processus restants de l’espace de noms. Les processus d’un espace de noms ancêtre peuvent voir leurs descendants, tandis que les processus internes ne peuvent pas voir vers l’extérieur dans les espaces de noms PID ancêtres.
Sépare les fichiers et le réseau
Un espace de noms de montage fournit une liste de montages privée. Un moteur d’exécution assemble une arborescence de fichiers et en fait la racine avec pivot_root. Un conteneur peut utiliser les /etc et /usr d’une autre distribution Linux tout en faisant appel au noyau de l’hôte. chroot seul ne change que le point de départ de la résolution des chemins ; ce n’est pas une frontière sûre contre un processus privilégié.
Un nouvel espace de noms réseau possède une interface de bouclage. Un moteur d’exécution peut le connecter au moyen d’une paire d’interfaces veth, avec une extrémité à l’intérieur et l’autre connectée à un pont de l’hôte. Des piles distinctes permettent à deux conteneurs d’écouter tous deux sur le port 80 sans se disputer le port d’un même espace de noms.
Traduis les identités à travers un espace de noms utilisateur
Une ligne de /proc/<pid>/uid_map indique le premier identifiant interne, le premier identifiant externe et la longueur de la plage. La ligne 0 100000 65536 associe les identifiants internes 0–65535 aux identifiants 100000–165535 de l’hôte. L’UID interne 1000 correspond donc à 101000 à l’extérieur. Les identifiants sans correspondance utilisable sont normalement affichés sous l’UID de débordement 65534.
Root dans cet espace de noms possède des capacités sur les ressources qu’il régit, mais pas de pouvoir sur tout l’hôte. Charger un module du noyau ou changer l’horloge système réelle exige toujours des privilèges dans l’espace de noms utilisateur initial. Une correspondance d’UID ne protège pas une socket privilégiée de moteur d’exécution transmise au conteneur.
Une vue privée ne limite pas non plus la consommation. Un processus disposant de ses propres espaces de noms PID et de montage peut toujours consommer du temps processeur et de la mémoire vive. Les cgroups limitent les quantités, tandis que les limites de capacités et seccomp restreignent les opérations.
Points clés
- Les conteneurs utilisent des processus du noyau hôte dotés de vues privées des ressources.
- Les huit types d’espaces de noms séparent différents types d’état global.
- La réassociation PID et unshare pour les espaces de noms temps affectent les processus fils créés ensuite ; setns peut rejoindre directement un espace de noms temps.
- Le PID 1 a des responsabilités particulières concernant le cycle de vie des processus dans son espace de noms.
- Les espaces de noms utilisateur traduisent les identifiants et délimitent les pouvoirs.
- Les vues privées ont besoin de limites distinctes pour les ressources et les privilèges.
5.2 Limite les ressources qu’un processus utilise avec les groupes de contrôle
Un groupe de contrôle, ou cgroup, rassemble des processus pour comptabiliser et contrôler les ressources. Les espaces de noms déterminent leur vue ; les cgroups régissent des quantités telles que le temps processeur, la mémoire et le nombre de tâches. Les processus fils héritent du groupe de leur père, et la hiérarchie empêche un groupe fils d’échapper aux limites d’un ancêtre.
Lis les fichiers de cgroup v2
Cgroup v2 utilise une hiérarchie unifiée, normalement sur /sys/fs/cgroup. Un groupe père active les contrôleurs pour ses fils par cgroup.subtree_control, par exemple +cpu +memory +pids. Des fichiers individuels dans chaque groupe fils contiennent les limites et les compteurs.
Les contrôleurs comprennent cpu, cpuset, memory, io, pids, hugetlb et rdma. Ils régissent le temps processeur, le placement sur les processeurs et les nœuds mémoire, la mémoire ordinaire, les entrées-sorties en mode bloc, le nombre de tâches, les pages de très grande taille et les ressources RDMA. Les événements de performance prenant en compte les cgroups permettent la mesure, et cgroup.freeze suspend l’exécution d’un groupe.
Distingue une limite de processeur d’une part
cpu.max contient un quota et une période en microsecondes. 50000 100000 autorise 50 ms d’exécution sur le processeur par période de 100 ms, soit l’équivalent de la moitié d’un processeur. 200000 100000 autorise l’équivalent du temps de deux processeurs, éventuellement réparti sur plusieurs cœurs. max 100000 signifie qu’aucun quota ne s’applique. Une fois le quota consommé, le groupe attend la période suivante même si un processeur est inactif.
cpu.weight fixe une part relative en cas de concurrence, de 1 à 10 000, avec 100 par défaut. Pour des groupes prêts à s’exécuter, placés de façon équivalente sur quatre processeurs, les poids 100 et 300 répartissent le temps disponible selon le rapport 1:3 : environ un processeur et trois processeurs. Si le groupe de poids supérieur devient inactif, l’autre peut utiliser les quatre, sauf si une autre limite intervient. Un poids n’est ni une réservation ni un plafond strict.
Contiens l’épuisement de la mémoire et des tâches
memory.high provoque une récupération de mémoire et ralentit les tâches au-delà de son seuil. memory.max impose une limite stricte. Le noyau essaie d’abord de récupérer de la mémoire, notamment le cache, et utilise l’espace d’échange disponible. S’il ne peut pas en récupérer assez, le mécanisme OOM du cgroup termine un processus admissible dans le groupe concerné.
Pour une valeur memory.max de 512M, la limite est de 536 870 912 octets, soit 512 MiB. Un processus présentant une fuite peut forcer la récupération de mémoire et finir par provoquer la mise à mort d’un processus par le mécanisme OOM, mais la victime est choisie par le noyau et n’est pas nécessairement ce processus. La frontière du groupe contient l’événement au lieu de laisser choisir un processus sans rapport sur l’hôte.
pids.max compte les processus et les fils d’exécution. Avec une limite de 100, toute création supplémentaire échoue avec EAGAIN, ce qui contient la croissance des tâches d’une bombe fork. Une limite d’entrées-sorties telle que 8:0 rbps=10485760 dans io.max plafonne les lectures du périphérique en mode bloc 8:0 à 10 MiB/s.
Ces fichiers ne masquent pas les processus ni les noms de fichiers de l’hôte. De plus, /proc/meminfo et les outils qui le lisent peuvent indiquer la mémoire vive de l’hôte au lieu de memory.max ; le total affiché ne prouve pas à lui seul qu’un cgroup n’a pas de limite. Les mesures de ressources doivent être lues à la couche qui fait respecter la frontière.
Points clés
- Cgroup v2 applique les contrôles de ressources par une hiérarchie unifiée.
- Un groupe fils reste soumis aux limites de ses ancêtres.
- cpu.max est un quota strict ; cpu.weight est une part relative en cas de concurrence.
- memory.high exerce une pression ; memory.max peut conduire à la suppression locale d’un processus par le mécanisme OOM.
- pids.max compte les fils d’exécution aussi bien que les processus.
- Les limites des cgroups ne créent pas de vues privées des ressources de l’hôte.
5.3 Restreins les conteneurs et choisis entre conteneurs et machines virtuelles
Une frontière de conteneur utile combine des vues, des contrôles de ressources et des pouvoirs restreints. Une arborescence privée ne bloque pas à elle seule les appels système dangereux, et un quota de processeur ne bloque pas l’accès à un fichier exposé de l’hôte. Le noyau de l’hôte applique chacun de ces contrôles.
Réduis les pouvoirs du processus
Un moteur d’exécution combine des espaces de noms, des cgroups et une image de système de fichiers contenant des programmes et des bibliothèques. Il peut renforcer la frontière en :
- Exécutant la charge de travail sans être root ou en associant les identifiants du conteneur à ceux de l’hôte par un espace de noms utilisateur.
- Abandonnant des capacités Linux, en particulier des pouvoirs étendus tels que
CAP_SYS_ADMINetCAP_SYS_MODULE. - Appliquant seccomp pour restreindre les appels inutiles.
- Appliquant une politique SELinux ou AppArmor.
- Plaçant le système de fichiers racine en lecture seule lorsque c’est possible.
- Définissant
no_new_privspour que l’exécution de programmes setuid ne puisse pas élever les privilèges.
Chaque contrôle couvre une voie différente. Un système de fichiers racine en lecture seule autorise toujours les opérations réseau permises ; un filtre seccomp autorise toujours les appels de sa liste. La conception devrait correspondre aux opérations dont l’application a réellement besoin.
Identifie le risque du noyau partagé
Tous les conteneurs ordinaires partagent le noyau de l’hôte. Un bogue du noyau accessible peut donc compromettre l’hôte et les autres conteneurs. Dans une machine virtuelle, l’exploitation d’un bogue du noyau invité donne le contrôle de cet invité ; atteindre l’hôte exige une défaillance supplémentaire de la frontière de l’hyperviseur ou des périphériques.
Root dans un conteneur est particulièrement sensible. Sans espace de noms utilisateur, il correspond à l’UID 0 pour le noyau de l’hôte, avec les limites imposées par les capacités, les filtres et la politique obligatoire. Le mode privilégié ou l’accès au système de fichiers racine de l’hôte peut supprimer ces contraintes. Une socket de moteur d’exécution appartenant à root est également dangereuse : son client peut demander au moteur d’effectuer des actions privilégiées. Associer root dans le conteneur à un identifiant non privilégié sur l’hôte ne rend pas cette socket sûre et ne supprime pas les vulnérabilités du noyau.
Choisis une frontière pour la charge de travail
| Besoin | Frontière adaptée | Raison |
|---|---|---|
| Services Linux d’une équipe déployés fréquemment | Conteneurs restreints | Démarrage rapide et faible surcoût sur un seul noyau |
| Code de clients qui ne se font pas confiance | Machines virtuelles ou micromachines virtuelles | Des noyaux invités distincts réduisent l’exposition au noyau partagé |
| Application réservée à Windows sur des hôtes Linux | Machine virtuelle | La charge de travail a besoin d’un autre noyau |
Un conteneur Linux a besoin d’un noyau Linux. Les plateformes Windows et macOS fournissent donc souvent une machine virtuelle Linux sous les conteneurs Linux. Les machines virtuelles démarrent un système d’exploitation et allouent de la mémoire pour chaque noyau ; les conteneurs démarrent des processus ordinaires et permettent de regrouper les charges de travail plus densément.
Reconnais les architectures intermédiaires
gVisor traite de nombreux appels système des conteneurs dans un noyau en espace utilisateur, ce qui réduit le contact direct avec le noyau de l’hôte. Kata Containers donne à chaque bac à sable, généralement un pod Kubernetes, une machine virtuelle légère ; les conteneurs de ce bac à sable partagent son noyau invité. Firecracker fournit des micromachines virtuelles avec un modèle de périphériques minimal pour les plateformes qui exécutent des fonctions ou des charges de travail en conteneurs, notamment AWS Lambda.
Les systèmes cloud placent souvent des conteneurs dans des machines virtuelles : une machine virtuelle sépare les clients tandis que les conteneurs organisent les applications d’un même client. Les noyaux invités et le noyau hôte restent distincts : une évasion de conteneur dans une machine virtuelle ne prouve donc pas à elle seule une évasion de l’hyperviseur.
Points clés
- L’isolation des conteneurs exige des vues, des limites de ressources et des restrictions de privilèges.
- Tous les conteneurs ordinaires d’un hôte partagent son noyau.
- Une correspondance d’UID sans privilèges réduit les pouvoirs, mais ne peut pas corriger les bogues du noyau.
- L’accès à une socket privilégiée de moteur d’exécution peut donner le contrôle de l’hôte.
- Les machines virtuelles peuvent apporter un autre noyau ; les conteneurs utilisent le noyau sous-jacent.
- gVisor, Kata et Firecracker ajoutent différentes frontières autour des charges de travail.
- Les conteneurs dans des machines virtuelles combinent une forte densité d’applications avec des noyaux invités distincts.
Protection, isolation et machines virtuelles : exemples
1Suis une demande à travers la frontière du noyau
16 étapes
- 1IntroductionPars d’une application en cours d’exécution
Un service de production de rapports passe la majeure partie de son temps à calculer en mode utilisateur. Il n’a besoin du noyau que pour les opérations protégées, comme ouvrir un fichier ou mettre en place une projection mémoire.
Suis ce qui change lorsque l’exécution franchit cette frontière : le privilège du processeur change, mais l’identité de l’appelant et la validité de sa demande doivent toujours être vérifiées. Suis ensuite les protections distinctes de la mémoire, des périphériques et du code exécutable.
- 2ExplicationExécute directement le code ordinaire
Le processeur exécute directement les additions, chargements et sauts du service. Le matériel vérifie les privilèges et les permissions mémoire pendant l’exécution ; le noyau n’approuve pas chaque instruction par logiciel.
Une tentative de remplacement d’une table des pages ou de désactivation des interruptions doit provoquer un déroutement. Sinon, le programme pourrait supprimer les restrictions mêmes qui sont censées le contenir. Cette combinaison constitue l’exécution directe limitée.
- 3DéfiUn service cesse d’effectuer des demandes
Le service reste bloqué dans une boucle sans fin en mode utilisateur. Il n’effectue plus aucun appel système. L’ordonnanceur peut-il encore exécuter un autre processus prêt ?
---reveal---
Oui. Une interruption d’horloge matérielle entre dans le noyau sans dépendre de la coopération du service. L’ordonnanceur peut choisir un autre processus. Programmer l’horloge et désactiver les interruptions exigent des privilèges : le service en boucle ne peut donc pas conserver le cœur en évitant les appels système.
- 4ExplicationDemande un service protégé
Pour lire un fichier, la fonction d’enveloppe de bibliothèque place un numéro d’appel, un descripteur, une adresse de tampon et une longueur dans des registres, puis exécute l’instruction d’entrée pour les appels système propre à l’architecture.
Le noyau sauvegarde l’état utilisateur, sélectionne le gestionnaire et obtient les identifiants de l’appelant à partir du processus courant. L’entrée avec les privilèges du noyau n’est que le début : le gestionnaire doit encore déterminer si cet appelant et ces arguments sont autorisés.
- 5ExempleExamine toute la destination
Supposons que le service demande à
read(fd, buf, 8192)de copier des octets dans son tampon. La validité du premier octet ne suffit pas : la copie peut franchir une frontière de page et atteindre une zone interdite.Le noyau doit valider toute la destination nécessaire au transfert et y accéder en toute sécurité. Les routines Linux de copie depuis et vers l’espace utilisateur effectuent des vérifications et traitent les adresses utilisateur invalides sans laisser la copie demandée écraser la mémoire du noyau.
- 6DéfiUne demande utilise un type d’accès incorrect
Le tampon est valide, mais le service essaie
write()avec un descripteur qu’il a ouvert avecO_RDONLY. Que doit vérifier le noyau et le processus doit-il se terminer ?---reveal---
Il vérifie l’accès accordé au descripteur et refuse l’écriture avec
EBADFsous Linux. C’est un résultat d’erreur que le programme peut traiter. L’appel est correctement entré dans le noyau, mais le descripteur ne contient pas le droit demandé. - 7Point cléGarde un chemin vérifié lié à son objet
Un programme auxiliaire vérifie une permission sur un chemin, puis l’ouvre avec des privilèges plus élevés. Entre les deux opérations, un autre processus peut remplacer l’entrée de répertoire. Copier la chaîne du chemin n’empêche pas ce remplacement.
C’est une condition de concurrence TOCTTOU. Ouvre avec les identifiants prévus et utilise une stratégie d’acquisition d’objet qui vérifie ce qui est réellement ouvert ; utilise
O_NOFOLLOWlorsque les liens symboliques ne sont pas souhaités. - 8ExplicationLaisse les projections régir les accès ultérieurs
Une fois une projection accordée, les lectures et écritures utilisent la MMU sans appel système pour chaque octet. La MMU vérifie les permissions d’écriture, d’accès utilisateur ou superviseur et d’exécution de la table des pages active.
Une page utilisateur en lecture seule protège son contenu contre les modifications, mais permet toujours au processus de le lire. Pour garder les données secrètes vis-à-vis de ce processus, la projection doit aussi interdire la lecture, par exemple en étant absente ou réservée au superviseur.
- 9ExempleInterprète deux défauts d’écriture sur des pages en lecture seule
Le service écrit d’abord dans sa page de code, puis dans des données partagées après
fork(). Les deux pages sont en lecture seule : les deux écritures provoquent donc initialement un défaut.Les informations du noyau distinguent les résultats. Une écriture non autorisée dans le code conduit normalement à
SIGSEGV. Un défaut valide de copie sur écriture dans les données conduit à une copie privée et à la reprise de l’instruction. Le matériel signale la violation ; les informations du noyau déterminent si elle peut être corrigée. - 10DéfiUn périphérique franchit la frontière mémoire
Le service est limité par les tables des pages du processeur, mais un périphérique défectueux écrit directement dans une zone de mémoire vive sans rapport avec lui. Pourquoi ces projections du processeur ne l’ont-elles pas arrêté ?
---reveal---
Le DMA ne passe pas par la MMU du processeur. Le périphérique a besoin d’une projection IOMMU qui limite ses propres adresses. Protéger les lectures et écritures du processeur constitue une frontière ; limiter les transferts provenant des périphériques exige la frontière correspondante pour ces derniers.
- 11ExplicationBloque l’exécution des octets injectés
Un débordement de tampon peut écraser une adresse de retour sauvegardée. Marquer la pile avec NX rend les instructions injectées dans la pile non exécutables : un saut vers celles-ci provoque donc un défaut.
W^X ajoute la règle selon laquelle aucune page ne peut être accessible en écriture et exécutable à la fois. Un compilateur à la volée doit écrire le code généré, puis changer les permissions avant de l’exécuter. Ces vérifications limitent l’exploitation tout en laissant à corriger l’écriture initiale hors limites.
- 12LienRends le code existant difficile à localiser
Un attaquant peut réutiliser les instructions déjà présentes dans des bibliothèques exécutables au lieu d’injecter de nouvelles instructions. ROP relie ces courts gadgets pour effectuer un nouveau calcul.
L’ASLR rend leurs adresses plus difficiles à prévoir. La divulgation d’une adresse de bibliothèque connue révèle la base et les déplacements connus de cette bibliothèque, mais pas une pile randomisée indépendamment. La randomisation fonctionne mieux lorsque des bogues ne peuvent pas divulguer les adresses choisies.
- 13DéfiContiens un processus de rendu compromis
Un processus de rendu a été compromis. Sa pile est protégée par NX et les adresses de ses bibliothèques sont désormais connues de l’attaquant. Une politique seccomp bloque toujours les appels de lancement de programmes. La réutilisation de code peut-elle simplement supprimer cette restriction ?
---reveal---
Non. Réutiliser des instructions exécutables ne supprime pas un filtre seccomp installé. Le processus reste limité aux appels autorisés : lancer un autre programme exige donc un autre moyen de contourner le filtre ou une autre défaillance de frontière.
- 14ExplicationDistingue les vérifications du démarrage des enregistrements d’événements
Le démarrage sécurisé vérifie les signatures avant de transmettre le contrôle au composant de démarrage de confiance suivant. Le démarrage mesuré enregistre les empreintes des composants, souvent à l’aide d’un TPM, afin qu’un vérificateur externe puisse évaluer ce qui a été chargé.
La journalisation d’audit sert un objectif ultérieur : elle enregistre des événements tels que les échecs de connexion et les commandes exécutées avec des privilèges élevés. Protéger des copies à l’extérieur de l’hôte aide à conserver ces preuves si un intrus obtient le pouvoir d’effacer les journaux locaux.
- 15DéfiChoisis la couche de protection manquante
Un service root projette des données sensibles en lecture seule dans l’espace d’un processus travailleur non fiable et restreint ses appels système. Le processus travailleur lit ensuite les données. Quelle décision les a exposées ?
---reveal---
La projection lisible en mode utilisateur a exposé le contenu. La lecture seule protège contre les modifications, et un filtre d’appels système ne bloque pas les lectures ordinaires d’une page autorisée. Le noyau doit refuser cette projection au processus travailleur ou lui retirer la permission de lecture pour préserver la confidentialité.
- 16RécapitulatifRepère la vérification qui régit l’action
Face à un échec que tu ne connais pas, suis l’opération : instruction du processeur, demande au noyau, accès à une mémoire projetée ou DMA d’un périphérique. Chacune atteint un point de contrôle différent.
Demande-toi ensuite ce que l’attaquant contrôle déjà. Une identité root, des gadgets exécutables et un descripteur valide confèrent des pouvoirs différents. Un diagnostic utile nomme la vérification précise qui manque au lieu de supposer qu’une défense efficace protège toutes les voies.
2Suis la connexion jusqu’aux identifiants du processus
14 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionTransforme une connexion en identité pour l’exécution
- 2ExplicationDéfinis les groupes avant d’abandonner les privilèges root
- 3ExempleSuis un programme auxiliaire setuid de gestion des mots de passe
- 4DéfiMets à jour un compte pendant une session
- 5ExplicationRecalcule une donnée de vérification sans récupérer le mot de passe
- 6ExempleMesure le travail d’essai pour un compte
- 7ExempleRépète le travail pour des sels différents
- 8DéfiUn verrouillage n’atteint pas le fichier volé
- 9ExplicationDistingue un code d’une signature liée à un site
- 10ExempleChoisis le dénominateur avant de calculer
- 11DéfiDeux secrets restent un seul type de facteur
- 12LienLaisse le noyau identifier un processus local
- 13DéfiRepère où la robustesse de la connexion cesse d’intervenir
- 14RécapitulatifDistingue la preuve des droits qui en résultent
3Analyse une décision d’accès
15 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionNomme l’opération et son objet
- 2ExplicationOrganise les droits par objet ou par sujet
- 3ExempleTransmets un accès limité à un processus travailleur
- 4DéfiModifie les permissions après avoir accordé une référence
- 5ExplicationSélectionne une classe avant d’additionner ses bits
- 6ExempleCrée un fichier avec un masque
- 7ExempleTeste l’accès avec le mode obtenu
- 8DéfiSupprime un nom sans lire ses données
- 9ConseilLis la limite de l’ACL ainsi que l’entrée
- 10ExplicationAjoute une politique que le propriétaire ne peut pas écarter
- 11ExempleSuis les informations confidentielles entre niveaux
- 12DéfiExplique le refus de lecture d’un service root
- 13LienChange de poste grâce aux rôles
- 14DéfiSuis un accès accordé à travers plusieurs contrôles
- 15RécapitulatifSuis la décision dans un ordre utile
4Exécute un invité sans céder l’hôte
17 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDonne à un noyau l’apparence de disposer de son propre ordinateur
- 2ExplicationOrdonnance un processeur virtuel
- 3DéfiÉvalue une affirmation sur la consolidation
- 4ExplicationÉmule uniquement l’état de contrôle de l’invité
- 5ExempleCorrige le problème d’une instruction qui ne provoque pas de déroutement
- 6DéfiGarde le contrôle de l’anneau 0 de l’invité
- 7ExplicationDistingue les trois types d’adresses
- 8ExempleApplique d’abord la correspondance de l’invité
- 9ExempleApplique ensuite la correspondance de l’hyperviseur
- 10DéfiTraduis un autre octet de la page
- 11LienChoisis où maintenir la correspondance combinée
- 12Point cléRécupère de la mémoire avec l’aide de l’invité
- 13ExplicationÉchange de la compatibilité des périphériques contre moins de transitions
- 14DéfiRéduis les sorties fréquentes liées aux périphériques
- 15ExplicationProtège une frontière qui dépasse les projections de pages
- 16DéfiPrépare une machine en cours d’exécution pour un autre hôte
- 17RécapitulatifGarde le contrôle à chaque interface virtuelle
5Construis et évalue une frontière de conteneur
16 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDistingue trois fonctions dans un conteneur
- 2ExplicationDonne aux processus des vues privées des ressources
- 3ExempleDémarre le premier processus fils dans un espace de noms PID
- 4ExempleAssocie une identité interne à l’hôte
- 5DéfiChoisis la vue qui résout un conflit
- 6ExplicationLis une limite stricte de temps processeur
- 7ExempleRépartis le quota d’un groupe père entre ses fils
- 8DéfiLaisse un groupe concurrent devenir inactif
- 9ExplicationContiens la croissance de la mémoire et des tâches
- 10DéfiLis la limite à la couche qui l’applique
- 11ExplicationRéduis ce que le processus peut demander
- 12DéfiUn UID associé à l’hôte atteint toujours un service privilégié
- 13LienChoisis où placer un noyau distinct
- 14ExplicationReconnais les couches de bac à sable ajoutées
- 15DéfiPlace des tâches non fiables avec des limites de ressources
- 16RécapitulatifAssocie chaque besoin à son mécanisme
Protection, isolation et machines virtuelles : QCM
Série 1 : Suis les frontières du matériel et du noyau10 Questions Pratiques
Question 1 sur 10
Afficher la réponseMasquer la réponse
Question 2 sur 10
LIDT sur x86. Qu’est-ce qui l’empêche de prendre le contrôle du traitement des interruptions ?Afficher la réponseMasquer la réponse
Question 3 sur 10
Afficher la réponseMasquer la réponse
Question 4 sur 10
write() avec ce descripteur. Quelle erreur Linux correspond à l’accès manquant sur le descripteur ?Afficher la réponseMasquer la réponse
write() refuse donc son utilisation avec EBADF. EACCES décrit couramment un refus de contrôle d’accès lors de l’acquisition d’un accès, mais cet échec concerne le mode d’un descripteur déjà ouvert. EFAULT indiquerait plutôt une adresse de mémoire utilisateur invalide.Question 5 sur 10
Afficher la réponseMasquer la réponse
Question 6 sur 10
Afficher la réponseMasquer la réponse
Question 7 sur 10
fork(). Les informations du noyau la marquent en copie sur écriture. Quelle réponse préserve le comportement normal du programme ?Afficher la réponseMasquer la réponse
Question 8 sur 10
fork() et marquée en copie sur écriture. Les écritures dans les deux pages provoquent un défaut. Un pilote a aussi besoin d’un DMA vers un tampon distinct. Quelle réponse préserve les frontières prévues ?Afficher la réponseMasquer la réponse
Question 9 sur 10
Afficher la réponseMasquer la réponse
Question 10 sur 10
Afficher la réponseMasquer la réponse
Série 2 : Suis les identités et l’authentification10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Détermine qui peut utiliser une ressource10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
metrics.bin autorisé en écriture. Le propriétaire retire ensuite la permission d’écriture du mode du fichier. Qu’advient-il des écritures ordinaires par ce descripteur ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Suis un invité à travers le matériel virtuel10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
0x53D0 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 5 : Interprète les vues et les limites des conteneurs10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
0 220000 8000. Quel UID sur l’hôte correspond à l’UID interne 1750 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
unshare(CLONE_NEWPID), crée son premier processus fils dans le nouvel espace de noms et reste actif à l’extérieur. Ce processus fils crée un processus de journalisation, puis se termine. Qu’arrive-t-il au processus de journalisation et au superviseur ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
cpu.max : 120000 100000. Quelle allocation de temps processeur cela représente-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
pids.max de 30. Le groupe fils A contient quatre processus ayant chacun sept fils d’exécution au total et possède une limite locale de 40 ; le groupe B, de même niveau, contient deux processus à un seul fil d’exécution. A peut-il créer un autre fil d’exécution alors que toutes les tâches existantes restent actives ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 6 : Diagnostique les défaillances à travers les couches d’isolation10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
access(), puis l’ouvre avec tous ses privilèges. Un attaquant peut remplacer l’entrée désignée. Quelle faille subsiste ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
0x9B20, et le cadre obtenu est-il dans la projection du périphérique ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
accès direct à la mémoire
adresse physique de l’invité
affectation directe de périphérique
anneau de protection
appel système
open() effectue un appel système afin que le noyau puisse vérifier l’accès avant de renvoyer un descripteur de fichier.attaque hors ligne
attaque par dictionnaire
attaque par force brute
authentificateur à clé publique
authentification
authentification multifacteur
autorisation
B
ballonnement mémoire
base informatique de confiance
bit de non-exécution
bit de restriction de suppression
C
capacité d’objet
capacité Linux
CAP_NET_BIND_SERVICE permet de se lier aux ports de numéro inférieur sans accorder tous les pouvoirs de root.clé d’accès
condition de concurrence entre vérification et utilisation
conteneur
conteneur sans privilèges
contrôle d’accès discrétionnaire
contrôle d’accès fondé sur les rôles
contrôle d’accès obligatoire
contrôleur de groupe de contrôle
correspondance des UID
coût du hachage des mots de passe
cpu.max
cpu.max de 75000 100000 autorise au plus les trois quarts du temps d’un processeur par période.cpu.weight
cpu.weight plus élevée favorise un groupe occupé face aux groupes concurrents de même niveau, mais ne peut pas annuler son quota distinct.D
débordement de tampon
défaut de page
démarrage mesuré
démarrage sécurisé
descripteur de fichier
domaine SELinux
E
EFAULT
read() dont la destination se trouve en mémoire noyau peut renvoyer EFAULT au lieu d’écraser le noyau.empreinte de mot de passe
entrée de contrôle d’accès
entrée en machine virtuelle
espace de noms
espace de noms de montage
espace de noms PID
espace de noms réseau
espace de noms utilisateur
exécution directe limitée
É
émulation de périphérique
évasion de machine virtuelle
G
gabarit biométrique
groupe de contrôle
gVisor
H
hyperappel
hyperviseur
I
informatique confidentielle
instantané
instruction privilégiée
HLT sur x86 déclenche une exception de protection.instruction sensible
interception et émulation
interruption d’horloge
IOMMU
isolation des tables des pages du noyau
J
jeton d’accès
journal d’audit
K
Kata Containers
L
liste de contrôle d’accès
liste de contrôle d’accès discrétionnaire
M
machine virtuelle
masque d’ACL POSIX
matrice d’accès
memory.high
memory.high tandis que la pression de récupération augmente, contrairement à une simple limite d’allocation fixe.memory.max
memory.max peut imposer la suppression d’une tâche admissible du groupe.micromachine virtuelle
migration à chaud
mode noyau
mode octal
mode utilisateur
modèle de Bell–LaPadula
moniteur de référence
mot de passe à usage unique fondé sur le temps
N
niveau d’exception
no_new_privs
no_new_privs est défini, un processus de conteneur ne peut pas gagner de pouvoirs simplement en lançant un exécutable setuid.P
pagination imbriquée
paire d’interfaces veth
PAM
paravirtualisation
partage de pages
pids.max
pids.max même si son nombre de processus distincts semble faible.principal
processeur virtuel
profil AppArmor
programmation orientée retour
R
randomisation de l’espace d’adressage
répertoire setgid
révocation de capacité
S
seccomp
sel
setuid
SMAP
SMEP
socket du moteur d’exécution de conteneurs
sortie de machine virtuelle
HLT exécuté par l’invité permet à l’hyperviseur de cesser d’ordonnancer le vCPU inactif et d’exécuter une autre charge de travail.surallocation mémoire
système invité
T
table des pages fantôme
taux de fausse acceptation
taux de faux rejet
traduction binaire
traversée de répertoire
U
UID effectif
umask
unité de gestion mémoire
V
Virtio
W
W^X
- 1Processus et appels système
- 2Ordonnancement du processeur
- 3Traduction des adresses
- 4Pagination et mémoire virtuelle
- 5Fils d’exécution
- 6Sémaphores et interblocage
- 7Entrée-sortie, disques et RAID
- 8Systèmes de fichiers
- 9Protection, isolation et machines virtuelles
À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.