FreeBSD Jaily pomocí balíčků
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é:

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

- 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:

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

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 jailnameservice jail restart jailnameservice 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é,
-jslouží pro zobrazení čísla jailu, zatímco-Jpro 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 -hv 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.