module

Beryl::Jail

Génération de jails FreeBSD « thin » en RAW jail.conf (zéro dépendance) : une appli web = une jail, base FreeBSD PARTAGÉ monté en lecture seule (nullfs RO) + couche rw propre à l'appli (/etc, /var, /home, /usr/local…). Depuis l'intérieur, ../ ne sort pas de la jail → une appli compromise ne peut pas lire les secrets d'une autre appli ni du host.

Ce module ne contient QUE les générateurs PURS (testables sans FreeBSD) : contenu du jail.conf.d/<nom>.conf, du fstab nullfs, et l'allocation IP. La partie impérative (build du base, montages, start) vit dans la primitive jail-create.

Constants

RO_DIRS = ["bin", "sbin", "lib", "libexec", "rescue", "usr/bin", "usr/sbin", "usr/lib", "usr/libexec", "usr/libdata", "usr/share", "usr/include"] of ::String

Répertoires du base montés en LECTURE SEULE (nullfs) dans chaque thin jail. Tout le reste (/etc, /var, /tmp, /root, /home, /usr/local, /dev…) est rw et propre à la jail. rescue = binaires de secours statiques.

RW_DIRS = ["etc", "var", "tmp", "root", "home", "usr/local", "dev", "proc"] of ::String

Répertoires rw créés dans le dataset de la jail (skeleton). /usr/local et /home reçoivent l'appli ; /etc et /var sont peuplés depuis le base.

Class methods

base_install_script(base_path : String) : String

Script (sh) qui build/rafraîchit le BASE PARTAGÉ d'une thin jail via pkgbase (pkg --rootdir), réutilisable pour PATCHER le base (re-run = upgrade). Mirroir d'install-pkgbase.sh : ABI + clés depuis le host. Au re-run, pkg install -U met à jour → toutes les jails (nullfs RO) suivent après redémarrage. PUR (renvoie le script) → testable.

Source
jail_conf(name : String, ip : String, path : String) : String

Contenu de /etc/jail.conf.d/<name>.conf. path = racine de la jail, ip = alias loopback. sshd/services internes via /bin/sh /etc/rc.

Source
loopback_ip(index : Int32) : String

IP loopback dédiée à une jail (sur l'interface lo1). index 1..254.

Source
nginx_proxy(server_name : String, ip : String, port : Int32) : String

Bloc nginx (host) qui reverse-proxy server_name vers la jail (loopback). TLS géré séparément (recettes nginx/acme). PUR → testable.

Source
skeleton_script(jail_path : String, base_path : String, ro_dirs : Array(String) = RO_DIRS, rw_dirs : Array(String) = RW_DIRS) : String

Script shell (sh) qui crée le SKELETON rw d'une thin jail : répertoires rw

  • points de montage RO (vides, pour les nullfs), /etc et /var peuplés depuis le base, lo1 cloné, jail_enable. Idempotent (mkdir -p, sysrc -q). PUR (renvoie le script) → testable ; exécuté par la primitive jail-create.
Source
thin_fstab(jail_path : String, base_path : String, ro_dirs : Array(String) = RO_DIRS) : String

Contenu du fstab nullfs (<path>.fstab) : monte chaque RO_DIR du base en lecture seule dans la jail. Aligné en colonnes pour rester lisible.

Source
valid_name?(name : String) : Bool

Validation d'un nom de jail (= nom d'appli/d'user) : minuscules, chiffres, tirets/underscores. Évite l'injection dans jail.conf / les chemins.

Source