A la découverte d'UNIX (FreeBSD)

A la découverte d'UNIX (FreeBSD)

Mis à jour le mardi 8 janvier 2013

La prison est l'un des atouts-maîtres de FreeBSD. Si l'administrateur s'en sert correctement, elle garantit qu'aucun pirate :pirate: , processus instable ou utilisateur maladroit ne peut mettre en péril l'ensemble du système. Je ne rajoute pas les virus à la liste car il n'y en a pas sous UNIX, mais ils n'auraient aucune chance. :'(

A - La méthode classique

Je vous la donne à titre indicatif mais ce n'est pas elle que nous emploierons par la suite.

Tout bon chantier commence par le choix d'un grand terrain bien dégagé. La tranche où il y a le plus de place, vous le savez, c'est /usr. C'est donc dans le dossier /usr/ que la prison doit être édifiée. Allez-y d'un cd /usr puis :

[Nom de l'ordinateur]# mkdir prison

Vous pouvez, bien sûr, donner un autre nom à ce dossier, surtout si vous créez d'autres prisons par la suite.

La prison contiendra un petit système de fichiers (ressemblant à s'y méprendre au vrai), avec une fausse racine, qui sera en réalité le dossier /usr/prison. Impossible pour un pirate :pirate: de remonter l'arborescence des dossiers plus haut que cette fausse racine. L'étape suivante est donc l'installation du monde :

[Nom de l'ordinateur]# cd src && make installworld DESTDIR=/usr/prison

Cette fois, vous pouvez rester en mode multi-utilisateurs sans craindre d'endommager :waw: quoi que ce soit. make installworld va se servir des fichiers objets générés il y a deux chapitres (par make buildworld) pour installer un deuxième espace utilisateur, non pas à la racine, mais dans le dossier désigné par DESTDIR (/usr/prison).

Il faut encore recopier certains fichiers de configuration. La commande suivante s'en chargera :

[Nom de l'ordinateur]# make distribution DESTDIR=/usr/prison

Et pour pouvoir accéder aux périphériques depuis la prison, il faut y monter le système de fichiers des devices. Celui-ci s'appelle devfs et est de type devfs :

[Nom de l'ordinateur]# mount -t devfs devfs /usr/prison/dev

Les murs de la prison sont maintenant bâtis. Elle va pouvoir ouvrir ses portes (ou plutôt les fermer, en l'occurence) ;) :

[Nom de l'ordinateur]# jail -c path=/usr/prison host.hostname=Prison1 ip4.addr=10.1.1.1 persist

La commande jail est un vrai couteau suisse en matière de prisons. Elle permet par exemple de créer (-c), de modifier (-m) ou de supprimer (-r) une prison, et bien d'autres choses encore. Il faut indiquer le dossier qui servira de racine à la prison (/usr/prison), donner un nom à cette dernière (Prison1) et lui affecter une adresse IPv4 (10.1.1.1 par exemple). L'option persist indique que la prison doit continuer à exister même quand elle est vide. C'est une option d'autant plus indispensable que, pour l'instant, elle est justement vide, :p c'est à dire qu'aucun processus ne s'y exécute.

Image utilisateur

Une prison a donc sa propre adresse IP, sa propre racine, son propre système de fichiers. D'une certaine façon, c'est finalement un autre ordinateur, différent du votre. Sauf que son contenu est accessible depuis votre ordinateur (mais pas l'inverse). Vous pouvez à présent démarrer la votre et y demander un shell. Il faut pour cela aller dans le dossier /usr/prison/ et saisir :

[Nom de l'ordinateur]# jail /usr/prison Prison1 10.1.1.1 /bin/csh

Vous voyez qu'il faut toujours désigner la prison par son dossier racine, son nom et son adresse IP. C'est un peu long. Pour aller plus vite, vous pouvez créer une variable d'environnement :

[Nom de l'ordinateur]# setenv P '/usr/prison Prison1 10.1.1.1'

Comme le contenu qu'on veut affecter à P contient des espaces, il faut l'entourer d'apostrophes.

L'ennui, c'est que la prochaine fois que vous allumerez votre ordinateur, ou même que vous ouvrirez une console, la valeur de P aura été oubliée. Pour la conserver de façon permanente, vous savez qu'il faut l'enregistrer dans le fichier /etc/csh.cshrc.

[Nom de l'ordinateur]# echo "setenv P '/usr/prison Prison1 10.1.1.1'" >> /etc/csh.cshrc

Maintenant, pour démarrer votre prison, il suffira de taper :

[Nom de l'ordinateur]# jail $P /bin/csh

Et aussitôt, votre invite de commande devient :

[Nom de la prison]#

Vous êtes toujours un superutilisateur :zorro: , mais vous n'êtes plus désormais que celui de la prison. Si vous demandez votre position à pwd, il vous répondra que vous êtes à la racine. Et pourtant, vous savez bien que c'est faux : vous êtes en réalité dans le dossier /usr/prison. Mais, à partir de maintenant, vous n'avez plus accès au reste du système.

Ah bah bravo ! :colere: J'ai fait tout ça pour avoir moins de liberté ?

Je vous avais bien dit que c'était une prison. Bon, c'est vous qui l'avez créée donc vous pouvez toujours en sortir avec exit. Mais si quelqu'un :pirate: s'y connecte depuis l'extérieur, il n'aura accès qu'au contenu de la prison. S'il tape exit, il se retrouvera tout simplement chez lui. C'est quand même une sécurité importante. Vous pouvez envisager d'autoriser des connexions SSH à votre prison, ce que vous aviez refusé pour le système principal. Il faudra alors rediriger vers lo1 les paquets du port 22.

De même, les applications et les processus que vous lancerez dans la prison ne risquent pas d'interagir avec ceux qui sont libres. Bien pratique, par exemple, pour éviter les conflits entre ports et paquets.

Une autre façon de démarrer une prison est de se servir du script /etc/rc.d/jail. Mais il faut d'abord éditer le fichier rc.conf. Je ne rentre pas dans les détails car il y a encore plus simple, comme on va le voir tout de suite.

B - La méthode ezjail

ezjail est un utilitaire conçu pour simplifier le maniement des prisons. Il en existe au moins deux autres : jailutils et qjails. Chacun d'eux apporte une série de commandes supplémentaires pour créer, démarrer, arrêter, cloner des prisons, etc.

Nous nous contenterons d'ezjail :

[Nom de l'ordinateur]# cd /usr/ports/sysutils/ezjail && make install clean

Pendant la compilation, ajoutez ces lignes à votre rc.conf :

ezjail_enable="YES"
cloned_interfaces="lo1"
ifconfig_lo1="inet 10.1.1.1 netmask 255.255.255.0"

Elles activent ezjail et créent l'interface lo1.

Les commandes d'ezjail commencent par ezjail-admin :

[Nom de l'ordinateur]# ezjail-admin install

Il y en a pour une demi-heure (sur ma faible machine). Ce n'est pas une simple prison qu'ezjail vous installe mais un grand pénitencier, dans lequel vous pouvez ouvrir de nombreuses cellules. Non seulement ces cellules n'ont pas accès au système principal mais elles ne peuvent pas non plus communiquer entre elles. Pour l'instant, une seule cellule nous suffira :

[Nom de l'ordinateur]# ezjail-admin create Prison1 10.1.1.1

La prison est placée automatiquement dans le dossier /usr/jails/Prison1.

Autres commandes à connaître (ne les essayez pas maintenant) :

  • ezjail-admin delete Prison1 : supprimer la prison (il faudra ensuite supprimer son dossier en tapant rm -r /usr/jails/Prison1).

  • ezjail-admin start Prison1 : démarrer la prison.

  • ezjail-admin stop Prison1 : arrêter la prison.

  • ezjail-admin restart Prison1 : redémarrer la prison.

  • ezjail-admin console Prison1 : entrer dans la prison.

Et encore deux commandes essentielles, non liées à ezjail :

jls : Afficher la liste des prisons actives :

FreeBSD# jls
   JID  IP Address      Hostname                      Path
     2  10.1.1.1        Prison1                       /usr/jails/Prison1

Le numéro JID permet d'identifier la prison. C'est surtout utile pour la manipuler avec...

jexec : Exécuter une commande à l'intérieur de la prison sans y entrer soi-même :

FreeBSD# pwd
/usr/jails/Prison1
FreeBSD# jexec 2 pwd
/

Vous voyez que, vu depuis l'intérieur de la prison, le dossier /usr/jails/Prison1 a l'air d'être la racine. En parlant de dossiers, voyons un peu quelle nouvelle arborescence vient d'être créée :

FreeBSD# cd /usr/jails
FreeBSD# ls
Prison1         basejail        flavours        newjail
Image utilisateur

Il y a donc une prison "de base" (basejail) sur le modèle de laquelle sont créées les autres. Et le dossier Prison1/ ne contient pas réellement tous les dossiers typiques d'une racine : certains sont des liens vers /usr/basejail, qui sera commun à toutes les "cellules" du "pénitencier".

C - Domain Name Server

Dernier élément à configurer avant de pouvoir utiliser notre prison : la gestion des noms de domaines. Quand vous demandez à votre navigateur web d'afficher la page d'accueil du site officiel de FreeBSD, il doit contacter le serveur correspondant. Et pour trouver ce serveur sur internet, il a forcément besoin de connaître son adresse IP publique (69.147.83.33). Pourtant, vous ne lui donnez PAS cette adresse ! Tout ce que vous lui dites, c'est www.freebsd.org. Comment se débrouille-t-il avec ça ? :euh:

C'est tout bête : il demande son chemin. ;) Non pas au premier venu, mais à une machine qu'on appelle un serveur DNS, et qu'il contacte sur son port 53. A son tour, le serveur DNS va demander à des collègues à lui l'adresse IP de www.freebsd.org, jusqu'à en trouver un qui la connaisse. L'information est alors transmise à votre navigateur, qui peut envoyer des requètes vers 69.147.83.33.

Si vous voulez, vous aussi, connaître l'IP publique d'un site, vous pouvez utiliser la commande dig :

% dig www.freebsd.org
; <<>> DiG 9.6.2-P2 <<>> www.freebsd.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19476
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.freebsd.org.               IN      A

;; ANSWER SECTION:
www.freebsd.org.        3243    IN      A       69.147.83.33

;; Query time: 1 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Aug 18 09:14:48 2010
;; MSG SIZE  rcvd: 49

L'adresse IP recherchée apparaît à la rubrique ANSWER (réponse). Si vous tapez ces quatre nombres dans la barre d'adresse de votre navigateur, vous arriverez bien sur le site de FreeBSD. Un peu plus bas, à la ligne SERVER, dig vous donne l'adresse du premier serveur DNS contacté. Dans mon cas, c'est 192.168.1.1. Autrement dit, le premier serveur DNS contacté n'est autre que ma neufbox. Et c'est elle qui contacte ensuite d'autres serveurs DNS. Sur la même ligne, repérez le #53 qui montre qu'on s'est bien servi du port 53.

Et comment fait l'ordinateur pour connaître l'adresse du premier serveur DNS ?

Là, c'est sûr, il a bien fallu la lui donner. Cela s'est fait automatiquement pendant l'installation de FreeBSD : l'adresse 192.168.1.1 (dans mon cas) a été écrite dans le fichier /etc/resolv.conf. C'est ce fichier que votre navigateur consulte chaque fois que vous lui donnez une adresse du type www.patatipatata.xx.

Allez, je sais que vous en mourrez d'envie... ;) Allez le voir :

%cat /etc/resolv.conf
nameserver 192.168.1.1

Si je vous parle de tout ça, c'est parce que, pour l'instant, il n'y a pas de resolv.conf dans la prison. Celle-ci est donc incapable de contacter les serveurs DNS. Vous n'allez quand même pas la laisser dans cet état ! :'(

Remédier à ce problème n'est d'ailleurs pas bien compliqué : il suffit de copier dans la prison le resolv.conf principal. Un petit coup de cp et on n'en parle plus :

[Nom de l'ordinateur]# cp /etc/resolv.conf /usr/jails/Prison1/etc/resolv.conf

Et hop ! Fin de la configuration. Il ne reste plus qu'à rebooter et vous allez pouvoir commencer à vous servir de votre prison.

D - Les ports du pénitencier

Au nom de la loi, je vous arrête ! :zorro:

Voici venue l'heure de votre incarcération. Entrez dans la prison avec :

[Nom de l'ordinateur]# ezjail-admin console Prison1

Après un petit message d'accueil (soyez le bienvenu dans notre prison :D ), votre invite de commande devient :

Prison1#

Comme je l'expliquais plus haut, vous n'êtes plus qu'un superprisonnier. Bon, consolez vous, ça pourrait être pire, vous pourriez être un prisonnier ordinaire :( ...

Sur le réseau interne d'une grande entreprise, avoir des superprisonniers peut être fort utile : chacun administre une partie du réseau et n'a accès qu'à elle. Vous voyez donc que l'intérêt des prisons est multiple. En poussant un peu, on pourrait même s'en servir pour faire de la virtualisation, à la manière de VirtualBox.

Trève de bavardages, voyons si nous sommes bien connectés à internet et au DNS. D'habitude, sur le système principal, on utilise la commande ping pour ça. Par exemple :

[Nom de l'ordinateur] ping www.siteduzero.com

Mais le règlement de la prison est formel : :colere2: par mesure de sécurité, les ping sont strictement interdits dans l'enceinte de l'établissement ! Par contre, vous avez toujours dig :

Prison1# dig www.siteduzero.com

C'est bon ? Tout fonctionne ?

Bien ! Alors, nous sommes ici pour installer un serveur web dans la prison. Mais vous savez que pour installer quoi que ce soit, il faut... la collection des ports ! Cette fois, j'écris ports en noir car il s'agit bien des ports dont nous avons l'habitude.

Pour installer les ports, tapez donc :

Prison1# portsnap fetch extract

La collection va être placée dans le dossier basejail/ mais un lien vous permettra d'y accéder depuis Prison1. Si vous créez un jour une Prison2, vous n'aurez pas besoin d'installer la collection des ports à nouveau.

Que pourrions-nous bien installer ? Tiens, pourquoi pas un nouveau shell : le bash, comme sous Linux. Comme ça, un simple coup d'oeil et vous ferez tout de suite la différence entre la prison et le système principal.

Prison1# cd /usr/ports/shells/bash/ && make install clean

La compilation ne prend que 2 ou 3 minutes. Ensuite, tapez bash et votre invite de commandes va devenir :

[root@Prison1 /usr/ports/shells/bash]#

Vous êtes en bash ! Remarquez que vous n'avez plus besoin de pwd pour connaître votre position : l'invite de commandes vous la donne systématiquement.

Si vous voulez définir le bash comme votre shell préféré (à l'intérieur de la prison), vous savez qu'il faut saisir :

[root@Prison1 ... ]# pw usermod root -s /usr/local/bin/bash

La seule petite subtilité, ici, c'est qu'il s'agit d'un shell importé, et qu'il faut donc donner le chemin complet : /usr/local/bin/bash.

Tapez une première fois exit pour revenir au csh et une seconde fois pour sortir de la prison. La prochaine fois que vous y entrerez, vous serez directement en bash.

E - Le serveur HTTP

Un serveur HTTP est un programme. Souvent, on appelle aussi comme ça l'ordinateur sur lequel ce programme s'exécute. Les navigateurs des internautes adressent des requètes au serveur HTTP qui, en retour, leur envoie des pages. Ce programme, vous l'avez compris, vous allez le placer dans la Prison1.

Apache est aujourd'hui le serveur HTTP le plus répandu. Il est naturellement disponible sous FreeBSD (/usr/ports/www/apache22). Mais il y en a d'autres, comme Yaws, un serveur capable d'accepter plus de 80000 connexions simultanément. En ce qui nous concerne, nous n'avons pas besoin d'autant. :)

Par contre, dans une prison, il nous faut un serveur peu gourmand en RAM ou en CPU (surtout si vous êtes toujours sous VirtualBox). Du coup, rien de tel que nginx, un serveur léger sous licence BSD, très répandu dans certains pays, comme la Russie.

Tiens, plutôt que d'entrer dans la prison, nous allons nous servir de jls et jexec, cette fois-ci.

[Nom de l'ordinateur]# jls
   JID  IP Address      Hostname                      Path
     2  10.1.1.1        Prison1                       /usr/jails/Prison1
[Nom de l'ordinateur]# jexec 2 cd /usr/ports/www/nginx && make install clean

Relancez ensuite la prison avant d'y entrer :

[Nom de l'ordinateur]# ezjail-admin restart Prison1
[Nom de l'ordinateur]# ezjail-admin console Prison1

Pour lancer le serveur, il suffit de taper nginx. La commande top permet de vérifier qu'il est bien actif. Et si vous saisissez l'adresse de votre prison dans votre navigateur préféré, vous allez voir :

Image utilisateur

Le fichier de configuration de nginx est /usr/local/etc/nginx/nginx.conf. La configuration par défaut devrait normalement convenir mais, si vous voulez l'éditer, c'est bien sûr possible, ne serait-ce que pour y indiquer votre nom de domaine quand vous en aurez un. Une remarque, toutefois : emacs n'est pas installé dans la prison donc, pour éditer nginx.conf depuis celle-ci, il faut se servir d'ee.

[root@Prison1 ~]# ee /usr/local/etc/nginx/nginx.conf

Si vous ne savez déjà plus vous passer d'emacs, rassurez-vous. Le contenu de la prison est accessible depuis le système principal, donc vous avez cette solution :

[Nom de l'ordinateur]# emacs /usr/jails/Prison1/usr/local/etc/nginx/nginx.conf

nginx.conf est organisé en modules. Les lignes qui précèdent http { forment le core module. Ensuite, il y a le module HTTP, délimité par des accolades, puis des modules optionnels : deuxième site, HTTPS, etc. La syntaxe des différents modules est détaillée dans ce manuel.

Autre fichier essentiel : index.html. C'est lui qui détermine ce que va afficher votre page d'accueil. Voici son contenu actuel :

<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>

Il affiche donc "Welcome to nginx!" :) en noir sur fond blanc. Vous allez bien sûr l'éditer pour créer une page d'accueil un peu plus intéressante. Deux solutions pour ça :

[root@Prison1 ~]# ee /usr/local/www/nginx/index.html

ou alors :

[Nom de l'ordinateur]# emacs /usr/jails/Prison1/usr/local/www/nginx/index.html

Placez les autres fichiers de votre site web dans le même dossier (ou dans des sous-dossiers).

Et voilà, y a plus qu'à...

Il ne vous reste plus qu'à rédiger votre site. C'est un travail assez complexe mais qui n'a rien de spécifique à FreeBSD ou à UNIX. De nombreux tutoriels traitent ce sujet. Vous devrez écrire le code source de votre site à l'aide des langages HTML, CSS, PHP, SQL et utiliser des programmes annexes pour le faire fonctionner, comme un interpréteur PHP et/ou une base de données. Vous pouvez aussi employer des logiciels de gestion de contenu comme Joomla, Drupal ou Django, ou encore un WYSIWYG comme Komposer, tous disponibles via les ports.

Bon séjour en prison ! :p

Découvrez aussi ce cours en...

Exemple de certificat de réussite
Exemple de certificat de réussite