Translation(s): English - Français

Debian > Debian GNU > Debian GNU/kFreeBSD > Jails


Wheezy

Un système Debian GNU/kFreeBSD complet devrait fonctionner dans un environnement jail, sur un système hôte GNU/kFreeBSD ou FreeBSD, avec quelques limitations.

Les environnements Jails fonctionnent beaucoup comme OpenVZ. Sur l'hôte, vous pouvez voir tous les processus en cours d'exécution dans tous les environnements. À l'intérieur d'un environnement jail, vous pouvez seulement voir les processus exécutés dans cet environnement.

Limitations

Sachez que certains fichiers dans /proc ou /sys, tel que /proc/mounts, n'ont pas d'espace de noms par environnement jail, ce qui peut entraîner la perte d'informations (en lecture seule) sur l'hôte ou les points de montage d'autres invités.

Certaines fonctionnalités tel que sysvipc partage un unique espace de nom avec l'hôte et les autres environnements jails, ainsi pour des raisons de sécurité, elles sont désactivées par défaut. faqueroot requiert l'activation. L'exécution de plusieurs instances de postgresql-server dans un espace de nom sysvipc partagé serait conflictuelle, et normalement ne fonctionnerait pas.

La fonctionnalité raw_sockets est normalement désactivée, pour prévenir l'usurpation d'IP depuis l'intérieur de l'environnement jail. En conséquence, l'outil ping ne fonctionnera pas correctement.

Création d'un nouvel environnement jail

JID=101
MIRROR="http://http.debian.net/debian"

debootstrap \
 --exclude=devd,dmidecode,isc-dhcp-client,isc-dhcp-common,kldutils,pf,vidcontrol \
 wheezy /srv/jail/$JID "$MIRROR"

HOSTNAME=jail$JID.example.com
IP=10.1.0.$JID

echo "$HOSTNAME" > /srv/jail/$JID/etc/hostname
echo "$IP $HOSTNAME" >> /srv/jail/$JID/etc/hosts

L'option --exclude de debootstrap liste certains des paquets qui ne sont probablement pas utilisés dans l'environnement jail. Typiquement, le paquet devd ne fonctionnement pas dans une jail.

Assurez-vous que le fichier /etc/resolv.conf de l'environnement jail soit adapté. Si un résolveur DNS fonctionne sur le système hôte, vous devez le référencer par l'adresse IP unicast (public ou privée), tel que "nameserver 10.1.0.1" au lieu de "nameserver 127.0.0.1".

L'environnement jail n'a pas d'interface de bouclage à moins que vous en créez une.

Démarrer ou arrêter une jail

/!\ ATTENTION : Les versions antérieures de cette page Wiki n'expliquaient pas la configuration nécessaire de devfs pour restreindre l'ensemble des périphériques dans /dev. Voir les avis à-propos d'une issue similaire sur http://security.freebsd.org/advisories/FreeBSD-SA-14:07.devfs.asc

