La théorie de Popek et Goldberg : les pré-requis de la virtualisation (suite)

img-ressources-processeur-psd-aqua16-1365.jpgCe billet fait suite au billet précédent sur la théorie de Popek et Goldberg ainsi que la mise dans le contexte historique de cette théorie.

Nous avons vu précédemment les trois contraintes imposés au VMM par leur théorie. Pour rappel, le VMM (Virtual Machine Monitor) est la couche applicative de virtualisation.  L’objectif de leur théorie est d’établir les pré-requis nécessaires à la virtualisation. Les trois contraintes servent de base à ces pré-requis et sont en quelque sorte les pré-requis élémentaires. La suite de leur papier s’attache à énoncer des règles plus spécifiques quand à ces pré-requis.

Trois groupes d’instructions processeur

Ils ont tout d’abord distingué trois groupes d’instructions processeur. Leur théorie étant plutôt générique, ces instructions ne sont pas mentionnées nominativement. Elles sont évoqués par leur comportement. Le processeur dispose de deux modes d’exécution : le mode utilisateur et le mode privilégié. Les instructions « utilisateur » sont les instructions classiques de calcul alors que les instructions « privilégiées » sont les instructions de manipulation de données.

Le premier groupe d’instructions processeur est le groupe des instructions privilégiées. Ces instructions nécessitent donc que le processeur soit en mode privilégié pour être exécuté. Si ce n’est pas le cas, elles sont « piégées » (de l’anglais trap) par le système afin d’être traités par le VMM. Le « piège » consiste en un changement de contexte et un traitement de l’instruction par le VMM qui décidera de la suite à donner à cette instruction. Il peut soit l’ignorer soit émuler son fonctionnement.

Le second groupe d’instructions processeur est le groupe des instructions sensibles à la configuration. Ces instructions qui va modifier la configuration du système physique. Ce groupe inclut les instructions visant à à modifier la quantité de mémoire disponible à un processus ou celles visant à changer le mode du processeur sans être « piégées ».

Le troisième groupe d’instructions processeur est le groupe des instructions sensible au comportement. Il s’agit des instructions dont le comportement est impacté par la localisation son exécution. Ce groupe inclut les instructions visant à lire une zone de mémoire vive spécifique ou à se déplacer dans la mémoire vive.

Les trois théorèmes

Après avoir posé tout ces pré-requis, ils énoncent ensuite le coeur de leur théorie, à savoir les théorèmes. Le premier théorème porte sur la possibilité de virtualisation une architecture processeur. Le second théorème porte sur la possibilité de faire de virtualisation récursive, à savoir faire fonctionner plusieurs machines virtuelles dans une machine virtuelle. Le troisième porte sur la possibilité d’exécuter des HVM (Hybrid Virtual Machine) sur une architecture processeur. Un HVM au sens de Popek & Goldberg est une VM pour laquelle une majorité d’instructions sont interprétées par le VMM.

Le premier théorème énonce que pour qu’une architecture processeur soit virtualisable il faut que les instructions sensibles fassent parti des instructions privilégiés.

For any conventional third generation computer, a virtual machine monitor may be constructed if the set of sensitive instructions for that computer is a subset of the set of privileged instructions.

L’architecture la plus répandue actuellement ne répond pas à ce théorème, il y a quelques instructions qui posent problème d’où la nécessité d’utiliser les techniques de virtualisation que nous connaissons aujourd’hui.

Le second théorème énonce qu’il est possible de faire de la virtualisation récursive sur une architecture processeur si elle répond au premier théorème et qu’un VMM sans dépendance de temps peut être élaboré.

A conventional third generation computer is recursively virtualizable if it is : virtualizable and a VMM without any timing dependencies can be constructed for it.

Le troisième théorème énonce  qu’un HVM est réalisable si les instructions sensibles exécutables en mode utilisateur font partie des instructions privilégiées.

A hybrid virtual machine monitor may be constructed for any conventional third generation machine in which the set of user sensitive instructions are a subset of the set of privileged instructions.

Au final, je pense avoir fait le tour de la théorie de Popek et Goldberg. Je suis conscient que ce sujet est assez compliqué à appréhender. Je ne pense pas avoir été d’une clarté légendaire mais j’espère avoir clarifié quelque peu cette théorie. Si vous souhaitez en savoir plus sur cette théorie, je vous invite à lire le document initial (maitrise de l’anglais requise).

