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

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.

La détection d’intrusion illustrée

network-security-fingerSuite à mon précédent article sur la détection d’intrusion, je n’ai pas eu l’impression d’avoir été particulièrement clair et limpide. Je pense que le manque de clareté vient surtout du fait qu’il s’agissait d’un article plutôt théorique. Pour ce nouvel article, je vais donc essayer de me concentrer sur l’illustration pratique de la détection d’intrusion.

Fonctionnement global

Comme je l’ai expliqué précédemment, la détection d’intrusion a pour objectif de détecter les activités anormales sur les divers équipements informatiques. Elle permet donc une visibilité élargie sur les incidents de sécurité du réseau. Cette visibilité élargie provient de deux élements : la corrélation et l’analyse. La corrélation est la technique qui met en relation les remontées d’information de plusieurs équipements afin de trouver de similitudes. L’analyse est ce qui permet d’interpréter des remontées d’informations afin d’en tirer une conclusion intelligible. Ceci fera l’objet du second schéma. Ce premier schéma a pour objectif d’illustrer le fonctionnement global.

DetectionIntrusion

Sur ce schéma, on voit tout d’abord notre réseau « de base » symbolisé par la grande barre bleue. Sur ce réseau, nous avons nos serveurs / postes de travail connectés. En sortie de réseau, nous avons un firewall avec une patte vers Internet et une patte dans notre réseau. On va ensuite distinguer deux types de détection d’intrusion : la détection d’intrusion machine (HIDS pour Host Intrusion Detection System) et la détection d’intrusion réseau (NDIS pour Network Intrusion Detection System).

Afin de mettre en place la détection d’intrusion machine, il va être nécessaire d’installer une sonde sur chaque serveur ou équipement réseau que l’on souhaite inclure dans le système de détection d’intrusion. Ces sondes rempliront différentes fonctionnalités de récolte d’information et d’analyse primaire. Je ferais un article couvrant plus spécifiquement ce type de détection d’intrusion. On parlera donc de sonde HIDS. Les sondes peuvent être de différents types en fonction de ce que l’on souhaite faire et en fonction du SIM. Des exemples de sonde HIDS sont OSSEC, Samhain ou Tripwire.

Ensuite, afin de mettre en place la détection d’intrusion réseau, il va être nécessaire d’installer une sonde sur le réseau. Le raccordement de cette sonde diffère d’un système standard car par défaut elle ne recevrait que le trafic qui lui est destiné. Ainsi, elle n’aurait qu’une vue très réduite du réseau. Pour qu’une sonde NIDS soit efficace, il faut qu’elle reçoive la totalité du trafic du réseau. Cette fonctionnalité peut s’appeller « Port Mirroring » ou « Port monitoring ». La sonde effectuera une analyse primaire de tous les paquets qu’elle va recevoir. Un exemple de sonde NIDS est Snort.

Le résultat de l’analyse primaire effectuée par ces sondes sera ensuite envoyé au SIM (Security Information Management). Le SIM est l’élément qui va recevoir toutes les remontées d’informations des différentes sondes NIDS et HIDS. Il fera ensuite entrer en jeu la corrélation afin de pouvoir interpréter de manière plus globale ces informations ainsi que l’analyse de la globalité des informations. Il stockera ces informations en base de données afin de pouvoir créer un historique des événements réseau et de pouvoir retracer des incidents.

Analyse des remontées d’information

Je pense que le schéma de fonctionnement global a du clarifier le fonctionnement d’un système de détection d’intrusion d’un point de vue architectural. Je vais ensuite détailler le cheminement de l’analyse d’un événement de sécurité. Le schéma suivant prend pour exemple une tentative (certes légère) de bruteforce d’un serveur SSH.

DetectionIntrusionAnalyse

Les cylindres du bas représentent les différents fichiers de log qui peuvent se trouver sur une machine physique ou bien sur un équipement réseau.

On voit sur ce schéma que les fichiers de logs vont remonter des informations brutes qui correspondent à l’utilité qui est faite de l’application. Iptables va remonter un nombre de sessions TCP, auth va remonter une erreur dans un mot de passse et SSHD va remonter une erreur d’authentification. Le HIDS va récolter ces informations à travers la lecture continue des ces fichiers de logs et envoyer les informations au SIM. Le SIM va ensuite interpréter ces informations et en tirer une conclusion bien plus concrète que les messages de logs précédents.

En pratique, des remontées d’information aussi basiques seront interprétés directement par l’HIDS qui transmettra son interprétation au SIM. Le SIM a plus un rôle de corrélation de différentes sources et d’analyse d’événements conjoints qui mis bout à bout peuvent avoir une signification plus intéressante.

Au final, j’espère que cet article permettra de clarifier un peu plus les choses.

La paravirtualisation

tech-presentation-2Je vais continuer et finir la série d’articles présentant les différents types de virtualisation. J’ai déjà eu l’occasion de proposer une classification des différents types de virtualisation et de parler de la virtualisation totale ainsi que de la virtualisation matérielle assistée. Je vais continuer en vous parlant de paravirtualisation. J’ai déjà eu l’occasion d’évoquer la notion de paravirtualisation dans la présentation de Xen que j’avais faite il y a quelques temps.

L’idée de base des précédents types de virtualisation était de faire croire au système d’exploitation qu’il s’exécutait sur une machine physique alors que ce n’était pas le cas. Cette technique est la technique la plus évidente lorsqu’on essaye de virtualiser des systèmes d’exploitation principalement propriétaires ce qui est le cas de VMWare par exemple. Il s’agit d’une méthode qui permet de centraliser toutes les fonctionnalités de virtualisation dans un seul endroit, à savoir la couche de virtualisation. L’inconvénient de cette méthode est que la couche de virtualisation devient rapidement très lourde avec la quantité croissante du nombre de fonctionnalités à implémenter.

