doc/nl_NL.ISO8859-1/books/handbook/jails/chapter.xml
Gabor Kovesdan a6684b4306 - Reduce the misuse of role attribute; role="directory" should actually be
class="directory"
- Add constraint to enforce this
2013-04-04 11:40:58 +00:00

1071 lines
42 KiB
XML
Raw Blame History

<?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. <20><>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<67>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><EFBFBD><EFBFBD>n van de tools welke gebruikt kan worden om
de beveiliging van een &os; systeem te verbeteren zijn
<emphasis>jails</emphasis>. Jails zijn ge<67>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<65>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 <20><>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<EFBFBD>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 <20><>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
<20><>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<67>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<67>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<65>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 <20><>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><EFBFBD><EFBFBD>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<65>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<65>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<65>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<65>rd worden voor het alleen-lezen
bestandssysteem, welke de &os; binaries zal bevatten
voor de jails. Daarna wordt het alleen-lezen
bestandssysteem ge<67>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<65>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<65>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<65>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<65>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<EFBFBD>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<67>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<65>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>