La théorie de Popek et Goldberg : les pré-requis de la virtualisation

Après avoir parlé en long et en large des anneaux de protection système, je souhaite parler un peu de la théorie de la virtualisation. Je suis conscient que vous êtes surement plus habitués à voir des billets plus concrets sur les blogs à travers le net. Cependant, ce sujet m’intéresse beaucoup et je pense qu’il pourrait intéresser certains d’entre vous. Il est vrai que l’utilité de ce type de billet n’est pas tout à fait immédiate. Je reviendrais sur des billets plus concrets par la suite.

La naissance de la virtualisation

Tout d’abord, la virtualisation est un concept ancien à l’échelle de l’informatique. Ce n’est pas VMWare qui a inventé la virtualisation en 1999 avec leurs applications. La virtualisation totale n’est pas non plus le premier type de virtualisation. La virtualisation est un concept qui date d’au moins 1970, année à laquelle vous n’étiez (probablement) pas né.  A cette époque est arrivé la révolution des ordinateurs IBM System/360 qui étaient exceptionnels par le fait qu’ils étaient compatibles à l’intérieur d’un même gamme. Un System/360 ressemble à la photo suivante :

2423PH2065C

A cette époque, la virtualisation se faisait de manière matérielle avec un cloisonnement électronique des divers composants applicatifs. Ce type de virtualisation semble toujours exister aujourd’hui dans certains mainframes.

Popek et Goldberg

Popek et Goldberg sont deux chercheurs en informatique de cette époque. Ils ont souhaité formuler les pré-requis nécessaires à la virtualisation de manière formelle. Ils définissent plusieurs termes que l’ont connait toujours aujourd’hui. Une « VM » est une « Virtual Machine » ou machine virtuelle. Un VMM est un « Virtual Machine Monitor » ou moniteur de machine virtuel. Ce dernier correspond à la couche de virtualisation. Ce terme est peu utilisé mais il est possible de le retrouver occasionnellement.

Trois contraintes imposées au VMM

Ils ont tout d’abord défini trois critères que doivent remplir les systèmes de virtualisation afin de pouvoir être considéré en tant que tel. Ces critères serviront par la suite à définir les théorèmes de leur théorie.

Le premier critère est le critère « équivalence». Ce critère implique qu’une application quelconque doit s’exécuter de la même manière qu’elle soit exécuté au dessus d’un VMM ou d’une machine physique. Ceci est nuancé par la disponibilité des ressources physiques qui peuvent modifier la temporalité de l’exécution d’un programme.

Any program run under the VMM should exhibit an effect identical with that demonstrated if the program had been run on the original machine directly, with the possible exception of differences caused by the availibility of system resources and differences caused by timing dependencies.

Le second critère est le critère « efficacité». Ce critère indique qu’une part majoritaire d’instructions soit exécutée par le processeur directement sans intervention du VMM. Ce critère exclut donc les émulateurs et les techniques de virtualisation totale. La virtualisation matérielle assistée permet de répondre plus correctement à ce critère.

The second characteristic of a virtual machine monitor is efficiency. It demands that a statiscally dominant subset of the virtual processor’s instructions be executed directly by the real processor, with no software intervention by the VMM.

Le troisième critère est le critère  « contrôle de ressources». Ce critère indique que le VMM doit avoir le contrôle exclusif des ressources à partager. N’importe quelle application doit donc passer par la VMM pour pouvoir accès à une ressource partagée.

The VMM is said to have complete control of these resources if it is not possible for a program running under it in the created environment to access any resource not explicitly allocated and it is possible under certain circumstances for the VMM to regain control of resources already allocated.

Ces trois critères servent de base à la suite de leur papiers énonçant leurs théories. Nous verrons dans un prochain billet la suite des théorèmes.

Les anneaux de protection système dans le cas du 64-bit

800px-Olympic_Rings.svgDans le billet précédent, j’ai eu l’occasion de vous présenter les anneaux de protections système et leur utilité dans le cas de la virtualisation. Je vais continuer avec ce billet évoquant les spécificités du 64-bit.

Si vous avez lu mon précédent billet sur la virtualisation matérielle assistée, vous avez dû remarquer que je parlais de l’ajout de l’anneau « -1 ». Sauf qu’un précédent billet sur les anneaux de protection système n’évoquait que les anneaux de 0 à 3.

