<?xml version="1.0" encoding="iso-8859-1"?> <!-- The FreeBSD Dutch Documentation Project $FreeBSD$ %SOURCE% en_US.ISO8859-1/books/handbook/jails/chapter.xml %SRCID% 40900 --> <chapter id="jails"> <chapterinfo> <authorgroup> <author> <firstname>Matteo</firstname> <surname>Riondato</surname> <contrib>Bijgedragen door </contrib> </author> </authorgroup> <authorgroup> <author> <firstname>Remko</firstname> <surname>Lodder</surname> <contrib>Vertaald door </contrib> </author> </authorgroup> </chapterinfo> <title>Jails</title> <indexterm><primary>jails</primary></indexterm> <sect1 id="jails-synopsis"> <title>Overzicht</title> <para>Dit hoofdstuk levert een uitleg van wat &os; jails zijn en hoe ze gebruikt kunnen worden. Jails, soms ook wel bekend als een verbeterde vervanging van <emphasis>chroot omgevingen</emphasis>, zijn een erg krachtige tool voor systeem beheerders, maar het standaard gedrag kan ook interessant zijn voor gevorderde gebruikers.</para> <important> <para>Jails zijn een krachtig gereedschap, maar zijn geen zilveren kogel qua beveiliging. Hoewel het belangrijk is om op te merken dat het onmogelijk is voor een gevangen proces om zelf te ontsnappen, zijn er verschillende manieren waarop een ongeprivilegieerde gebruiker buiten een jail kan samenwerken met een geprivilegieerde gebruiker binnen de jail en daarmee verhoogde privileges kan krijgen in de gastheeromgeving.</para> <para>De meeste van deze aanvallen kunnen worden voorkomen door ervoor te zorgen dat de jail-root niet beschikbaar is voor ongeprivilegieerde gebruikers binnen de gastheeromgeving. Buiten dat geldt als algemene regel dat onvertrouwde gebruikers met geprivilegieerde toegang tot een jail geen toegang tot de gastheeromgeving moet worden gegeven.</para> </important> <para>Na het lezen van dit hoofdstuk weet de lezer:</para> <itemizedlist> <listitem> <para>Wat een jail is, en welk doel het kan dienen in een &os; installatie.</para> </listitem> <listitem> <para>Hoe men een jail opbouwt, start en stopt.</para> </listitem> <listitem> <para>De basis over jail beheer, zowel van binnen in de jail, als van buitenaf.</para> </listitem> </itemizedlist> <para>Andere bronnen met nuttige informatie over jails zijn:</para> <itemizedlist> <listitem> <para>De &man.jail.8; handleiding. Hier kan de volledige referentie gevonden worden van het <command>jail</command> commando — de administratieve tool die in &os; gebruikt kan worden om &os; jails mee te beheren, te starten en te stoppen.</para> </listitem> <listitem> <para>De mailinglijsten en de archieven hiervan. De archieven van de &a.questions; en andere mailing lijsten die gehost worden door de &a.mailman.lists; bevatten reeds een rijke bron van informatie over jails. Het zou altijd aantrekkelijk moeten zijn om informatie in de archieven te zoeken, of een nieuwe vraag stellen aan de &a.questions.name; mailinglijst.</para> </listitem> </itemizedlist> </sect1> <sect1 id="jails-terms"> <title>Termen en begrippen van jails</title> <para>Om een beter begrip te geven over de onderdelen van &os; die gerelateerd zijn aan jails, de werking ervan, en hoe ze omgaan met de rest van &os; worden de volgende termen gebruikt in het hoofdstuk:</para> <variablelist> <varlistentry> <term>&man.chroot.8; (commando)</term> <listitem> <para>Hulpmiddel dat de systeemaanroep &man.chroot.2; van &os; gebruikt om de rootmap van een proces en alle afstammelingen te veranderen.</para> </listitem> </varlistentry> <varlistentry> <term>&man.chroot.2; (omgeving)</term> <listitem> <para>Een omgeving van processen die draaien in een <quote>chroot</quote>. Dit is inclusief bronnen die gebruikt worden, zoals bijvoorbeeld het gedeelte van het bestandssysteem dat zichtbaar is, de gebruiker en groep ID's welke beschikbaar zijn, netwerkkaarten en andere IPC-mechanismes, etcetera.</para> </listitem> </varlistentry> <varlistentry> <term>&man.jail.8; (commando)</term> <listitem> <para>De systeem utility die het mogelijk maakt om processen binnenin een jail te starten.</para> </listitem> </varlistentry> <varlistentry> <term>host (systeem, processen, gebruiker, etc.)</term> <listitem> <para>Het controlerende systeem van een jail omgeving. Het host systeem heeft toegang tot alle beschikbare hardware bronnen en kan processen controleren zowel buiten als binnenin een jail. ��n van de belangrijkste verschillen van het host systeem met een jail zijn de limitaties die van toepassing zijn op super-gebruiker processen binnenin een jail, niet geforceerd worden voor processen in het host systeem.</para> </listitem> </varlistentry> <varlistentry> <term>hosted (systeem, processen, gebruiker, etc.)</term> <listitem> <para>Een proces, gebruiker, of andere entiteit wiens toegang tot bronnen is gelimiteerd door een &os; jail.</para> </listitem> </varlistentry> </variablelist> </sect1> <sect1 id="jails-intro"> <title>Introductie</title> <para>Omdat systeem beheer een complexe en enorme taak is, zijn er vele sterke tools ontwikkeld om het leven van een systeem beheerder makkelijker te maken. Deze tools leveren meestal verbeteringen op de manier waarop systemen worden ge�nstalleerd, geconfigureerd en onderhouden. Een deel van de taken waarvan verwacht wordt dat die uitgevoerd wordt door de systeem beheerder is het goed configureren van de beveiliging van een systeem, zodat het kan blijven doorgaan met het serveren van de taak, zonder dat er beveiligingsproblemen optreden.</para> <para>��n van de tools welke gebruikt kan worden om de beveiliging van een &os; systeem te verbeteren zijn <emphasis>jails</emphasis>. Jails zijn ge�ntroduceerd in &os; 4.X door &a.phk;, maar zijn grotendeels verbeterd in &os; 5.X om ze nog sterker en krachtiger te maken. De ontwikkeling gaat nog steeds door met verbeteringen voor het gebruik, performance, betrouwbaarheid en beveiliging.</para> <sect2 id="jails-what"> <title>Wat is een jail</title> <para>BSD achtige systemen hebben sinds 4.2-BSD ondersteuning voor &man.chroot.2;. De &man.chroot.8; utility kan gebruikt worden om de root directory van een set processen te wijzigen waardoor een veilige omgeving wordt gecree�rd voor de rest van het systeem. Processen die gemaakt worden in een chroot omgeving kunnen bestanden en bronnen daarbuiten niet benaderen. Daardoor zou een compromitering van een dienst die in een chroot omgeving draait niet direct betekenen dat het hele systeem gecompromiteerd is. De &man.chroot.8; utility is goed genoeg voor simpele taken, waarbij flexibiliteit en geavanceerde en complexe opties niet nodig zijn. Sinds het uitvinden van het chroot concept, zijn er vele mogelijkheden gevonden om hieruit te kunnen komen en alhoewel ze verbeterd zijn in moderne versies van &os;, werd het duidelijk dat &man.chroot.2; niet de meest ideale oplossing was voor het beveiligen van diensten. Er moest een nieuw subsysteem ontwikkeld worden.</para> <para>Dit is ��n van de redenen waarom jails zijn ontwikkeld.</para> <para>Jails zijn een verbeterd concept van de &man.chroot.2; omgeving, in verschillende opzichten. In een traditionele &man.chroot.2; omgeving worden processen alleen gelimiteerd in het deel van het bestandssysteem die ze kunnen benaderen. De rest van de systeem bronnen (zoals de set van systeem gebruikers, de draaiende processen of het netwerk subsysteem) worden gedeeld door het chrooted proces en de processen op het host systeem. Jails breiden dit model uit door het niet alleen virtualizeren van de toegang tot het bestandssysteem maar ook tot de set van gebruikers, het netwerk subsysteem van de &os; kernel en een aantal andere delen. Een meer complete set van gespecificeerde controle mogelijkheden die beschikbaar zijn voor het personaliseren van de toegang tot een jail omgeving wordt beschreven in <xref linkend="jails-tuning"/>.</para> <para>Een jail heeft vier kenmerken:</para> <itemizedlist> <listitem> <para>Een eigen directory structuur — het startpunt van waaruit een jail benaderd wordt. Zodra men in de jail zit, mogen processen niet buiten deze directory structuur komen. Traditionele problemen die &man.chroot.2;'s ontwerp getart hebben, hebben geen invloed op &os; jails.</para> </listitem> <listitem> <para>Een hostname — de hostnaam die gebruikt wordt in de jail. Jails worden met name gebruikt voor het hosten van netwerk diensten, daardoor kan het de systeembeheerder heel erg helpen als er beschrijvende hostnames worden gekozen.</para> </listitem> <listitem> <para>Een <acronym>IP</acronym> adres — deze wordt gekoppeld aan de jail en kan op geen enkele manier worden gewijzigd tijdens het leven van de jail. Het IP adres van een jail is meestal een alias op een reeds bestaande netwerk interface, maar dit is niet noodzakelijk.</para> </listitem> <listitem> <para>Een commando — het padnaam van een uitvoerbaar bestand in de jail. Deze is relatief aan de rootdirectory van de jail omgeving en verschilt per situatie, afhankelijk van het type van de specifieke jail omgeving.</para> </listitem> </itemizedlist> <para>Buiten deze kenmerken, kunnen jails hun eigen set aan gebruikers en <username>root</username> gebruiker hebben. Uiteraard zijn de mogelijkheden van de <username>root</username> gebruiker beperkt tot de jail omgeving en, vanuit het host systeem gezien, is de <username>root</username> gebruiker geen super-gebruiker. Daarnaast is het de <username>root</username> gebruiker in een jail omgeving niet toegestaan om kritieke operaties uit te voeren op het systeem buiten de gedefinieerde jail omgeving. Meer informatie over de mogelijkheden en beperkingen van de <username>root</username> gebruiker kan gevonden worden in <xref linkend="jails-tuning"/>hieronder.</para> </sect2> </sect1> <sect1 id="jails-build"> <title>Cree�ren en controleren van jails</title> <para>Sommige beheerders kiezen ervoor om jails op te delen in de volgende twee types: <quote>complete</quote> jails, welke een volledig &os; systeem emuleert en <quote>service</quote> jails, gericht op ��n applicatie of dienst, mogelijkerwijs draaiende met privileges. Dit is alleen een conceptuele splitsing, de manier van het opbouwen van een jail wordt hierdoor niet veranderd. De &man.jail.8; handleiding is heel duidelijk over de procedure voor het maken van een jail:</para> <screen>&prompt.root; <userinput>setenv D <replaceable>/here/is/the/jail</replaceable></userinput> &prompt.root; <userinput>mkdir -p $D</userinput> <co id="jailpath"/> &prompt.root; <userinput>cd /usr/src</userinput> &prompt.root; <userinput>make buildworld</userinput> <co id="jailbuildworld"/> &prompt.root; <userinput>make installworld DESTDIR=$D</userinput> <co id="jailinstallworld"/> &prompt.root; <userinput>make distribution DESTDIR=$D</userinput> <co id="jaildistrib"/> &prompt.root; <userinput>mount -t devfs devfs $D/dev</userinput> <co id="jaildevfs"/></screen> <calloutlist> <callout arearefs="jailpath"> <para>Het selecteren van een locatie voor een jail is het beste beginpunt. Hier zal de jail fysiek te vinden zijn binnen het bestandssysteem van het host systeem. Een goede keuze kan <filename class="directory">/usr/jail<replaceable>jailnaam</replaceable></filename> zijn, waar <replaceable>jailnaam</replaceable> de naam is van de jail. Het <filename class="directory">/usr</filename> bestandssysteem heeft meestal genoeg ruimte voor het jail bestandssysteem, wat voor een <quote>complete</quote> jail betekend dat het eigenlijk een replica is van elk bestand dat standaard aanwezig is binnen het &os; basissysteem.</para> </callout> <callout arearefs="jailbuildworld"> <para>Als u uw userland al heeft herbouwd met <command>make world</command> of <command>make buildworld</command>, dan kunt u deze stap overslaan en uw bestaande userland in de nieuwe jail installeren.</para> </callout> <callout arearefs="jailinstallworld"> <para>Dit commando zal de gekozen fysieke directory vullen met de benodigde binaire bestanden, bibliotheken, handleidingen, etc.</para> </callout> <callout arearefs="jaildistrib"> <para>Het <maketarget>distribution</maketarget> doel voor <application>make</application> installeert elk benodigd configuratie bestand. In simpelere termen, het installeert alle installeerbare bestanden in <filename class="directory">/usr/src/etc</filename> naar de <filename class="directory">/etc</filename> directory van de jail omgeving: <filename class="directory">$D/etc</filename>.</para> </callout> <callout arearefs="jaildevfs"> <para>Het koppelen van het &man.devfs.8; bestandssysteem is niet vereist in een jail. Aan de andere kant, vrijwel elke applicatie heeft toegang nodig tot minstens ��n apparaat, afhankelijk van het doel van het programma. Het is erg belangrijk om toegang tot apparaten te controleren binnenin een jail, omdat incorrecte instellingen een aanvaller de mogelijkheid kunnen geven om vervelende dingen in de jail te doen. De controle over &man.devfs.8; wordt gedaan door middel van rulesets, welke beschreven worden in de &man.devfs.8; en &man.devfs.conf.5; handleidingen.</para> </callout> </calloutlist> <para>Zodra een jail is ge�nstalleerd, kan het opgestart worden door de &man.jail.8; applicatie. De &man.jail.8; applicatie heeft vier benodigde argumenten welke beschreven worden in <xref linkend="jails-what"/>. Er kunnen ook andere argumenten gebruikt worden, om bijvoorbeeld de jail te starten met de instellingen van een specifieke gebruiker. Het <option><replaceable>commando</replaceable></option> argument hangt af van het type jail, voor een <emphasis>virtueel systeem</emphasis> is <filename>/etc/rc</filename> een goede keuze, omdat het de reguliere opstart procedure nabootst van een &os; systeem. Voor een <emphasis>dienst</emphasis> jail is het geheel afhankelijk van de dienst of applicatie die in de jail gaat draaien.</para> <para>Jails worden over het algemeen gestart tegelijkertijd met de rest van het systeem. Het &os; <filename>rc</filename> mechanisme levert een makkelijke manier om dat te doen:</para> <procedure> <step> <para>Een lijst van jails die opgestart moeten worden tijdens het opstarten van het systeem, moeten worden toegevoegd aan het &man.rc.conf.5; bestand:</para> <programlisting>jail_enable="YES" # Stel dit in op NO om te voorkomen dat er jails gestart worden jail_list="<replaceable>www</replaceable>" # Door spaties gescheiden lijst van jails</programlisting> <note> <para>De jail namen in <varname>jail_list</varname> mogen alleen alfanumerieke karakters bevatten.</para> </note> </step> <step> <para>Voor elke jail die gespecificeerd is in <varname>jail_list</varname> moet een groep van &man.rc.conf.5; instellingen worden toegevoegd:</para> <programlisting>jail_<replaceable>www</replaceable>_rootdir="/usr/jail/www" # de hoofd directory van de jail jail_<replaceable>www</replaceable>_hostname="<replaceable>www</replaceable>.example.org" # de hostnaam van de jail jail_<replaceable>www</replaceable>_ip="192.168.0.10" # het IP adres van de jail jail_<replaceable>www</replaceable>_devfs_enable="YES" # moet devfs wel of niet gekoppeld worden in de jail jail_<replaceable>www</replaceable>_devfs_ruleset="<replaceable>www_ruleset</replaceable>" # welke devfs ruleset gebruikt moet worden voor de jail</programlisting> <para>De standaard opstart variabelen in &man.rc.conf.5; gebruiken het <filename>/etc/rc</filename> bestand om de jail op te starten, wat er vanuit gaat dat de jail een compleet virtueel systeem is. Voor service jails moet het standaard opstart commando worden gewijzigd door het aanpassen van de <varname>jail_<replaceable>jailname</replaceable>_exec_start</varname> optie.</para> <note> <para>Voor een complete lijst van beschikbare opties, zie de &man.rc.conf.5; handleiding.</para> </note> </step> </procedure> <para>&man.service.8; kan worden gebruikt om jails handmatig te starten en te stoppen, mits er een overeenkomstige verzameling regels bestaat in <filename>/etc/rc.conf</filename>.</para> <screen>&prompt.root; <userinput>service jail start <replaceable>www</replaceable></userinput> &prompt.root; <userinput>service jail stop <replaceable>www</replaceable></userinput></screen> <para>Er is op dit moment geen nette methode om een jail te stoppen. Dit komt omdat de benodigde applicaties die een nette afsluiting verzorgen, niet beschikbaar zijn in een jail. De beste manier om een jail af te sluiten is door het volgende commando van binnenin de jail uit te voeren of door middel van het &man.jexec.8; commando:</para> <screen>&prompt.root; <userinput>sh /etc/rc.shutdown</userinput></screen> <para>Meer informatie hierover kan gevonden worden in de &man.jail.8; handleiding.</para> </sect1> <sect1 id="jails-tuning"> <title>Optimaliseren en administratie</title> <para>Er zijn meerdere opties beschikbaar die ingesteld kunnen worden voor elke jail, en er zijn meerdere mogelijkheden om een &os; host systeem te combineren met jails om een betere scheiding tussen systeem en applicaties te verkrijgen. Deze sectie leert:</para> <itemizedlist> <listitem> <para>Een aantal opties zijn beschikbaar voor het optimaliseren van het gedrag en beveiligings beperkingen die ge�mplementeerd worden in een jail.</para> </listitem> <listitem> <para>Een aantal <quote>high-level</quote> applicaties die gebruikt worden voor het beheren van jails, welke beschikbaar zijn via de &os; Ports Collectie en kunnen gebruikt worden om een complete jail-gebaseerde oplossing te cree�ren.</para> </listitem> </itemizedlist> <sect2 id="jails-tuning-utilities"> <title>Systeem applicaties voor het optimaliseren van jails onder &os;</title> <para>Het goed kunnen optimaliseren van een jail configuratie wordt veelal gedaan door het instellen van &man.sysctl.8; variabelen. Er bestaat een speciale subtak van sysctl voor het organiseren van alle relevante opties: de <varname>security.jail.*</varname> hierarchie binnen de &os; kernel. Hieronder staat een lijst van de belangrijkste jail-gerelateerde sysctl variabelen, met informatie over de standaard waarden. De benaming zou zelf beschrijvend moeten zijn, maar voor meer informatie kunnen de &man.jail.8; en &man.sysctl.8; handleidingen geraadpleegd worden.</para> <itemizedlist> <listitem> <para><varname>security.jail.set_hostname_allowed: 1</varname></para> </listitem> <listitem> <para><varname>security.jail.socket_unixiproute_only: 1</varname></para> </listitem> <listitem> <para><varname>security.jail.sysvipc_allowed: 1</varname></para> </listitem> <listitem> <para><varname>security.jail.enforce_statfs: 2</varname></para> </listitem> <listitem> <para><varname>security.jail.allow_raw_sockets: 0</varname></para> </listitem> <listitem> <para><varname>security.jail.chflags_allowed: 0</varname></para> </listitem> <listitem> <para><varname>security.jail.jailed: 0</varname></para> </listitem> </itemizedlist> <para>Deze variabelen kunnen door de systeem beheerder gebruikt worden op het <emphasis>host systeem</emphasis> om limitaties toe te voegen of te verwijderen, welke standaard opgedwongen worden aan de <username>root</username> gebruiker. Let op, een aantal beperkingen kan niet worden aangepast. De <username>root</username> gebruiker mag geen bestandssystemen koppelen of ontkoppelen binnenin een &man.jail.8;. De <username>root</username> gebruiker mag ook geen &man.devfs.8; rulesets laden of ontladen, firewall rules plaatsen of andere taken uitvoeren die vereisen dat de in-kernel data wordt aangepast, zoals het aanpassen van de <varname>securelevel</varname> variabele in de kernel.</para> <para>Het basis systeem van &os; bevat een basis set van applicaties voor het inzien van de actieve jails, en voor het uitvoeren van administratieve commando's in een jail. De &man.jls.8; en &man.jexec.8; commando's zijn onderdeel van het basis systeem en kunnen gebruikt worden voor het uitvoeren van de volgende simpele taken:</para> <itemizedlist> <listitem> <para>Het printen van een lijst van actieve jails met het corresponderende jail ID (<acronym>JID</acronym>), <acronym>IP</acronym> adres, de hostnaam en het pad.</para> </listitem> <listitem> <para>Het koppelen met een actieve jail vanuit het host systeem, en voor het uitvoeren van administratieve taken in de jail zelf. Dit is bijzonder handig wanneer de <username>root</username> gebruiker een jail netjes wilt afsluiten. Het &man.jexec.8; commando kan ook gebruikt worden om een shell te starten in een jail om daarmee administratieve taken uit te voeren; bijvoorbeeld met:</para> <screen>&prompt.root; <userinput>jexec <replaceable>1</replaceable> tcsh</userinput></screen> </listitem> </itemizedlist> </sect2> <sect2 id="jails-tuning-admintools"> <title>Administratieve applicaties op hoog niveau in de &os; Ports Collection.</title> <para>Tussen de vele software van derde partijen voor jail beheer, is ��n van de meest complete en bruikbare paketten: <filename role="package">sysutils/jailutils</filename>. Dit is een set van kleine applicaties, die bijdragen aan &man.jail.8; beheer. Kijk op de web pagina voor meer informatie.</para> </sect2> </sect1> <sect1 id="jails-application"> <title>Toepassing van jails</title> <sect2 id="jails-service-jails"> <sect2info> <authorgroup> <author> <firstname>Daniel</firstname> <surname>Gerzo</surname> <contrib>Bijgedragen door </contrib> <!-- 15. May 2007 --> </author> </authorgroup> </sect2info> <title>Dienst jails</title> <para>Deze sectie is gebaseerd op een idee van &a.simon; op <ulink url="http://simon.nitro.dk/service-jails.html"></ulink>, en een geupdate artikel door Ken Tom <email>locals@gmail.com</email>. Deze sectie illusteert hoe een &os; systeem opgezet kan worden met een extra laag beveiliging door gebruik te maken van &man.jail.8;. Er wordt vanuit gegaan dat het betrokken systeem minstens RELENG_6_0 draait en dat de informatie eerder in dit hoofdstuk goed begrepen is.</para> <sect3 id="jails-service-jails-design"> <title>Ontwerp</title> <para>��n van de grootste problemen met jails is het beheer van het upgrade proces. Dit is meestal een probleem omdat elke jail vanaf het begin af aan moet worden opgebouwd wanneer er geupdate wordt. Meestal is dit voor een enkele jail geen probleem, omdat het update proces redelijk simpel is, maar het kan een vervelende tijdrovende klus zijn als er meerdere jails zijn.</para> <warning> <para>Deze opstelling vereist uitgebreide kennis en ervaring van &os; en zijn mogelijkheden. Als onderstaande stappen te lastig lijken te zijn, wordt aangeraden om een simpeler systeem te bekijken zoals <filename role="package">sysutils/qjail</filename> of <filename role="package">sysutils/ezjail</filename>, welke een simpele manier geeft voor het beheren van &os; jails en niet zo complex is als deze opstelling.</para> </warning> <para>Het idee werd geopperd om zulke problemen zoveel als mogelijk te voorkomen door zoveel als mogelijk te delen tussen de verschillende jails op een zo veilig mogelijke manier — door gebruik te maken van alleen-lezen &man.mount.nullfs.8; koppelingen, zodat het upgraden simpeler wordt en het inzetten van jails voor enkele diensten interessanter wordt. Daarnaast geeft het een simpele manier om nieuwe jails toe te voegen of te verwijderen en om deze te upgraden.</para> <note> <para>Voorbeelden binnen deze context zijn: een <acronym>HTTP</acronym> server, een <acronym>DNS</acronym> server, een <acronym>SMTP</acronym> server enzovoorts.</para> </note> <para>De doelen van de opstelling zoals beschreven in dit hoofdstuk zijn:</para> <itemizedlist> <listitem> <para>Het cree�ren van een simpele en makkelijk te begrijpen jail structuur. Dit impliceert dat er <emphasis>niet</emphasis> elke keer een volledige installworld gedraaid hoeft te worden voor elke jail.</para> </listitem> <listitem> <para>Het makkelijk maken van het aanmaken en verwijderen van jails.</para> </listitem> <listitem> <para>Het makkelijk maken van het updaten en upgraden van bestaande jails.</para> </listitem> <listitem> <para>Het mogelijk maken van het draaien van een eigen gemaakte &os; tak.</para> </listitem> <listitem> <para>Paranoia zijn over beveiliging, zoveel mogelijk beperken, om de kans op inbraak zo klein mogelijk te maken.</para> </listitem> <listitem> <para>Het zoveel mogelijk besparen van ruimte en inodes.</para> </listitem> </itemizedlist> <para>Zoals reeds besproken is dit ontwerp sterk afhankelijk van het hebben van een <quote>master-template</quote>, welke alleen-lezen (beter bekend als <application>nullfs</application>) gekoppeld is binnen elke jail, en een beschrijfbaar apparaat per jail. Een apparaat kan hierin zijn een aparte fysieke schijf, een partitie, of een door vnodes ondersteunde &man.md.4; apparaat. In dit voorbeeld wordt gebruik gemaakt van lezen-schrijven <application>nullfs</application> koppelpunten.</para> <para>Het gebruikte bestandssysteem wordt beschreven door de volgende lijst:</para> <itemizedlist> <listitem> <para>Elke jail zal gekopeld worden onder de <filename class="directory">/home/j</filename> directory.</para> </listitem> <listitem> <para><filename class="directory">/home/j/mroot</filename> is de template voor elke jail en tevens de alleen-lezen partitie voor elke jail.</para> </listitem> <listitem> <para>Voor elke jail zal een lege directory structuur gemaakt worden, welke valt onder de <filename class="directory">/home/j</filename> directory.</para> </listitem> <listitem> <para>Elke jail heeft een <filename class="directory">/s</filename> directory, welke gekoppeld zal worden aan het beschrijfbare gedeelte van het systeem.</para> </listitem> <listitem> <para>Elke jail zal zijn eigen beschrijfbaar systeem hebben welke gebaseerd is op <filename class="directory">/home/j/skel</filename>.</para> </listitem> <listitem> <para>Elke jail ruimte (het beschrijfbare gedeelte van de jail), wordt gecree�rd in de <filename class="directory">/home/js</filename> directory.</para> </listitem> </itemizedlist> <note> <para>De voorbeelden gaan er vanuit dat de jails geplaatst worden in <filename class="directory">/home</filename> partitie. Dit kan uiteraard aangepast worden, maar dan moeten de voorbeelden hieronder ook worden aangepast naar de plek die gebruikt zal worden.</para> </note> </sect3> <sect3 id="jails-service-jails-template"> <title>De template cree�ren</title> <para>Deze sectie leert welke stappen er genomen moeten worden om de master-template te maken. Deze zal het alleen-lezen gedeelte vormen van de jails.</para> <para>Het is altijd een goed idee om ervoor te zorgen dat het &os; systeem de laatst beschikbare -RELEASE versie draait. Zie het corresponderende hoofdstuk in het <ulink url="&url.books.handbook;/makeworld.html">Handboek</ulink> om te lezen hoe dit gedaan wordt. In het geval dat het de moeite niet is om te updaten, zal een buildworld nodig zijn voordat er verder gegaan kan worden. Daarnaast is het <filename role="package">sysutils/cpdup</filename> pakket benodigd. Er wordt gebruik gemaakt van de&man.portsnap.8; applicatie om de &os; Ports Collectie te downloaden. Het handbook met het <ulink url="&url.books.handbook;/portsnap.html">hoofdstuk</ulink> over Portsnap, is een aanrader voor nieuwe gebruikers.</para> <procedure> <step> <para>Als eerste moet er een directory structuur gecree�rd worden voor het alleen-lezen bestandssysteem, welke de &os; binaries zal bevatten voor de jails. Daarna wordt het alleen-lezen bestandssysteem ge�nstalleerd vanuit de &os; broncode directory in de jail template:</para> <screen>&prompt.root; <userinput>mkdir /home/j /home/j/mroot</userinput> &prompt.root; <userinput>cd /usr/src</userinput> &prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot</userinput></screen> </step> <step> <para>Hierna moet de &os; Ports Collectie worden voorbereid, evenals de &os; broncode directory, wat voor <application>mergemaster</application> vereist is:</para> <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput> &prompt.root; <userinput>mkdir usr/ports</userinput> &prompt.root; <userinput>portsnap -p /home/j/mroot/usr/ports fetch extract</userinput> &prompt.root; <userinput>cpdup /usr/src /home/j/mroot/usr/src</userinput></screen> </step> <step> <para>Nu moet er een <quote>skelet</quote> gecree�rd worden voor het bechrijfbare gedeelte van het systeem:</para> <screen>&prompt.root; <userinput>mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles</userinput> &prompt.root; <userinput>mv etc /home/j/skel</userinput> &prompt.root; <userinput>mv usr/local /home/j/skel/usr-local</userinput> &prompt.root; <userinput>mv tmp /home/j/skel</userinput> &prompt.root; <userinput>mv var /home/j/skel</userinput> &prompt.root; <userinput>mv root /home/j/skel</userinput></screen> </step> <step> <para>De <application>mergemaster</application> applictie moet gebruikt worden om de ontbrekende configuratie bestanden te installeren. Erna moeten alle overtollige directories die gecree�rd zijn door <application>mergemaster</application> verwijderd worden:</para> <screen>&prompt.root; <userinput>mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i</userinput> &prompt.root; <userinput>cd /home/j/skel</userinput> &prompt.root; <userinput>rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev</userinput></screen> </step> <step> <para>Nu moet er een symbolische link gemaakt worden tussen het beschrijfbare bestandssysteem en het alleen-lezen bestandssysteem, zorg ervoor dat de links gemaakt worden in de juiste <filename class="directory">/s</filename> directory. Als hier echte directories worden gemaakt of de directories worden op de verkeerde plak aangemaakt zal dit resulteren in een mislukte installatie:</para> <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput> &prompt.root; <userinput>mkdir s</userinput> &prompt.root; <userinput>ln -s s/etc etc</userinput> &prompt.root; <userinput>ln -s s/home home</userinput> &prompt.root; <userinput>ln -s s/root root</userinput> &prompt.root; <userinput>ln -s ../s/usr-local usr/local</userinput> &prompt.root; <userinput>ln -s ../s/usr-X11R6 usr/X11R6</userinput> &prompt.root; <userinput>ln -s ../../s/distfiles usr/ports/distfiles</userinput> &prompt.root; <userinput>ln -s s/tmp tmp</userinput> &prompt.root; <userinput>ln -s s/var var</userinput></screen> </step> <step> <para>Als laatste stap moet er een generieke <filename>/home/j/skel/etc/make.conf</filename> gemaakt worden met de volgende inhoud:</para> <programlisting>WRKDIRPREFIX?= /s/portbuild</programlisting> <para>Door het gebruik van <literal>WRKDIRPREFIX</literal> op deze manier, is het mogelijk om per jail &os; ports te compileren. Onthoud dat de ports directory onderdeel is van het alleen-lezen bestandssysteem. Het eigen pad voor <literal>WRKDIRPREFIX</literal> maakt het mogelijk dat port builds gedaan worden op het beschrijfbare gedeelte van elke jail.</para> </step> </procedure> </sect3> <sect3 id="jails-service-jails-creating"> <title>Jails cree�ren</title> <para>Nu we een complete &os; template hebben, kunnen we de jails opzetten en configureren in <filename>/etc/rc.conf</filename>. Dit voorbeeld demonstreert het cree�ren van drie jails: <quote>NS</quote>, <quote>MAIL</quote> en <quote>WWW</quote>.</para> <procedure> <step> <para>Zet het volgende in <filename>/etc/fstab</filename> zodat de alleen-lezen template voor de jails en de beschrijfbare partititie beschikbaar zijn in de respectievelijke jails:</para> <programlisting>/home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0</programlisting> <note> <para>Partities die gemarkeerd zijn met een 0 als <quote>passnummer</quote> worden niet gecontroleerd door &man.fsck.8; tijdens het opstarten, en partities met een <quote>dumpnummer</quote> van 0 worden niet geback-upped door &man.dump.8;. Het is niet gewenst dat <application>fsck</application> de <application>nullfs</application> koppelingen controleert of dat <application>dump</application> een back-up maakt van de alleen-lezen nullfs koppelingen van de jails. Daarom worden ze gemarkeerd met <quote>0 0</quote> in de laatste twee kolommen van elke <filename>fstab</filename> regel hierboven.</para> </note> </step> <step> <para>Configureer de jails in <filename>/etc/rc.conf</filename>:</para> <programlisting>jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES"</programlisting> <warning> <para>De reden dat de <varname>jail_<replaceable>name</replaceable>_rootdir</varname> variabele verwijst naar de <filename class="directory">/usr/home</filename> directory in plaats van naar <filename class="directory">/home</filename> komt doordat het fysieke pad van de <filename class="directory">/home</filename> directory op een standaard &os; installatie verwijst naar <filename class="directory">/usr/home</filename>. De <varname>jail_<replaceable>name</replaceable>_rootdir</varname> variabele mag <emphasis>niet</emphasis> ingesteld worden op een symbolische link, omdat dan de jail weigert te starten. Gebruik het &man.realpath.1; programma om te zien welke waarde ingesteld moet worden voor deze variabele. Zie de &os;-SA-07:11.jail waarschuwing voor meer informatie.</para> </warning> </step> <step> <para>Cree�r de benodigde koppelpunten voor het alleen-lezen bestandssysteem van elke jail:</para> <screen>&prompt.root; <userinput>mkdir /home/j/ns /home/j/mail /home/j/www</userinput></screen> </step> <step> <para>Installeer de beschrijfbare template in elke jail. Let op het gebruik van <filename role="package">sysutils/cpdup</filename>, wat helpt om een goede kopie te maken in elke directory:</para> <screen>&prompt.root; <userinput>mkdir /home/js</userinput> &prompt.root; <userinput>cpdup /home/j/skel /home/js/ns</userinput> &prompt.root; <userinput>cpdup /home/j/skel /home/js/mail</userinput> &prompt.root; <userinput>cpdup /home/j/skel /home/js/www</userinput></screen> </step> <step> <para>In deze fase zijn de jails gebouwd en voorbereid om op te starten. Koppel eerst de benodigde bestandssystemen voor elke jail, en start ze vervolgens door gebruik te maken van het rc-bestand voor de jail:</para> <screen>&prompt.root; <userinput>mount -a</userinput> &prompt.root; <userinput>service jail start</userinput></screen> </step> </procedure> <para>De jails zouden nu gestart moeten zijn. Om te zien of ze correct gestart zijn, wordt het &man.jls.8; programma gebruikt. Het resultaat hiervan ziet er ongeveer als volgend uit:</para> <screen>&prompt.root; <userinput>jls</userinput> JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www</screen> <para>Op dit moment, zou het mogelijk moeten zijn om op elke jail aan te loggen, nieuwe gebruikers toe te voegen en het configureren van daemons. De <literal>JID</literal> kolom geeft het identificatie nummer voor elke gestarte jail. Gebruik het volgende commando om administratieve commando's uit te voeren in de jail met het <literal>JID</literal> 3:</para> <screen>&prompt.root; <userinput>jexec 3 tcsh</userinput></screen> </sect3> <sect3 id="jails-service-jails-upgrading"> <title>Upgraden</title> <para>Naarmate de tijd verstrijkt komt de noodzaak om het systeem te updaten naar een nieuwere versie van &os;, danwel vanwege een veiligheids waarschuwing danwel vanwege nieuwe mogelijkheden die ge�mplementeerd zijn en nuttig zijn voor de jails. Het ontwerp van deze opzet levert een makkelijke manier voor het upgraden van jails. Daarnaast minimaliseert het de <quote>down-time</quote>, omdat de jails alleen in de allerlaatste minuut uitgeschakeld worden. Het geeft ook de mogelijkheid om terug te keren naar een oudere versie, voor het geval er problemen ontstaan.</para> <procedure> <step> <para>De eerste stap is het upgraden van het host systeem zelf, waarna een nieuwe alleen-lezen template gemaakt wordt in <filename class="directory">/home/j/mroot2</filename>.</para> <screen>&prompt.root; <userinput>mkdir /home/j/mroot2</userinput> &prompt.root; <userinput>cd /usr/src</userinput> &prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot2</userinput> &prompt.root; <userinput>cd /home/j/mroot2</userinput> &prompt.root; <userinput>cpdup /usr/src usr/src</userinput> &prompt.root; <userinput>mkdir s</userinput></screen> <para>Het <maketarget>installworld</maketarget> doel cree�rt een aantal onnodige directories, welke verwijderd moeten worden:</para> <screen>&prompt.root; <userinput>chflags -R 0 var</userinput> &prompt.root; <userinput>rm -R etc var root usr/local tmp</userinput></screen> </step> <step> <para>Maak opnieuw de beschrijfbare symbolische linken voor het hoofd bestandssysteem:</para> <screen>&prompt.root; <userinput>ln -s s/etc etc</userinput> &prompt.root; <userinput>ln -s s/root root</userinput> &prompt.root; <userinput>ln -s s/home home</userinput> &prompt.root; <userinput>ln -s ../s/usr-local usr/local</userinput> &prompt.root; <userinput>ln -s ../s/usr-X11R6 usr/X11R6</userinput> &prompt.root; <userinput>ln -s s/tmp tmp</userinput> &prompt.root; <userinput>ln -s s/var var</userinput></screen> </step> <step> <para>Dit is het juiste moment om de jails te stoppen:</para> <screen>&prompt.root; <userinput>service jail stop</userinput></screen> </step> <step> <para>Ontkoppel de originele bestandssystemen:</para> <screen>&prompt.root; <userinput>umount /home/j/ns/s</userinput> &prompt.root; <userinput>umount /home/j/ns</userinput> &prompt.root; <userinput>umount /home/j/mail/s</userinput> &prompt.root; <userinput>umount /home/j/mail</userinput> &prompt.root; <userinput>umount /home/j/www/s</userinput> &prompt.root; <userinput>umount /home/j/www</userinput></screen> <note> <para>Het beschrijfbare gedeelte van de jail is gekoppeld aan het alleen-lezen gedeelte (<filename class="directory">/s</filename>) en moet derhalve eerst ontkoppeld worden.</para> </note> </step> <step> <para>Verplaatst het oude alleen-lezen systeem en vervang het door de nieuwe systeem. Het oude systeem dient als reservekopie voor het geval er iets misgaat. De naam moet het zelfde zijn als bij de installatie van het nieuwe systeem. Verplaats de &os; Ports Collectie naar het nieuwe bestandssysteem om ruimte en inodes te besparen:</para> <screen>&prompt.root; <userinput>cd /home/j</userinput> &prompt.root; <userinput>mv mroot mroot.20060601</userinput> &prompt.root; <userinput>mv mroot2 mroot</userinput> &prompt.root; <userinput>mv mroot.20060601/usr/ports mroot/usr</userinput></screen> </step> <step> <para>Op dit moment is het alleen-lezen gedeelte klaar, de enig overgebleven taak is nu om alle bestandssystemen opnieuw te koppelen en om de jails weer op te starten:</para> <screen>&prompt.root; <userinput>mount -a</userinput> &prompt.root; <userinput>service jail start</userinput></screen> </step> </procedure> <para>Gebruik het &man.jls.8; programma om te zien of de jails correct zijn opgestart. Vergeet niet om in elke jail het mergemaster programma te starten. Ook moeten de configuratie bestanden en de rc.d scripts geupdate worden.</para> </sect3> </sect2> </sect1> </chapter>