Garder son phacochère familier dans un enclos
Signature : | Mis en ligne le : 27/11/2007
Catégorie(s) :
  • GNU/Linux Magazine HS
  • | Domaine :
    Commentez creative commons
    Ton phacochère [1] familier, bien que très sympathique, continue de faire quelques bêtises dans ta maison, bouffer les meubles, vider sa gamelle un peu partout, voire embêter tes autres colocataires. Ne voulant pas te résoudre à l’enfermer dans une niche (chroot) trop étroite, tu décides de lui construire un enclos qui lui sera dédié et dans lequel il pourra faire ce que bon lui semble sans nuire à son entourage (continue to be root).

    Pré-requis

    • un terrain propice (avoir un FreeBSD sous la main, être root dessus) ;
    • un peu d’espace disque, car on va dupliquer tout le userland dans l’enclos ;
    • avoir les sources dans /usr/src.
    Avant d'envisager la construction Avant de pouvoir configurer son enclos (jail), il faut déjà préparer le terrain tout autour (configurer le serveur qui va accueillir les jails pour que les daemons n’écoutent plus sur toutes les IP). Donc, tout autour de l’emplacement de son futur enclos, on fixe les branches qui dépassent, on ramasse les feuilles mortes, on passe un coup de râteau et on laisse un emplacement le plus nickel possible.
    • sshd Utilisez sshd_flags=”-oListenAddress=Public_IP” dans votre fichier /etc/rc.conf ou modifiez /etc/ssh/sshd_config (et redémarrez le daemon sshd par /etc/rc.d/sshd restart)
    • sendmail
    Ajoutez DAEMON_OPTIONS(Addr=Public_IP’) à votre fichier de macro sendmail (fichier mc)
    • inetd
    Si vous utilisez inetd, il faut ajouter inetd_flags=”-a Public_IP” à votre /etc/rc.conf (attention à bien reprendre les flags existants).
    • named
    Utilisez la directive listen-on { Public_IP; }; dans votre fichier de configuration named.conf.
    • apache
    Utilisez la directive Listen Public_IP:80 dans votre /usr/local/etc/httpd.conf
    • etc.
    Idem pour les autres daemons écoutant sur toutes les IP.

    Un enclos en kit

    Tu as acheté ton enclos au même endroit que ton abri de jardin et, bien aimablement, le fabricant a fourni une aide minimale au montage des différents éléments ; pourtant, tout n’est pas aussi simple que chez Ikea. Tu n’auras pas de notice imprimée recto-verso t’expliquant ce qu’est une vis, mais cela ne signifie pas qu’il n’y a pas de documentation ! Extrait de la page de man de jail [2] Si tu as compilé ton système récemment, tu peux remplacer make world DESTDIR=$D par make installworld DESTDIR=$D ce qui te fera économiser tout le temps de la compilation. Une méthode plus Gruik consiste à monter une image ISO de FreeBSD et à extraire l’environnement de base comme s’il s’agissait d’une installation d’un système : On va créer manuellement le /dev/* du jail et y "entrer" : On regarde un peu dans quel environnement on se retrouve : On s’aperçoit que le système dans le jail hérite de la version du kernel du serveur hôte malgré le userland "décalé" et que la sortie de la commande mount ne montre que la partition accueillant le jail. De même, depuis le jail, la commande uptime montre le résultat du serveur hôte et pas du jail en lui-même. Pour vous en convaincre, créez le fichier /etc/rc.local contenant dans le jail ; amusez-vous à faire plusieurs reboot et regarder le fichier de log et l’uptime. Pour le moment, le user root du jail voit tout /dev à l’identique de ce qu’il se trouve sur le serveur hôte, ce qui peut être très dangereux si vous n’avez pas confiance dans le root du jail, car il a accès à tous les disques et partitions, à la configuration de vos règles de firewall...

    Et la barrière électrique ?

    Dans un jail correctement configuré comme plus loin dans l’article, le root du jail ne peut pas configurer son propre firewall et, par conséquent, il ne peut pas choisir et setter ses rules. Toute la configuration firewall se fait "au-dessus" du jail, sur le serveur hôte. Configuration par défaut Le système FreeBSD comporte une configuration par défaut et des exemples pour configurer votre/(vos) jail(s). Ces informations se trouvent dans /etc/defaults/rc.conf qui est lu par les scripts de démarrage ; toutes les modifications doivent se faire dans /etc/rc.conf. Voici les paramètres communs à tous les jails : Et voici la liste des paramètres spécifiques à un jail qui peuvent être repris pour la configuration de vos jails : Voir Figure 1,

    Configurons notre enclos

    Voici ce que j’ai mis dans le /etc/rc.conf du serveur hôte ; l’utilisation de chaque variable sera détaillée plus loin. Dans le rc.conf du jail, on lui indique de démarrer sshd comme d’habitude : Apparemment, il n’est plus indispensable de commenter adjkerntz -a dans /etc/crontab du système jailé. Démarrons ce jail et regardons ce qui est vu du serveur hôte. Ce qu’il s’est produit :
    • l’alias IP 192.168.0.10 est automatiquement ajouté sur l’interface précisée par jail_gcujail_ip ;
    • devfs s’occupe de monter le /dev du jail au démarrage de celui-ci ;
    • les devices visibles dans le /dev du jail ont réduit comme peau de chagrin et ne permettent plus d’outrepasser les devices sur le serveur hôte (faites un ls pour vérifier).
    Voir Figure 2 Vous aurez remarqué que le jail est démarré en securelevel [3] à 1 grâce à -s 1 de la variable jail_gcujail_flags.

    Les logs

    Activons les logs de la console dans le jail (fichier /home/jails/gcujail/etc/syslog.conf) : Créons le fichier en question et redémarrons le jail : Ce qui aura pour effet de créer un fichier /var/log/jail_gcujail_console.log sur le serveur hôte reprenant les logs de la console.

    Remplir l'enclos

    Afin d’économiser un peu d’espace disque, il vous semble évident que vous allez limiter au strict minimum les informations dupliquées sur le serveur hôte ainsi que dans votre (vos) jail(s). Typiquement, on partage /usr/src et /usr/ports : Il est possible d’ajouter ces points de montage dans le /etc/fstab du serveur hôte afin que le jail y ait accès de manière permanente, mais attention, ces répertoires peuvent être supprimés depuis le jail ! Pour plus de sécurité, il est recommandé de monter /usr/src et /usr/ports/ en read-only dans le jail et de modifier la manière dont sont compilés les ports à partir du jail (pour pouvoir utiliser un /usr/ports en RO). Si vous devez gérer plusieurs enclos, il est préférable de mettre en place un export NFS en read-only de ces répertoires vers les jails, ce qui évitera les points de montage en nullfs : Et on édite le /etc/make.conf du jail pour y ajouter les lignes suivantes : Il suffit d’ajouter les ports dans le jail comme d’habitude. Ceci aura pour inconvénient d’ignorer le contenu de /usr/ports/distfiles ; n’hésitez pas à en recopier les fichiers s’ils existent, ce qui évitera de perdre de la bande passante et du temps. Pensez à faire régulièrement le ménage dans /usr/obj/distfiles du jail sans quoi de l’espace disque sera perdu pour rien.

    Sécuri-clos

    Au cours de l’installation du jail, tu as constaté qu’il tenait sur une seule partition, ce qui est assez gênant quand tu veux avoir des points de montage avec des droits différents. Par exemple, j’ai pris pour habitude d’utiliser un /tmp de taille fixe, monté en RAM, avec des droits noexec et nosuid. Habituellement, je déclare dans /etc/rc.conf les lignes suivantes : qui ont pour résultat : Mais cela ne fonctionne pas dans gcujail tout simplement parce que les commandes mdconfig n’ont pas accès aux devices /dev/md* depuis le jail ! Les ajouter serait une fausse bonne idée, puisque cela donnerait accès aux devices md* appartenant au serveur hôte depuis l’intérieur du jail. Oh, tu peux essayer de bricoler le /etc/fstab du jail, si tu arrives à quelque chose de concluant tu es prié d’écrire à Pinpin (ou à l’auteur). La solution, peu gracieuse, trouvée pour l’instant, est la suivante :
    • sur le serveur hôte, on crée un fichier vide d’une taille fixe :
    Edition du fichier /etc/fstab.gcujail (qui sera pris par défaut par le script jail) : Voir Figure 3 et on ajoute la gestion du mount dans le fichier /etc/rc.conf du serveur hôte pour ce jail : Par défaut, le fichier fstab du jail pris en compte par la variable jail_gcujail_fstab sera /etc/fstab.gcujail. On redémarre le jail : Le /tmp de notre jail est bien d’une taille limitée et monté avec des droits moins permissifs. Note Un inconvénient de cette méthode est que bien qu’un /etc/rc.d/jail stop démonte le /tmp du jail, cela ne libère pas le device md qui y était associé et il faut le faire à la mimine depuis le serveur hôte !

    Quota-clos

    Jusqu’à présent, ton phacochère est tout seul dans son enclos. Il peut le décorer comme il lui plaît et ajouter ce dont il a besoin, mais, surtout, il peut continuer à prendre tout l’espace disponible dans son enclos. Il y a au moins deux solutions pour résoudre ce problème :
    • mettre les répertoires accueillant les jails dans des partitions physiques et donc de taille fixe ;
    • utiliser l’astuce d’un filesystem sur un fichier comme ce qu’on a fait avec /home/jails/gcujail.tmp, ce système de fichiers étant monté depuis le système hôte avant le démarrage du jail.

    Manager plusieurs enclos

    Divers programmes sont disponibles dans les ports afin de manager plusieurs jails plus facilement, liste évidemment non exhaustive : Pour une gestion plus facile des jails depuis le serveur hôte, je conseille l’installation des ports jailadmin et jailutils ; l’upgrade des enclos se fait de la même manière qu’un serveur FreeBSD (y compris pour le mergemaster) sauf qu’on change la variable $DESTDIR pour pointer dans le répertoire du jail à mettre à jour. Figure 1 Figure 2 Figure 3

    Conclusion

    Et voici un petit tour d’horizon sur les jails avec, je l’espère, une présentation qui sort un peu des howtos classiques qu’on trouve sur différents sites web. Références [1] http://fr.wikipedia.org/wiki/Phacochère [2] http://www.freebsd.org/cgi/man.cgi?query=jail&sektion=8 [3] http://www.freebsd.org/cgi/man.cgi?query=securelevel&sektion=8
    Vous souhaitez commenter cet article ?
    Brèves Flux RSS
    Édito : GNU/Linux Magazine 149
    Édito : GNU/Linux Magazine HS N°60
    Édito : Misc 61
    Édito : Linux Pratique 71
    Édito : Linux Essentiel N°25
    Communication RSS Com. RSS Presse
    Lancement de la plateforme de vente en ligne de PDF des Éditions Diamond ! Un...
    Misc N°61 – Communiqué de presse
    GNU/Linux Magazine N°149 – Communiqué de presse
    GNU/Linux Magazine HS N°60 – Communiqué de presse
    Linux Pratique N°71 – Communiqué de presse
    prochainement moteur de recherches des articles
     
    :
    :
    Jours heures minutes secondes
    En kiosque Flux RSS

    Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Misc est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau GNU/Linux Magazine HS est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Linux Essentiel est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...

    Le tout nouveau Misc HS est disponible dès maintenant chez votre marchand de journaux et sur notre site marchand.

    Découvrez le sommaire de ce numéro et un aperçu de ce magazine...

    Lire la suite...