L’architecture historique, à savoir, l’architecture x86-32 dispose effectivement de 4 anneaux numérotés de 0 à 3. Cependant seuls deux anneaux étaient utilisés : un pour le système d’exploitation et un pour les applications. Lorsqu’AMD et Intel ont refondu l’architecture x86 pour passer au 64-bit, ils ont décidé de supprimer les anneaux 1 et 2. Il ne resta donc plus que les anneaux 0 et 3.

Ceci n’a pas créé de problème particulier car ces anneaux n’étaient pas utilisés dans les systèmes d’exploitation. La virtualisation est arrivée relativement peu de temps après et avait pour habitude d’utiliser un anneau supplémentaire afin de cloisonner l’hyperviseur, le système d’exploitation et les applications. Les solutions de virtualisation se sont donc retrouvées avec deux anneaux alors qu’il était plus simple et plus sécurisé d’en utiliser trois. Afin de résoudre cette problématique, dans le cas du projet Xen, l’anneau 3 a été mutualisé pour les applications et les systèmes d’exploitation. Il a été préféré de cloisonner seul l’hyperviseur. Cette disposition donne le schéma suivant :

Rings64bit

Par la suite, AMD et Intel se sont rapidement rendus compte de l’importance que commençait à prendre la virtualisation. Ils ont donc décidé d’inclure dans leurs processeurs des instructions de virtualisation facilitant les opérations liées à cette technique. Ces extensions ont rendu possible la virtualisation matérielle assistée comme je l’ai évoqué précédemment. En même temps, il a été ajouté un anneau « -1 » qui permet à la paravirtualisation d’éviter la mutualisation de l’anneau 3. Ceci a permis de revenir à une disposition plus propre des composants applicatifs parmi les anneaux de protection système. Le schéma ci-dessous illustre la nouvelle disposition.

Rings64bitImproved

Fibre optique Numéricable : installation et mise en service

Fibre OptiqueJ’ai déjà parlé de la vraie fausse offre fibre optique Numéricable dans un billet précédent ainsi que de mon dilemne entre Numéricable et l’offre THD de Dartybox.

Une fois la commande effectuée, j’avais choisi un jour et un créneau horaire pour la venue du technicien. La veille de la venue du technicien, j’ai reçu un appel me demandant d’avancer le rendez-vous à 14h alors que le rendez-vous était prévu à 16h. Je refuse car je travaille la journée et que partir aussi tôt du travail n’est pas raisonnable. La personne semble insistante mais je refuse sa proposition. Le jour-même de l’installation, je reçois un autre appel mais cette fois-ci du technicien pour avancer le rendez-vous. J’ai donc du, une fois de plus, décliner la proposition alors que le technicien semblait plutôt agacé. Ce fut donc un premier contact avec Numéricable assez désagréable, vous l’aurez bien compris.

Je m’arrange pour arriver à 16h dans mon nouvel appartement pour pouvoir recevoir le technicien qui ne semble pas être présent. C’est donc au bout d’une demi heure qu’il me rappelle alors qu’il était en bas depuis 1h30. Après lui avoir dit bonjour, je me reprends une remarque comme quoi il n’avait personne entre 14h et 16h et que ca fait donc pas mal de temps qu’il attend. Deuxième contact désagréable.

La personne fait donc le tour de l’appartement pour voir comment il va pouvoir installer le cable coaxial permettant de me raccorder à l’internet. Résultat de son analyse, il faut percer trois trous à travers trois murs différents pour pouvoir me raccorder. En sachant que je suis locataire, il n’est pas souhaitable de faire des trous partout même si ce raccordement a pour objectif de rester. Après avoir refait l’analyse avec lui, nous arrivons à nous mettre d’accord sur le fait qu’il suffit d’un seul trou même si l’idée ne lui plaisait pas particulièrement.

Cette personne n’était pas équipée d’une échelle ou même d’un petit tabouret pour pouvoir percer un trou au dessus de la porte. Il a donc du monter par dessus son fourreau de cable. Le reste de l’installation s’est passé sans soucis et s’est faite proprement. Afin de vérifier que tout fonctionne correctement, le technicien m’a branché le routeur Netgear et nous avons testé la connexion au wifi.

Tout a donc fonctionné assez rapidement assez vite. Les débits sont au rendez-vous avec un débit descendant de 70 Mbit/s et un débit montant de 3 Mbit/s. C’est donc plus qu’honnête !

