<?xml version="1.0" encoding="iso-8859-1"?> <!-- The FreeBSD Documentation Project The FreeBSD French Documentation Project $FreeBSD$ Original revision: 1.9 --> <chapter id="jails"> <chapterinfo> <authorgroup> <author> <firstname>Matteo</firstname> <surname>Riondato</surname> <contrib>Contribution de </contrib> </author> </authorgroup> </chapterinfo> <title>Environnements jail</title> &trans.a.fonvieille; <indexterm><primary>jails</primary></indexterm> <sect1 id="jails-synopsis"> <title>Synopsis</title> <para>Ce chapitre expliquera ce que sont les environnements jail (prisons) et comment les utiliser. Les environnements jail, souvent présentés comme une amélioration et un remplacement des <emphasis>environnements chrootés</emphasis> sont des outils très puissants pour les administrateurs système, mais certaines de leurs fonctionnalités de base peuvent être également utiles aux utilisateurs avancés.</para> <para>Après avoir lu ce chapitre, vous connaîtrez:</para> <itemizedlist> <listitem> <para>Ce qu'est un environnement jail, et quelle utilité il peut avoir sur une installation &os;.</para> </listitem> <listitem> <para>Comment construire, démarrer et arrêter un environnement jail.</para> </listitem> <listitem> <para>Les bases de l'administration d'un environnement jail, de l'intérieur et de l'extérieur de l'environnement.</para> </listitem> </itemizedlist> <para>D'autres sources d'information utiles concernant les environnements jail sont:</para> <itemizedlist> <listitem> <para>La page de manuel &man.jail.8;. C'est la référence pour l'emploi de l'utilitaire <command>jail</command> — l'outil d'administration qui peut être utilisé sous &os; pour démarrer, arrêter, et contrôler les environnements jail &os;.</para> </listitem> <listitem> <para>Les listes de diffusion et leurs archives. Les archives de la &a.questions; et d'autres listes hébergées par le &a.mailman.lists; contiennent déjà quantité d'information sur les environnements jail. Il sera toujours conseillé de chercher dans les archives ou de poster une nouvelle question sur la liste de diffusion &a.questions.name;.</para> </listitem> </itemizedlist> </sect1> <sect1 id="jails-terms"> <title>Termes relatifs aux environnements jail</title> <para>Pour faciliter la compréhension des parties du système &os; relatives aux jails, leurs mécanismes internes et la manière dont ils interagissent avec le reste de &os;, les termes suivants seront utilisés tout au long de ce chapitre:</para> <variablelist> <varlistentry> <term>&man.chroot.2; (commande)</term> <listitem> <para>Un appel système &os;, qui modifie le répertoire racine d'un processus et de tout ses descendants.</para> </listitem> </varlistentry> <varlistentry> <term>&man.chroot.2; (environnement)</term> <listitem> <para>Environnement des processus pour lesquels l'emplacement de la racine du système de fichier a été modifiée (<quote>chrootée</quote>). Cela comprend les ressources comme la partie du système de fichiers qui est visible, les identifiants utilisateur et groupe qui sont disponibles, les interfaces réseaux et autres mécanismes IPC, etc.</para> </listitem> </varlistentry> <varlistentry> <term>&man.jail.8; (commande)</term> <listitem> <para>L'utilitaire système d'administration qui permet le lancement de processus à l'intérieur d'un environnement jail.</para> </listitem> </varlistentry> <varlistentry> <term>hôte (système, processus, utilisateur, etc.)</term> <listitem> <para>Le système de contrôle d'un environnement jail. Le système hôte a accès à toutes les ressources matérielles disponibles, et peut contrôler des processus à l'extérieur et à l'intérieur d'un environnement jail. Une des différences importantes entre le système hôte et l'environnement jail est que les limitations qui s'appliquent aux processus du super-utilisateur à l'intérieur de l'environnement jail ne s'appliquent pas aux processus du système hôte.</para> </listitem> </varlistentry> <varlistentry> <term>hébergé (système, processus, utilisateur, etc.)</term> <listitem> <para>Un processus, un utilisateur ou toute autre entité, dont l'accès aux ressources est limité par un environnement jail &os;.</para> </listitem> </varlistentry> </variablelist> </sect1> <sect1 id="jails-intro"> <title>Introduction</title> <para>Comme l'administration système est une tâche difficile et déroutante, de nombreux outils ont été développés pour rendre la vie de l'administrateur plus simple. Ces outils apportent pour la plupart des améliorations dans la manière dont sont installés, configurés et maintenus les systèmes. Une partie des tâches dévolues à l'administrateur est la sécurisation du système, de façon à ce que le système puisse se consacrer aux tâches qui lui sont confiées sans toutefois mettre en péril sa propre sécurité.</para> <para>Un de ces outils pouvant être employé pour augmenter la sécurisation d'un système &os; sont les environnements <emphasis>jail</emphasis>. Les environnements jail ont été introduits sous &os; 4.X par &a.phk;, mais ils ont été fortement améliorés sous &os; 5.X pour en faire des sous-systèmes flexibles et puissants. Des développements sont toujours en cours pour l'amélioration de leur utilité, performances, fiabilité et sécurité.</para> <sect2 id="jails-what"> <title>Qu'est-ce qu'un environnement jail?</title> <para>Les systèmes BSD disposent de l'environnement &man.chroot.2; depuis l'époque de 4.2BSD. L'utilitaire &man.chroot.8; peut être employé pour changer le répertoire racine d'un ensemble de processus, créant ainsi un environnement sécurisé et séparé du reste du système. Les processus créés dans l'environnement chrooté ne peuvent accéder aux fichiers et aux ressources extérieures à cet environnement. Pour cette raison, si un attaquant compromet un service tournant dans un environnement chrooté, cela ne devrait pas lui permettre de compromettre l'intégralité du système. L'utilitaire &man.chroot.8; est parfait pour des tâches simples qui ne demandent pas trop de flexibilité ou de fonctionnalités avancées et complexes. Depuis l'apparition du concept d'environnement chrooté, de nombreuses manières de s'échapper de ces environnements ont été découvertes, et bien que cela ait été corrigé dans les versions récentes du noyau &os;, il est clair que l'environnement &man.chroot.2; n'est pas la solution idéale pour la sécurisation des services. Un nouveau sous-système devait être implémenté.</para> <para>Ceci est une des raisons principales à l'origine du développement de l'environnement <emphasis>jail</emphasis>.</para> <para>Les environnements jail améliorent de plusieurs manières le concept d'environnement &man.chroot.2;. Dans un environnement &man.chroot.2; traditionnel, les processus sont ne sont limités que dans la partie du système de fichiers à laquelle ils ont accès. Le reste des ressources système (comme l'ensemble des utilisateurs système, les processus en cours d'exécution, ou le réseau) est partagé par les processus de l'environnement chrooté et les processus du système hôte. L'environnement jail étend ce modèle en virtualisant non seulement l'accès au système de fichiers mais également l'ensemble des utilisateurs, la partie réseau du noyau &os; et quelques autres éléments du système. Un ensemble plus complet de contrôles fins pour optimiser l'accès à un environnement jail est décrit dans la <xref linkend="jails-tuning"/>.</para> <para>Un environnement jail est caractérisé par quatre éléments:</para> <itemizedlist> <listitem> <para>Une arborescence de répertoires — le point d'accès à l'environnement jail. Une fois à l'intérieur de l'environnement jail, un processus ne peut s'échapper hors de cette arborescence. Les traditionnels problèmes de sécurité qui grèvent l'architecture &man.chroot.2; d'origine n'affecteront pas les environnements jail &os;.</para> </listitem> <listitem> <para>Un nom de machine — le nom de machine qui sera utilisé à l'intérieur de l'environnement jail. Les environnements jails sont principalement utilisés pour l'hébergement de services réseaux, par conséquent choisir un nom évocateur pour chaque environnement peut être d'une grande aide pour l'administrateur système.</para> </listitem> <listitem> <para>Une adresse <acronym>IP</acronym> — elle sera assignée à l'environnement jail et ne peut, en aucun cas, être modifiée pendant toute la durée de vie de l'environnement. L'adresse IP d'un environnement jail est en général un alias d'une interface réseau existante, mais cela n'est pas forcément nécessaire.</para> </listitem> <listitem> <para>Une commande — le chemin d'accès d'un exécutable à exécuter à l'intérieur de l'environnement jail. Il est relatif au répertoire racine de l'environnement jail, et peut beaucoup varier, en fonction du type d'environnement jail mis en oeuvre.</para> </listitem> </itemizedlist> <para>En dehors de cela les environnements jail peuvent avoir leur propre ensemble d'utilisateurs et leur propre utilisateur <username>root</username>. Naturellement les pouvoirs de l'utilisateur <username>root</username> sont limités à l'environnement jail et, du point de vue du système hôte, l'utilisateur <username>root</username> de l'environnement jail n'est pas un utilisateur omnipotent. De plus, l'utilisateur <username>root</username> d'un environnement jail n'est pas autorisé à effectuer des opérations critiques au niveau du système en dehors de son environnement &man.jail.8;. Plus d'information au sujet des possibilités et des restrictions de l'utilisateur <username>root</username> sera donnée dans la <xref linkend="jails-tuning"/> ci-après.</para> </sect2> </sect1> <sect1 id="jails-build"> <title>Création et contrôle de l'environnement jail</title> <para>Certains administrateurs divisent les environnements jail en deux catégories: les environnements jails <quote>complets</quote>, qui ressemblent à un véritable système &os;, et les environnements jails de <quote>service</quote>, qui sont dédiés à une application ou un seul service, et tournant éventuellement avec des privilèges. Cette séparation est juste conceptuelle et n'affecte pas la création de l'environnement jail. La page de manuel &man.jail.8; est très claire quant à la procédure de création d'un environnement jail:</para> <screen>&prompt.root; <userinput>setenv D <replaceable>/here/is/the/jail</replaceable></userinput> &prompt.root; <userinput>mkdir -p $D</userinput> <co id="jailpath"/> &prompt.root; <userinput>cd /usr/src</userinput> &prompt.root; <userinput>make world DESTDIR=$D</userinput> <co id="jailworld"/> &prompt.root; <userinput>cd etc/</userinput> <footnote><para>Cette étape n'est pas requise sous &os; 6.0 et versions ultérieures.</para></footnote> &prompt.root; <userinput>make distribution DESTDIR=$D</userinput> <co id="jaildistrib"/> &prompt.root; <userinput>mount_devfs devfs $D/dev</userinput> <co id="jaildevfs"/></screen> <calloutlist> <callout arearefs="jailpath"> <para>Sélectionner un emplacement pour l'environnement est le meilleur point de départ. C'est l'endroit où l'environnement jail se trouvera dans le système de fichiers de la machine hôte. Un bon choix peut être <filename class="directory">/usr/jail/<replaceable>jailname</replaceable></filename>, où <replaceable>jailname</replaceable> est le nom de machine identifiant l'environnement jail. Le système de fichiers <filename class="directory">/usr/</filename> dispose généralement de suffisamment d'espace pour le système de fichiers de l'environnement jail, qui est pour les environnements <quote>complets</quote>, essentiellement, une copie de chaque fichier présent dans une installation par défaut du système de base de &os;.</para> </callout> <callout arearefs="jailworld"> <para>Cette commande peuplera l'arborescence du répertoire choisi comme emplacement pour l'environnement jail avec les binaires, les bibliothèques, les pages de manuel, etc. nécessaires. Tout sera fait selon le style &os; habituel — en premier lieu tout est compilé, puis ensuite installé à l'emplacement voulu.</para> </callout> <callout arearefs="jaildistrib"> <para>La cible <maketarget>distribution</maketarget> pour <application>make</application> installe tous les fichiers de configuration nécessaires. Ou pour faire simple, cette commande installe tous les fichiers installables du répertoire <filename class="directory">/usr/src/etc/</filename> vers le répertoire <filename class="directory">/etc</filename> de l'environnement jail: <filename class="directory">$D/etc/</filename>.</para> </callout> <callout arearefs="jaildevfs"> <para>Le montage du système de fichiers &man.devfs.8; à l'intérieur d'un environnement jail n'est pas requis. Cependant, toutes, ou presque toutes les applications nécessitent l'accès à au moins un périphérique, en fonction du rôle de l'application. Il est vraiment important de contrôler l'accès aux périphériques depuis l'intérieur d'un environnement jail, comme un mauvais paramétrage pourrait permettre à quelqu'un de malintentionné de faire de <quote>mauvaises</quote> choses dans l'environnemane jail. Le contrôle sur &man.devfs.8; est géré par l'intermédiaire d'un ensemble de règles qui est décrit dans les pages de manuel &man.devfs.8; et &man.devfs.conf.5;.</para> </callout> </calloutlist> <para>Une fois l'environnement jail installé, il peut être lancé en employant l'utilitaire &man.jail.8;. Cet outil requiert obligatoirement quatre arguments qui sont décrits dans la <xref linkend="jails-what"/>. D'autres arguments peuvent également être utilisés, pour par exemple exécuter le processus avec les droits d'un utilisateur particulier. L'argument <option><replaceable>command</replaceable></option> dépend du type d'environnement; pour un <emphasis>système virtuel</emphasis>, <filename>/etc/rc</filename> est un bon choix puisque la séquence de démarrage d'un véritable système &os; sera dupliquée. Pour un environnement jail de type <emphasis>service</emphasis>, cela dépendra du service ou de l'application qui sera exécuté dans l'environnement jail.</para> <para>Les environnements jails sont souvent lancés au démarrage de la machine et le système <filename>rc</filename> de &os; propose une méthode simple pour cela.</para> <procedure> <step> <para>Une liste des environnements jail autorisés à être lancés au démarrage du système devrait être ajoutée au fichier &man.rc.conf.5;:</para> <programlisting>jail_enable="YES" # Utiliser NO pour désactiver le lancement des environnements jail jail_list="<replaceable>www</replaceable>" # Liste des noms des environnements jail séparés par une espace</programlisting> </step> <step> <para>Pour chaque environnement listé dans <varname>jail_list</varname>, un ensemble de paramètres &man.rc.conf.5;, qui décrivent l'environnement jail, devrait être ajouté:</para> <programlisting>jail_<replaceable>www</replaceable>_rootdir="/usr/jail/www" # le répertoire racine de l'environnement jail jail_<replaceable>www</replaceable>_hostname="<replaceable>www</replaceable>.example.org" # le nom de machine de l'environnement jail jail_<replaceable>www</replaceable>_ip="192.168.0.10" # son adresse IP jail_<replaceable>www</replaceable>_devfs_enable="YES" # monter devfs dans l'environnement jail jail_<replaceable>www</replaceable>_devfs_ruleset="<replaceable>www_ruleset</replaceable>" # les règles devfs à appliquer à l'environnement jail</programlisting> <para>Le démarrage par défaut des environnements jails, configuré dans &man.rc.conf.5;, exécutera la procédure <filename>/etc/rc</filename> de l'environnement jail, ce qui suppose que l'environnement est un système virtuel complet. Pour les environnements jail de service, la commande de démarrage par défaut de l'environnement devrait être modifiée en configurant correctement l'option <varname>jail_<replaceable>jailname</replaceable>_exec_start</varname>.</para> <note> <para>Pour une liste complète des options disponibles, veuillez consulter la page de manuel &man.rc.conf.5;.</para> </note> </step> </procedure> <para>La procedure <filename>/etc/rc.d/jail</filename> peut être utilisée pour démarrer ou arrêter un environnement jail à la main si une entrée pour l'environnement existe dans le fichier <filename>rc.conf</filename>:</para> <screen>&prompt.root; <userinput>/etc/rc.d/jail start <replaceable>www</replaceable></userinput> &prompt.root; <userinput>/etc/rc.d/jail stop <replaceable>www</replaceable></userinput></screen> <para>Il n'existe pas pour le moment de méthode propre pour arrêter un environnement &man.jail.8;. C'est dû au fait que les commandes normalement employées pour arrêter proprement un système ne peuvent être utilisées à l'intérieur d'un environnement jail. La meilleur façon d'arrêter un environnement jail est de lancer la commande suivante à l'intérieur de l'environnement ou en utilisant le programme &man.jexec.8; depuis l'extérieur de l'environnement:</para> <screen>&prompt.root; <userinput>sh /etc/rc.shutdown</userinput></screen> <para>Plus d'information à ce sujet peut être trouvé dans la page de manuel de &man.jail.8;.</para> </sect1> <sect1 id="jails-tuning"> <title>Optimisation et administration</title> <para>Il existe plusieurs options qui peuvent être configurées pour n'importe quel environnement jail, et de nombreuses manières de combiner un système &os; hôte avec des environnements jail pour donner naissance à des applications haut-niveau. Cette section présente:</para> <itemizedlist> <listitem> <para>Certaines des options disponibles pour l'optimisation du fonctionnement et des restrictions de sécurité implémentées par une installation jail.</para> </listitem> <listitem> <para>Des applications de haut niveau pour la gestion des environnements jail, qui sont disponibles dans le catalogue des logiciels portés, et peuvent être utilisées pour implémenter des environnements jail complets.</para> </listitem> </itemizedlist> <sect2 id="jails-tuning-utilities"> <title>Outils systèmes pour l'optimisation d'un environnement jail sous &os;</title> <para>L'optimisation de la configuration d'un environnement jail se fait principalement par le paramétrage de variables &man.sysctl.8;. Une sous-catégorie spécifique de &man.sysctl.8; existe pour toutes les options pertinentes: la hiérarchie <varname>security.jail.*</varname> d'options du noyau &os;. Ci-dessous est donnée une liste des principales variables relatives aux environnements jail avec leur valeur par défaut. Leurs noms sont explicites, mais pour plus d'information, veuillez vous référer aux pages de manuel &man.jail.8; et &man.sysctl.8;.</para> <itemizedlist> <listitem> <para><varname>security.jail.set_hostname_allowed: 1</varname></para> </listitem> <listitem> <para><varname>security.jail.socket_unixiproute_only: 1</varname></para> </listitem> <listitem> <para><varname>security.jail.sysvipc_allowed: 0</varname></para> </listitem> <listitem> <para><varname>security.jail.enforce_statfs: 2</varname></para> </listitem> <listitem> <para><varname>security.jail.allow_raw_sockets: 0</varname></para> </listitem> <listitem> <para><varname>security.jail.chflags_allowed: 0</varname></para> </listitem> <listitem> <para><varname>security.jail.jailed: 0</varname></para> </listitem> </itemizedlist> <para>Ces variables peuvent être utilisées par l'administrateur du <emphasis>système hôte</emphasis> pour ajouter ou retirer certaines limitations imposées par défaut à l'utilisateur <username>root</username>. Notez que certaines limitations ne peuvent être retirées. L'utilisateur <username>root</username> n'est pas autorisé à monter ou démonter des systèmes de fichiers à partir d'un environnement &man.jail.8;. L'utilisateur <username>root</username> d'un environnement jail ne peut charger ou modifier des règles &man.devfs.8;, paramétrer des règles de pare-feu, ou effectuer des tâches d'administration qui nécessitent la modification de données du noyau, comme le paramétrage du niveau de sécurité <varname>securelevel</varname> du noyau.</para> <para>Le système de base de &os; contient un ensemble d'outils basiques pour afficher les informations au sujet des environnements jail actifs, pour s'attacher à un environnement jail pour lancer des commandes d'administration. Les commandes &man.jls.8; et &man.jexec.8; font partie du système de base de &os; et peuvent être utilisées pour effectuer les tâches simples suivantes:</para> <itemizedlist> <listitem> <para>Afficher une liste des environnements jail actifs et leur identifiant (<acronym>JID</acronym>), leur adresse <acronym>IP</acronym>, leur nom de machine et leur emplacement.</para> </listitem> <listitem> <para>S'attacher à un environnement jail actif, à partir de son système hôte, et exécuter une commande à l'intérieur de l'environnement ou effectuer des tâches d'administration à l'intérieur de environnement lui-même. C'est tout particulièrement utile quand l'utilisateur <username>root</username> veut arrêter proprement un environnement. L'utilitaire &man.jexec.8; peut également être employé pour lancer un interpréteur de commandes dans un environnement jail pour faire de l'administration; par exemple:</para> <screen>&prompt.root; <userinput>jexec <replaceable>1</replaceable> tcsh</userinput></screen> </listitem> </itemizedlist> </sect2> <sect2 id="jails-tuning-admintools"> <title>Outils d'administration haut niveau du catalogue des logiciels portés de &os;</title> <para>Parmi les nombreux utilitaires tierce-partie pour l'administration des environnements jail, un des plus complet et utile est <filename role="package">sysutils/jailutils</filename>. C'est un ensemble de petites applications qui aident à la gestion des environnements &man.jail.8;. Veuillez consulter sa page Web pour plus d'information.</para> </sect2> </sect1> </chapter>