La paravirtualisation adopte une vision radicalement différente. Au lieu de chercher à faire croire aux systèmes d’exploitation qu’ils s’exécutent sur une machine physique, il est possible d’adapter le système d’exploitation à la couche de virtualisation. Ceci n’aurait bien évidemment pas été possible sans la présence de logiciels libres…

virtus

La paravirtualisation vise donc à modifier les systèmes d’exploitation pour communiquer avec un hyperviseur au lieu de communiquer avec une machine physique. Sur ce blog, je parlerais d’hyperviseur au sens de Xen ou d’Hyper-V. VMWare parle d’hyperviseur à tord et à travers mais il ne s’agit pas, selon moi, d’un vrai hyperviseur. En réalité, il s’agit d’un système d’exploitation hôte déguisé.

L’hyperviseur au sens de la paravirtualisation est en contact direct avec le matériel physique. Il est l’intermédiaire exclusif entre le matériel et les systèmes d’exploitation. Lorsqu’on se trouve donc dans un système de paravirtualisation, il n’y a plus de notion de système d’exploitation invité et de système d’exploitation hôte. Tous les systèmes d’exploitation sont virtualisés dans le sens où ils disposent d’un noyau adaptés à la couche de virtualisation. Tous les systèmes d’exploitation ne seront pas égaux pour autant, il est possible de donner des accès spécifiques à différents systèmes d’exploitation.

Les systèmes d’exploitation communiquent avec l’hyperviseur via des API de communication. Ces API de communication remplacent les traditionnels appels systèmes. Chaque couche de virtualisation dispose donc de sa propre API. Pour adapter un système d’exploitation à un hyperviseur, il faut donc intégrer son API au noyau. Cela explique en partie le passage en GPL des pilotes Hyper-V de Microsoft.

Au final, la paravirtualisation est une technique particulièrement innovante qui présente une approche plus efficace de la virtualisation. Les avantages de cette technique sont une perte de performance largement réduite par rapport à une virtualisation totale. L’inconvénient majeur est qu’il est nécessaire d’adapter les systèmes d’exploitation pour chaque couche de virtualisation. Afin de résoudre ce problème, il est possible de coupler paravirtualisation et virtualisation matérielle assistée comme dans Xen.

La virtualisation matériel assistée

tech-presentation-2Je vais continuer dans la suite logique des billets précédents. Pour rappel, j’ai précédemment parlé de l’intérêt de la virtualisation, proposé une classification des différents types de virtualisation et puis expliqué plus en détail la virtualisation totale. Je vais donc continuer cette série d’article en vous parlant de virtualisation matériel assistée.

Tout d’abord, le terme de virtualisation matériel assistée semble assez explicite. On comprend bien qu’il s’agit de virtualisation qui va être assistée par une fonctionnalité spécifique du matériel. Les détails du fonctionnement de cette technologie le sont cependant bien moins. Ce terme est une traduction de l’anglais « Hardware Assisted Virtualization ». On peut aussi trouver comme autre traduction « virtualisation assistée par matériel ». Tous ces termes sont cependant équivalents. Cependant, la virtualisation partielle n’a aucun rapport.

HAV

Comme vous pouvez le voir, le schéma d’architecture ne change que très peu par rapport à la virtualisation totale. Avec la virtualisation totale, nous parlions de couche logicielle de virtualisation alors que parlerons plutôt de « Virtual Machine Monitor » ou VMM dans le cas de la virtualisation matériel assistée.

Une extension du jeu d’instructions du processeur

Ensuite, il est important de préciser que la virtualisation matériel assistée n’est pas une technique à part entière. Il s’agit en réalité d’une extension du principe de virtualisation totale. La principale modification qui est apportée est l’ajout d’extensions processeur de virtualisation. Vous en avez surement entendu parlé, je parle bien d’Intel VT et d’AMD-V. Ces instructions ont été implémentées dans les processeurs afin de pouvoir améliorer la virtualisation totale. Ces instructions sont une extension du jeu d’instructions exécutables par le processeur similairement à SSE ou MMX.

Ces instructions apportent plusieurs améliorations. Tout d’abord, elles créent un anneau -1 qui sera l’endroit privilégié de l’exécution d’un hyperviseur. Ceci permet de garder la localisation traditionnelle des anneaux avec le système d’exploitation présent dans l’anneau 0 et les applications dans l’anneau 3. Les autres ne sont jamais utilisé à l’exception de quelques rares cas. J’aurais l’occasion de revenir plus tard sur la notion d’anneau. Le placement du système d’exploitation dans son anneau traditionnel permet de simplifier l’accès à certains instructions et donc de supprimer une partie du travail de la couche de virtualisation.

De plus, elles permettent aux machines virtuelles de gérer leurs propres interruptions et donc changements de contexte. Ceci évite à la couche logicielle de virtualisation de devoir les gérer. Egalement, elles permettent au matériel de gérer directement  les zones de mémoire vive (non forcément linéaires) disponibles au machines virtuelles. Sans les extensions, il était nécessaire que la couche de virtualisation émule et gère des zones.

Si vous souhaitez plus d’informations sur ces instructions, je vous invite à consulter la documentation d’Intel disponible ici ou ici.

Au final, les extensions processeur de virtualisation permettent d’améliorer la technique de la virtualisation totale. Ceci se fait par l’ajout d’un degré d’intelligence au niveau du matériel qui sera conscient de l’utilisation d’une couche de virtualisation. La virtualisation matériel assistée est donc une évolution du principe de virtualisation totale.