Co je to vlastně jail?
Je to určitě něco, co je specialitou BSD systémů a ve světě Linuxu a Windows nemá přímo odpovídající protějšek.
Velmi jednoduše řečeno by se dal jail dal definovat jako vylepšený chroot. Tak jednoduše se to ale na druhou stranu definovat bohužel nedá. Jail izoluje proces či skupinu procesů na souborovém systému změnou kořenového adresáře, tedy podobně, jako to dělá chroot. Kromě toho ale zcela izoluje proces či skupinu procesů od ostatních procesů mimo jail. Po spuštění jailu tak není možné do něj přidávat procesy, které nejsou potomky nějakého již běžícího procesu v jailu.
Žádný proces běžící v jailu se z něj nemůže dostat k procesům mimo něj ani je nijak ovlivnit. Jail je vytvořen a spouštěn s určitou IP adresou a veškeré služby jsou nuceny používat tuto danou IP adresu. Tato adresa nemůže být zevnitř jailu změněna. Uživatel root nemůže v jailu vytvářet nová zařízení, která nebyla definována při jeho vytvoření či změně. Mezi další omezení jailu patří následující vlastnosti:
- nemožnost měnit spuštěné jádro a nahrávat jaderné moduly
- měnit síťové nastavení
- připojovat nebo /odpojovat souborové systémy
- měnit určité sockety
- měnit superuživatelské příznaky souborů (flags)
- atd.
Jail pracuje vlastně pracuje na podobném principu, jako virtuální stroje. Také by se dalo říct, že využívá principu C/S – klient (jail) + server (hostitel). Systémové změny provedené na hostiteli (hlavní systém) se projeví i v jailu. Změny provedené v jailu jsou platné pouze uvnitř a pouze pro tento daný jail.
K čemu je vlastně takový jail dobrý a vhodný?
Jak již bylo naznačeno výše, může sloužit jako určité zjednodušené virtualizační prostředí. S jeho pomocí je možné uzavřít určitou službu či aplikaci tak, aby v případě jejího pádu, kompromitace nebo jiného závažného problému byl zbytek systému od tohoto uchráněn.
Je možné ho využít k tomu, aby na vlastním systému mohlo běžet minimum služeb a většina z nich byla vyčleněna do jailů. Je zde samozřejmě nutné brát v úvahu možnosti systému (výkon procesoru, množství RAM, místo na disku atd.) a dbát na to, aby běžící jaily příliš nelimitovaly systémové zdroje.
V neposlední řadě bych určitě upozornil na možnost vytváření snapshotů jailu včetně možnosti importu a exportů. Tyto možnosti jsou pak vhodné na zálohování jailů. Je to zajímavější o to víc, že je možné jaily importovat/exportovat včetně případně obsažených uživatelských dat.
Jak založit a provozovat jail?
Jail je možné vytvořit pomocí systémových nástrojů a příkazů systému. Jak již bylo uvedeno výše, je každý jail charakterizován unikátní IP adresou (duplicitní IP adresu systém nepřipustí). Jailu je možné přiřadit i více IP adres podle potřeby. To ale není vše – je zde také definováno jméno jailu (hostname), které je možné využít při jeho kontaktování.
Ve vlastnostech jailu je možné nastavit také způsob jeho spouštění. Je možné jej spouštět ručně pomocí GUI nebo terminálovým příkaze. Je také možné nastavit jeho automatické spuštění při startu hostitelského systému.
Z hostitelského systému je možné přistoupit k jailu pomocí rootovského terminálu nebo využít SSH obvyklým způsobem. Je samozřejmě možné vytvářet a využívat i další jailové uživatele (platí pouze uvnitř jailu).
K souborům a složkám v jailu je také možné se dostat přes souborové manažery hostitelského systému (nutná jsou administrátorská oprávnění).
Dle potřeby je možné samostatně nastavit přístupová práva k jailu pomocí firewallu nezávisle na přístupu k hostitelskému systému. Toto lze kombinovat i s využitím více IP adres pro jeden jail.
Jaily pocházejí původně z FreeBSD. PC-BSD jejich využití doplnilo o administrační aplikaci Warden. Ta je součástí základní instalace a má dvě podoby: GUI nástroj a sadu terminálových příkazů. Vytvoření jailu je poměrně jednoduché a pro ještě větší názornost si to ukážeme na dvou konkrétních příkladech. Dva jsou zvoleny z toho důvodu, abych ukázal možnosti jak GUI nástroje, tak CLI příkazů. Cely systém Warden je totiž součástí TrueOS, a proto se může sestava CLI příkazů hodit pro serverové nasazení.
V prvním příkladu bude vytvořen jail sloužící k provoz MySQL serveru (konkrétně se bude jednat o server Percona). Zde se hned objevuje další výhoda využití jailů – je možné s jejich pomocí využívat různé aplikace, verze či data bez toho, aby byl ovlivněn vlastní hostitelský systém či ostatní jaily.
Jailu bude přiřazena IP adresa x.x.x.100, hostname bude mysql a nebude se nastavovat jeho automatické spouštění. Jail bude vytvořen pomocí GUI nástroje.
GUI pro Warden se nachází v hlavním menu (položka Systém) nebo v PC-BSD Ovládacích panelech (oddíl Nástroje). Při jeho spuštění je nutné zadat heslo administrátora – viz obrázek.
Po jeho zadání se objeví hlavní okno aplikace.
Jak je z něj patrné, moc možností se nám zatím nenabízí. Je to logické, protože žádný jail není dosud vytvořen a tak není co administrovat. Proto využijeme velké zelené tlačítko plus pod oknem s přehledem jailů (nebo menu File → New Jail) a náš ukázkový vytvoříme. Jako první se objeví formulář pro nastavení hostname (defaultně je to Jailbird) a možnost nastavení IPv4 a/nebo IPv6 adresy. Konečné nastavení je na dalším obrázku.
Dalším krokem je volba typu jailu – viz následující obrázek. Jsou k dispozici tři základní typy – tradiční, který instaluje minimální systém, odpovídající TrueOS. Je zde možnost volby instalace balíčkovacího systému PKGNG a utilit PC-BSD. Pokud by se jejich instalace nepovolila, bude systém odpovídat serveru FreeBSD.
Druhou možností je Ports jail, který umožní jailu využívat systémové prostředky a prostředí hostitele a spouštět grafické aplikace.
Poslední možností je pak Linux Jail. Jak název napovídá, umožní spustit vybrané linuxové distribuce. Ty jsou v současné době k dispozici pouze dvě – Debian 6 a Gentoo.
Vzhledem k předpokládanému využití jailu volíme tradiční typ a necháváme volbu pro instalaci PKGNG a doplňků PC-BSD. Jak je vidět na dalším obrázku, je nutné zadat administrátorské heslo root uživatele jailu.
V dalším kroku se objeví možnosti na automatickou instalaci zdrojových kódů systému, systému portů a spuštění jailu při startu hostitelského systému.
Pro naše účely není nutná ani jedna volba, proto se pokračuje dál s výchozím nastavením. Pak se zahájí stahování a instalace všech potřebných součástí jailu.
Proti očekávání ale operace nedopadla vůbec dobře a skončila chybou.
Musím přiznat, že mne to hodně nemile překvapilo. Ale nelenil jsem a zadal chybovou hlášku do Google. Jediné, co jsem našel, tak byl, bohužel, nezodpovězený dotaz na to samé. Jediné, co se k tomu trochu vztahovalo, byly úpravy skriptů pro distribuci FreeNAS. Takže nezbylo, než se poohlédnout po nich a také po systému. První problém jsem viděl v tom, že při tvorbě jailu se založí příslušný adresář (dataset), který má ale nesprávný přípojný bod.
Bylo tedy nutné hledat cestu k tomu, jak nastavení přípojného bodu ovlivnit. Po dalším hledání jsem zjistil, že příslušné funkce se nacházejí v souboru /usr/local/share/warden/scripts/backend/functions.sh
.
Ten má skoro tisíc řádků a bylo nutné najít ten správný, který problém vytváří. Bylo třeba vyhledat chybovou hlášku – ta správná se nachází na řádku 166. Příslušný příkaz je pak na řádku 161 a původně vypadá takto:
zfs create -o
mountpoint=/${tank}${zfsp} -p ${tank}${zfsp}
Změna byla pak už jednoduchá:
zfs create -o
mountpoint=${zfsp} -p ${tank}${zfsp}
Úspěšný výsledek je vidět na dalším obrázku.
Nově vytvořený jail se objeví v přehledu a jsou již k dispozici podrobnější údaje a možnosti jeho administrace.
Na dalším obrázku je vidět výstup z příkazu zfs
list
, kde jsou vidět jasné rozdíly proti obrázku nahoře.
Na dalším obrázku je pak vidět vlastní struktura vytvořeného jailu. Jak je zde patrné, je to opravdu „základní systém“ pro běh TrueOS.
Nyní se vrátím o dva obrázky zpět. Tam je v přehledu v horním okně viditelný nový jail, který ale neběží. Je samozřejmě možné vytvořil další jail nebo vybraný jail smazat pomocí tlačítek vlevo po oknem (Plus/Mínus). Tlačítky vlevo pod oknem je možné jail spustit (či nastartovat) a nebo upravit jeho nastavení – viz další obrázky.
Ve spodní části formuláře jsou tři záložky. První z nich je Info – informace o jailu: typ, velikost na disku a nastavení automatického spouštění).
Druhou záložkou je Tools.
Zde jsou k dispozici následující volby či možnosti:
Package manager – manažer systémových balíčků. Jeho funkce jsem zatím nezkoumal a není mi úplně jasná…
User Administrator – administrace uživatelů jailu. Zde je možné měnit heslo pro roota a nastavovat další uživatele, skupiny a jejich práva k jailu.
Service Manager – správce služeb. Asi není co dodávat.
Launch Terminal – je funkční jenom pro spuštěný jail. Otevře rootovský terminál pro přístup k jailu.
Check for Updates – manažer aktualizací. Vzhledem k návaznosti jailu na systém hostitele má smysl aktualizace spouštět pouze tehdy, pokud jsou nějaké k dispozici v hostitelském systému.
Export Jail – exportuje jail jako soubor s příponou .wdn na vybrané místo.
Třetí záložkou je Snapshots. Jak již název a obrázek napovídají, jedná se o systém administrace jailoých snapshotů. Možnosti jsou velmi rozsáhlé včetně vytváření a mazání snapshotů, možnosti připojení vybraného snapshotu (návrat do minulých stavů) a nastavení periodického vytváření snapshotů.
Jako obvykle je vytvoření snapshotu velmi rychlé a snapshot nezabírá moc místa na disku (jedná se většinou pouze o linky do jailu). Kromě uvedených možností jsou k dispozici ještě rozsáhlejší CLI příkazy, kde je možné vytvářet i klony jailu nebo vybraného snapshotu a pracovat s nimi podle potřeby.
Změny po vytvoření snapshotů jsou vidět na posledním obrázku. Přehled o nich lze získat i z terminálu:
$ sudo warden zfslistsnap mysql Password: 2013-06-03-19-28-48 2013-06-03-19-31-47
Nyní se ale nebudeme snapshoty dále zabývat. Jail je totiž vytvořený a připravený na první spuštění. To lze udělat z GUI Warden nebo pomocí terminálového příkazu. Jail není nastaven na automatické spuštění, takže se musí startovat a zastavovat ručně pomocí uvedených dvou možností.
Jakmile je jail spuštěný, je možné se k němu připojit pomocí terminálu buď před GUI Warden nebo pomocí příkazu. Je to stejné, jako kdyby byl root připojený přímo k terminálu jailového OS, a může provádět všechny potřebné operace.
V příštím dílu si ukážeme vytvoření a administraci jailu pomocí terminálových příkazů a ukážeme si zprovoznění a využití služeb, které v něm běží.