<?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 &mdash; 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;&nbsp;4.X door &a.phk;, maar zijn grotendeels verbeterd in
      &os;&nbsp;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 &mdash; 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 &mdash; 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 &mdash; 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 &mdash; 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 &mdash; 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&nbsp;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>