Chodí mi dotazy, zda lze jaily provozovat i jinak, než kompilací ze zdrojového kódu. Odpověď je ano a je to dokonce o mnoho jednodušší. V tomto článku si ukážeme přípravu a instalaci služeb do jailu bez jediné kompilace a budeme ovládat služby jailu přímo z prostředí hostitelského OS.

Příprava jailu

Vytvoříme si ZFS dataset pro Jail. Toto není nutná podmínka pro běh jailu, lze jej mít v libovolném adresáři. Datasety mají výhodu v podobě snadné tvorby snapshotů pro zálohování, rollback, send; dále se hodí nastavení kvót na velikost apod.

zfs create tank/jails/testing

A nainstalujeme do něj minimální systém:

bsdinstall jail /tank/jails/testing

Prostředí bsdinstall, na rozdíl třeba od debootstrap, je interaktivní a vyžaduje uživatelský vstup (lze jej ale řídit speciálním skriptem, viz man bsdinstall).

  • Vybereme komponenty, pro minimální instalaci lze nechat prázdné:

Obrázek: Výběr komponent

  • Stáhne a nainstaluje se nám base systém:

Obrázek: Instalace base systému

  • Následuje dotaz na heslo roota (na řádce).
  • A výběr služeb. Pokud budeme používat jen místní přístup z hostitelského OS, nemusíme spouštět ani sshd:

Obrázek: Výběr služeb

  • Další uživatele nemusíme přidávat:

Obrázek: Přidání dalších uživatelů

A tím je instalace minimálního jailu hotova.

Nastavení jailu

Jail musíme nakonfigurovat v souboru /etc/jail.conf. Tento úkon můžeme udělat klidně během čekání na stažení a rozbalení base systému, viz předchozí krok.

Ukázka minimální konfigurace:

exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;

# Interface sítě, kam chceme jaily připojit.
interface = em0;

# Cesta k jailům.
path = /tank/jails/$name;

# Definice jednotlivých jailů
testing {
    host.hostname = testing.example.com;
    ip4.addr = 192.168.42.88;
}
  • Jail můžeme rovnou spustit. Pokud jsme nainstalovali sshd (a přidali uživatele), můžeme se na něj rovnou připojit ze sítě.
service jail start testing
  • Pokud chceme jail automaticky startovat po bootu hostitelského systému, tak jej přidáme do /etc/rc.conf, řádek:
# Space separated list of jails.
jail_list="cache proxy backup gitea ttrss pg testing"

Ovládání jailů

Jaily spouštíme / restartujeme / ukončujeme pomocí:

  • service jail start jailname
  • service jail restart jailname
  • service jail stop jailname

Můžeme uvést více jmen současně.

Běžící jaily vypíšeme pomocí service jail status nebo zkráceně pomocí jls.

Pokud chceme jen obyčejný jail s minimálním systémem, tak zde naše práce končí. Přihlašte se do něj na ssh a používejte jej jako kterýkoliv jiný stroj na síti.

Následující text ukazuje pokročilejší techniky pro adminy jak lze ovládat jaily z prostředí hostitele, instalovat v nich balíčky a ovládat služby.


Instalace balíčků a ovládání služeb z prostředí hostitele

Do běžícího jailu můžeme přímo z hostitele instalovat balíčky.

Pomocí parametru pkg -j určíme jail. Tento parametr sdílí mnoho systémových programů. Například pomocí top -J testing zobrazíme procesy jen daného jailu.

Ano, není to moc didaktické, -j slouží pro zobrazení čísla jailu, zatímco -J pro filtraci. Man je váš kamarád.

  • Z hostitele můžeme snadno nainstalovat balíčky:
pkg -j testing install -y bash vim-tiny mc
  • Dokonce i ovládat služby:
pkg -j testing install -y nginx
sysrc -j testing nginx_enable="YES"

service -j testing nginx start

Pomocí příkazu sysrc jsme nastavili rc.conf v jailu, pomocí service spustili službu.

Ano, pochopitelně služba potřebuje nastavit, takže musíme zasahovat do souborů v jailu. A to buď ručně, nebo pomocí ansible / puppet / chef apod. Můžeme také využít toho, že FS jailu je přímo dostupný z hostitele, takže můžeme rovnou upravit konfigurační soubory nainstalovaných služeb. Možností je mnoho.

Spouštění příkazů v jailu z prostředí hostitele

Pomocí příkazu jexec -l jailname můžeme buď přistoupit do jailu, tedy na jeho shell (tj. pokud chceme pouze lokální přistup z hostitele, tak nemusíme instalovat sshd do jailu) nebo můžeme spustit libovolný příkaz.

  • Přístup na shell jailu:
jexec -l testing
  • Spustí příkaz df -h v jailu testing:
jexec -l testing df -h

Filesystem            Size    Used   Avail Capacity  Mounted on
tank/jails/testing    2.0G    726M    1.3G    35%    /

Tato ukázka zde není náhodou, vidíme, že jail skutečně vidí jen na svůj FS. Pomocí ZFS kvót můžeme omezit místo na datasetu pro konkrétní jail (v tomto případě na 2GB) a mít tak jistotu, že služby v jailu nesežerou celé místo na disku.

Tímto způsobem můžeme jail skutečně řídit. Můžeme si vložit skript např. do /tank/jails/testing/root/bin a volat jej jednoduše pomocí:

jexec -l testing /root/bin/manage.sh

nebo zvolit jiné nástroje (přímo v man bsdinstall je ukázka instalace minimálního systému s sshd a puppet).

Update base systému jailu

Toto je jediná operace, kterou musíme provádět z prostředí hostitele. Zatímco vše předchozí lze pochopitelně dělat normálně v jailu (pkg, service, úprava systémových konfigů), tedy můžeme někomu dát právo roota, aby si OS v jailu spravoval sám, tak update base systému zkrátka musíme dělat z prostředí hostitele. Důvodů je víc, jedním ze základních je nemožnost nastavovat FS flagy souborům v prostředí jailu.

Jail má některá omezení daná tím, že se nejedená o plnou virtualizaci, v jailu například nemůžeme mountovat fs, nemůžeme nastavovat parametry kernelu, firewall apod.

  • Průběžný update base systému jailu (nemusíme pokaždé restartovat jail, záleží na konkrétním update, zda se jedná o kritické služby):
freebsd-update -b /tank/jails/testing fetch install

service jail restart testing
  • Povýšení base systému na vyšší verzi. Tuto operaci provedeme až po upgrade OS hostitelského systému.
freebsd-update -b /tank/jails/testing --currently-running 12.0-RELEASE -r 12.1-RELEASE upgrade
freebsd-update -b /tank/jails/testing install

service jail restart testing

freebsd-update -b /tank/jails/testing install

pkg -j testing upgrade -f
service jail restart testing

Tedy zcela stejně, jako upgradujeme FreeBSD na hostiteli.


Tento článek vychází z oficiální dokumentace FreeBSD, zejména: Creating and Controlling Jails a Fine Tuning and Administration.