TODO: FreeBSD configure, en amont au démarrage, un jeu de 4 règles restreintes, adaptées aux environnements jails. Ce n'est pas encore packagé pour Debian GNU/kFreeBSD mais vous pouvez l'initialiser manuellement ; il vous suffit de le faire une fois par démarrage du système hôte (et non pas pour chaque création d'un environnement jail).

while read RULE ; do devfs rule -s 4 add $RULE ; done <<EOF
hide
path log unhide
path null unhide
path zero unhide
path full unhide
path crypto unhide
path random unhide
path urandom unhide
path ptyp* unhide
path ptyq* unhide
path ptyr* unhide
path ptys* unhide
path ptyP* unhide
path ptyQ* unhide
path ptyR* unhide
path ptyS* unhide
path ptyl* unhide
path ptym* unhide
path ptyn* unhide
path ptyo* unhide
path ptyL* unhide
path ptyM* unhide
path ptyN* unhide
path ptyO* unhide
path ttyp* unhide
path ttyq* unhide
path ttyr* unhide
path ttys* unhide
path ttyP* unhide
path ttyQ* unhide
path ttyR* unhide
path ttyS* unhide
path ttyl* unhide
path ttym* unhide
path ttyn* unhide
path ttyo* unhide
path ttyL* unhide
path ttyM* unhide
path ttyN* unhide
path ttyO* unhide
path ptmx unhide
path pts unhide
path pts/* unhide
path fd unhide
path fd/* unhide
path stdin unhide
path stdout unhide
path stderr unhide
path ptyp* unhide user root group root
EOF

FIXME: ce jeu de règles devfs casse la méthode d'allocation PTY utilisée par les chroots sous Wheezy ; les connexions ssh avertiront d'un message "PTY allocation request failed on channel 0", n'auront pas d'invite shell, et auront d'autres problèmes. Cette règle supplémentaire semble résoudre le problème (sans aucune idée du pourquoi, et sans savoir si cela est sécurisé) :

path pt* unhide

Les chroots Sid et Jessie n'ont pas besoin de cela - ils utilisent une nouvelle méthode d'allocation pty qui n'est pas affectée.

En supposant qu'une installation de debootstrap existe déjà dans /srv/jail/$JID/, voici une exemple de comment la démarrer à l'intérieur d'une jail :

JID=101

# Special filesystems are mounted, and specific device nodes made visible
# in /dev, almost matching the container specification of Linux:
# http://sources.debian.net/src/runc/0.0.4~dfsg-1/libcontainer/SPEC.md/?hl=70#L47

# Linux-like /proc and /sys filesystems
mount -t linprocfs none /srv/jail/$JID/proc
mount -t linsysfs none /srv/jail/$JID/sys
  
# Ramdisk required for /run
mount -t tmpfs none /srv/jail/$JID/run
  
# A read-only /dev filesystem with restricted set of devices
mount -t devfs none /srv/jail/$JID/dev
mount -t fdescfs none /srv/jail/$JID/dev/fd
# :XXX: ruleset 4 must be initialised as explained earlier in this Wiki page
devfs -m /srv/jail/$JID/dev rule -s 4 applyset
# Ensure the jail has the expected devices
for DEVICE in null zero full random urandom tty pts ptmx shm fd stdin stdout stderr
do if [ ! -e /srv/jail/$JID/dev/$DEVICE ]
    then
        echo "error: device '/dev/$DEVICE' MUST be available in the jail"
        exit 1
    fi
done
# Ensure the jail only has a restricted set of devices
for DEVICE in mem kmem
do if [ -e /srv/jail/$JID/dev/$DEVICE ]
    then
        echo "error: device '/dev/$DEVICE' MUST NOT be available in the jail"
        exit 1
    fi
done

# Compatibility symlink from /dev/shm to /run/shm
ln -s /run/shm /srv/jail/$JID/dev/
  
# Optionally enable networking
HOSTNAME=jail$JID.example.com
# :XXX: this IP address *must* be assigned to one of the host's interfaces before the guest can use it
IP=10.1.0.$JID

mkdir -p /var/run/jail
jail -J /var/run/jail/$JID.jid -c jid=$JID \
  name=jail$JID \
  path=/srv/jail/$JID \
  host.hostname=$HOSTNAME \
  ip4.addr=$IP \
  allow.sysvipc=0 \
  allow.raw_sockets=0 \
  command=/bin/sh -- -c "/etc/init.d/rc S && /etc/init.d/rc 2"

TODO: "rc S" n'est peut-être pas nécessaire, car la plupart des réglages sont déjà effectués avant d'entrer dans l'environnement jail. Il est possible qu'openrc ou un autre système d’initialisation puisse être utilisé comme alternative aux scripts sysv-rc.

Vous souhaiterez peut-être installer et configurer les paramètres régionaux lors du premier démarrage :

apt-get install locales
dpkg-reconfigure locales

Si openssh-server est installé à l'intérieur de l'environnement jail, vous devriez être capable de vous connecter en SSH, tout comme si c'était un serveur virtuel privé.

jls (pour lister les environnements jails) n'est pas encore disponible. 709225

jexec n'est pas encore disponible, mais vous pouvez probablement l'obtenir par :

# jail -m jid=$JID command=/bin/bash
# cd

Un environnement jail s'arrête quand tous les processus internes sont terminés. (Dans l'environnement, la commande /etc/init.d/rc 0 ; exec kill -1 peut être une manière de forcer un arrêt ?)

Squeeze

Le paquet libjail n'est pas distribué avec Squeeze. La fonctionnalité du noyau existe depuis FreeBSD 4.x, donc elle peut fonctionner si vous pouvez créer les outils utilisateur nécessaires.