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