L’installation s’est bien passé mais c’est à ma grande surprise que Numéricable avait décidé de me facturer 50€ en plus des 40€ d’installation au titre de la mise en place du service.  Après acharnement face à la hotlineuse dont le niveau en Français laissait à désirer, j’ai réussi à me les faire enlever.

La morale de l’histoire est qu’il ne faut pas hésiter à vérifier ce que fait Numéricable sous peine d’avoir quelques petites surprises assez désagréables. L’installation est faite depuis 3 semaines et tout fonctionne à merveille. Je suis donc un abonné à la vraie fausse offre fibre optique de Numéricable plutôt content !

Les anneaux de protection système

800px-Olympic_Rings.svgLa série d’articles sur la détection d’intrusion m’aura permis de faire une petite coupure dans la série d’articles sur la virtualisation. Je vais donc reprendre les articles sur la virtualisation. Pour rappel, la plupart des ces articles sur la virtualisation reprennent le contenu de l’AC que j’ai effectué avec Romain Hinfray. Ces articles me permettent de prendre un peu de recul par rapport à cette AC et de compléter avec de nouvelles connaissances.

Avant de pouvoir continuer sur la virtualisation, je souhaite faire un article qui servira de pré-requis à la suite. Je vais parler des anneaux de protection (ou rings pour les anglophones). Cette notion n’est pas seulement utile en virtualisation mais plus largement en systèmes d’exploitation.

Principe des anneaux de protection

Vous avez surement entendu parlé de « Rings » ou d’anneaux si vous avez déjà fait un peu de sécurité des systèmes d’exploitation, de la virtualisation ou de l’électronique informatique. On parlera ici d’anneau de protection afin d’éviter les termes anglophones, nous parlons en Français tout de même. Comme vous commencez sans doute à vous en douter, nous serons ici sur du « bas niveau » au niveau des systèmes d’exploitation.

Nous étudierons tout d’abord l’utilité des anneaux de protection. Comme leur nom l’indique, ils ont pour objectif de fournir une fonction de protection. Cette protection s’applique sur les divers composants applicatifs du système d’exploitation. L’objectif va être d’empêcher divers composants applicatifs d’un système d’exploitation de se modifier entre eux. Vous comprendrez donc qu’une modification d’un composant applicatif par un autre est synonyme de faille de sécurité.

Les composants qui vont nous intéresser plus particulièrement dans le cadre d’un système d’exploitation sont le noyau et les applications. Autant il est tout à fait envisageable que le noyau puisse apporter des modifications aux données dynamiques d’une application, l’inverse l’est beaucoup moins. Ces données dynamiques sont les données stockées en mémoire vive. La mémoire vive est systématiquement amenée à contenir le programme lui-même ainsi que les données qu’il traite. Vous comprenez donc bien l’intérêt d’une protection ou plutôt d’un cloisonnement.

Application aux systèmes x86-32

Dans les systèmes x86-32, il existe 4 anneaux de protection numérotés de 0 à 3. Dans la quasi-totalité des systèmes d’exploitation sans virtualisation, seuls les anneaux 0 et 3 sont utilisés. L’anneau le plus privilégié est l’anneau 0 qui contient le noyau du système d’exploitation. L’anneau le moins privilégié est l’anneau 3 qui contient les applications et leurs données dynamiques. Les deux autres anneaux ne sont pas utilisés. Ils l’ont été dans OS/2 ou bien Netware pour y placer différents pilotes. Le schéma ci-dessous reprend la répartition des composants applicatifs dans un système d’exploitation moderne.

rings

Application à la paravirtualisation

Dans le cadre de la paravirtualisation, le système d’exploitation ne sera pas le premier intermédiaire du matériel mais ce sera l’hyperviseur. Pour des raisons de sécurité, il sera nécessaire de cloisonner le système d’exploitation et l’hyperviseur. Dans ce cas-là, il sera fait usage de l’anneau 1. Nous placerons donc l’hyperviseur dans l’anneau 0 et le système d’exploitation dans l’anneau 1. Les applications restent bien au chaud dans l’anneau 3.

Implémentation des anneaux de protection

Maintenant que je vous ai expliqué tout ceci, l’utilité et l’application des anneaux de protection semble clair. Il manque cependant un élément clé de la compréhension de ce concept : l’implémentation des anneaux de protection. Comment se concrétisent les anneaux de protection ? Où se trouvent-ils dans la nature ?

