FreeBSD : jail avec ezjail

Bonjour à tous,

Aujourd'hui, un petit billet sur l'utilisation de jail sous FreeBSD via ezjail (sans le support de VIMAGE qui nécessite la recompilation du kernel).

L'utilisation de VIMAGE permet de passer directement une interface à une jail en la rendant invisible à l'hôte. Ce dernier ne peut donc plus avoir accès au traffic réseau de la jail.
Dans mon cas ici, pour aller au plus rapide je ne l'utilise pas.

Avant de lancer la création d'une jail, il faut lui créer son interface réseau de loopback. Pour cela, nous allons travailler dans le fichier /etc/rc.conf.local pour ne pas polluer le fichier principal.

Pour ajouter simplement une interface :

root@perso:~ # sysrc -f /etc/rc.conf.local cloned_interfaces="lo1"

Pour rajouter une nouvelle interface à la liste, pour une deuxième jail par exemple :

root@perso:~ # sysrc -f /etc/rc.conf.local cloned_interfaces+="lo2"

Pour retirer une interface spécifique de cette liste :

root@perso:~ # sysrc -f /etc/rc.conf.local cloned_interfaces-="lo2"

Pour que le ou les interfaces lo soient crées, il faut passer cette commande :

root@perso:~ # service netif cloneup

Cette commande doit être relancée après l'ajout d'une nouvelle interface lo à la liste.

Après une suppression de jail, il est possible de supprimer son interface lo via cette commande :

root@perso:~ # ifconfig lo2 destroy

Nous passons maintenant à ezjail à proprement parler qui permet de générer et gérer les jails :

root@perso:~ # pkg install ezjail
root@perso:~ # sysrc -f /etc/rc.conf.local ezjail_enable="YES"
root@perso:~ # service ezjail start

Il est conseillé de ne pas avoir de service qui écoute sur 0.0.0.0 ou * afin de ne pas risquer une intéraction avec les jails.

Avec la configuration par défaut, les jails sont stockées dans /usr/jails. Dans mon cas, j'ai choisi de déplacer le stockage des jails sur un montage dédié.
Pour cela il faut éditer le fichier /usr/local/etc/ezjail.conf :

# Location of jail root directories
#
# Note: If you have spread your jails to multiple locations, use softlinks
# to collect them in this directory
ezjail_jaildir=/mnt/perso/jails

# Location of the tiny skeleton jail template
ezjail_jailtemplate=${ezjail_jaildir}/newjail

# Location of the huge base jail
ezjail_jailbase=${ezjail_jaildir}/basejail

Il est nécessaire de créer une base de référence pour les jails :

root@perso:~ # ezjail-admin install -p

Deux options sont utilisées :

  • install : créer le template des jails à partir de la version de l'hôte
  • option -p : créer le template depuis les ports

Cela crée une base d'installation par rapport à la version de FreeBSD installé, dans mon cas FreeBSD 11.1-p9.

Il est possible d'appliqur une customisation lors du déploiement d'une jail. Pour cela, il faut modifier le template newjail qui est toujours appliqué :
/mnt/perso/jails/newjail

Il s'agit ni plus ni moins que d'une installation de FreeBSD la plus basique.

Par exemple, j'ai rajouté dans ce répertoire /etc le fichier resolv.conf qui n'est pas créé de base lors du déploiement d'une jail.

J'ai fais la même modification pour que de base les jails utilisent mon repository pour pkg.

Il est possible exécuter un script à chaque déploiement de jail pour parfaire la configuration.

J'ai créé un dossier /mnt/perso/jails/flavours/basicalConf dans lequel j'ai mis ce script ezjail.flavour :

#!/bin/sh
. /etc/rc.subr

# Vars
local_ip=$(ifconfig vtnet0 | grep inet | cut -d" " -f2)
local_user=""

# Users
########
#
# To generate a password hash for use here, do:
# openssl passwd -1 "the password"
pw groupadd sudo
for user in ${local_user}; do
        pw useradd ${local_user}
        # il faut insérer le password généré avec la commande openssl au dessus
        echo -n '' | pw mod user ${local_user} -H 0
        pw usermod ${user} -G "wheel,sudo"
done

pw mod user root -w no

# create symlink to /usr/home in / (adduser defaults to /usr/username as homedir)
ln -s /usr/home /home

# configure ssh server
sed -i '' "s/#IPADDRESS/${local_ip}/g" /etc/ssh/sshd_config
service sshd restart

# Accepte le message qui indique que pkg n'est pas installé
env ASSUME_ALWAYS_YES=YES pkg bootstrap
pkg install -y pkg
pkg install -y python36 bash tmux nano sudo

#change shell to bash
for user in ${local_user}; do
    chsh -s bash ${user}
done

sed -i '' 's/# %sudo/%sudo/g' /usr/local/etc/sudoers

#update /etc/aliases
echo "root:   moi@mondd.fr" >> /etc/aliases
newaliases

rm -f "/etc/rc.d/ezjail.flavour"

Ce script réalise les actions suivantes :

  • Récupère l'adresse IP de l'interface principale
  • Défini les utilisateurs à créer
  • Ajoute le groupe sudo
  • Crée les utilisateurs définis et les ajoutes dans le groupe sudo
  • Supprime le password root
  • Crée le lien symbolique pour les dossiers home
  • Fais écouter le daemon ssh sur l'adresse IP de la jail
  • Installe pkg/python36/bash/tmux/nano/sudo
  • Change le shell des utilisateurs déclarés
  • Active le groupe sudo dans le fichier sudoers
  • Ajoute une adresse mail aux aliases et les regénères
  • S'auto supprime.

Il ne reste plus qu'à créer la jail :

root@perso:~ # ezjail-admin create irc 'lo1|127.0.1.1,vtnet0|172.16.55.32'

Il faut faire attention à plusieurs choses :

  • changer le numéro de l'interface lo
  • changer l'adresse ip de l'interface lo
  • utiliser le nom de l'interface réseau sur laquelle on souhaite binder la jail
  • adapter l'adresse IP

Une fois la jail créée, on vérifie qu'elle est bien présente :

root@perso:~ # ezjail-admin list
STA JID  IP              Hostname                       Root Directory
--- ---- --------------- ------------------------------ ------------------------
DR  3    127.0.1.2       irc                            /mnt/perso/jails/irc
    3    vtnet0|172.16.55.32

Il ne reste qu'à démarrer la jail et se connecter dedans :

root@perso:~ # ezjail-admin start irc
root@perso:~ # ezjail-admin console irc

Pour sortir de la jail, taper dans la console exit.

La base des jails peut être mise à jour via cette commande :

root@perso:~ # ezjail-admin update -u

Il faut avoir son hôte à jour avant car elle reprend sa version comme lors de la création.

Vous pouvez maintenant profiter des jails!

Have a nice day.