Les anneaux de protection sont implémentés au niveau de la mémoire vive. Une zone de mémoire vive se voit attribuer une localisation dans un anneau par le système d’exploitation. Un programme contenu dans une zone mémoire attribuée à l’anneau 3 ne pourra pas aller modifier une zone mémoire attribuée à l’anneau 0.

Détection d’intrusion machine avec OSSEC

Ça fait un petit bout de temps que je n’ai pas posté sur mon petit blog car j’ai été très occupé avec mon déménagement. Ça commence désormais à se calmer. Cet article fait suite aux deux précédents articles : la présentation globale de la détection d’intrusion et la présentation illustrée de la détection d’intrusion.

Tout d’abord, je vais replacer la détection d’intrusion machine dans son contexte. Nous avons vu dans le billet précédent qu’il existait différents types de sondes de détection d’intrusion. Un de ces types de sonde de détection d’intrusion sont les HIDS pour Host Intrusion Detection System. L’objectif va donc être de faire des remontées d’information et de l’analyse primaire des ces remontées d’information. La spécificité d’une sonde HIDS est le lieu de son application, à savoir, les systèmes.

Un système peut être un système d’exploitation « classique » tel que Linux, Windows, Solaris, … mais aussi un système d’exploitation de routeur, firewall ou autre équipement réseau. Nous allons donc essayer de mettre en place une sonde HIDS.

ossec_logo

J’ai choisi de vous présenter la sonde HIDS OSSEC. J’ai choisi cette sonde parcqu’elle est particulièrement simple à utiliser et qu’il s’agit d’un logiciel libre. Elle est disponible pour Linux/Unix mais aussi Windows ce qui en fait une solution compatible sur une grande majorité de systèmes. Elle est capable de faire de la remontée d’information et de l’analyse sur des fichiers de logs standard mais aussi de détecter des intrusions type rootkit. Dans l’idéal, il est nécessaire d’installer un agent sur chaque machine que l’on souhaite monitorer mais il est également possible de faire sans agent (via SSH).

Installation

L’installation se fait très simplement en téléchargeant les binaires présents sur le site d’OSSEC. On exécute ensuite le binaire d’installation et on se laisse guider par les étapes.

# wget http://www.ossec.net/files/ossec-hids-2.1.1.tar.gz

# tar zxvf ossec-hids-2.1.1.tar.gz

# cd ossec-hids-2.1.1/

# ./install.sh
** For installation in English, choose [en].
** Para instalar en Español , eliga [es].
** Pour une installation en français, choisissez [fr]
(en/br/cn/de/el/es/fr/it/jp/nl/pl/ru/sr/tr) [en]: en

Désolé pour les erreurs d’accents…  On arrive ensuite sur l’invite de paramétrage de l’installation.

OSSEC HIDS v2.1 Installation Script – http://www.ossec.net

You are about to start the installation process of the OSSEC HIDS.
You must have a C compiler pre-installed in your system.
If you have any questions or comments, please send an e-mail
to dcid@ossec.net (or daniel.cid@gmail.com).

– System: Linux courbevoie.benkemoun.com 2.6.27.10-grsec-xxxx-grs-ipv4-32
– User: root
– Host: courbevoie.benkemoun.com

— Press ENTER to continue or Ctrl-C to abort. —

1- What kind of installation do you want (server, agent, local or help)?

Comme vous le voyez, OSSEC vous donne la possibilité de le paramétrer en tant qu’agent ou serveur. En effet, OSSEC peut également jouer le rôle de SIM ou plutôt d’agrégateur d’information. Dans ce cas, une machine servira d’agrégateur de logs OSSEC. Vu qu’on installe OSSEC pour une seule machine, on la mettra en serveur.

Il défile ensuite un certain nombre de questions qui vous permettront de configurer OSSEC comme vous le souhaitez. Vous avez donc installé OSSEC, simple non ? Vous pouvez ensuite configurer les options et les fichiers de log que vous souhaitez analyser. La documentation sur le site d’OSSEC est particulièrement claire.

Si vous souhaitez visionner les remontées d’information d’OSSEC, je vous conseille fortement l’interface web OSSEC qui est sommaire mais efficace. L’installation est très simple à effectuer. Je vous dirige vers le tutoriel sur le wiki d’OSSEC qui explique tout ce qu’il y a à expliquer.

ossewui

Au final, OSSEC est une solution très simple à mettre en place pour avoir une détection d’intrusion simple et basique.  OSSEC remplace aisément un syslog tout en rajoutant des fonctionnalités d’analyse et de classement des incidents.