<?xml version="1.0" encoding="ISO-8859-1"?>
<chapter id="phase6">
  <title>Meerdere gebruikers activeren</title>

  <sect1>
    <title>Analyse</title>

    <para>Tot nu toe functioneerde het besturingssysteem in single-user modus.
Er is geen loginproces en iedereen die het systeem boot komt rechtsstreeks
terecht in een shell met rootprivileges. Uiteraard is dit bij de GNU/Linux
distributies niet de normale besturingsmodus. De meeste systemen hebben
een multi-user mogelijkheid waarbij veel gebruikers het systeem tegelijkertijd
met verschillende privilege niveaus kunnen benaderen. Deze multi-user
systemen ondersteunen ook virtuele consoles zodat het toetsenbord en de
videoweergave tussen verscheidene terminalsessies kunnen worden gedeeld.
Dus in deze fase zouden we graag de volgende verbeteringen aan het systeem
toe willen voegen:
    </para>

    <itemizedlist>
      <listitem>
        <para>Mogelijkheid van multi-user activeren.</para>
      </listitem>

      <listitem>
        <para>Meerdere, virtuele consoles aanmaken.</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1>
    <title>Ontwerp</title>

    <sect2>
      <title>Het loginproces</title>

      <para>De From-Powerup-To-BASH-Prompt-HOWTO verricht een goede taak
in het uiteenzetten van de stappen in het loginproces. Eigenlijk werkt het
als volgt:
      </para>

      <orderedlist>
        <listitem>
          <para>De <command>init</command> daemon start een 
          <command>getty</command> proces op de terminal.</para>
        </listitem>

        <listitem>
          <para>Het <command>getty</command> programma toont de inhoud van 
<filename>/etc/issue</filename> en toont een prompt voor de gebruikersnaam.</para>
        </listitem>

        <listitem>
          <para>Wanneer de gebruikersnaam is ingevoerd, wordt de 
besturing overhandigd aan het programma <command>login</command>.
          </para>
        </listitem>

        <listitem>
<para>Het programma <command>login</command> vraagt om een wachtwoord en 
verifieert de geloofwaardigheid aan de hand van <filename>/etc/passwd</filename>, <filename>/etc/group</filename> en mogelijk <filename>/etc/shadow</filename>.
</para>
        </listitem>

        <listitem>
          <para>Als alles in orde is, dan wordt de shell gestart.</para>
        </listitem>
      </orderedlist>
    </sect2>

    <sect2>
      <title>Verkrijgen van de broncode</title>

      <para>De programma's <command>getty</command> en <command>login</command>
werden reeds als onderdeel van util-linux ge&iuml;nstalleerd.
      </para>
    </sect2>

    <sect2>
      <title>Aanmaken van ondersteuningsbestanden</title>

      <sect3>
        <title>Device nodes</title>

        <para>Details over virtuele console devicebestanden zijn te vinden
in een bestand genaamd <filename>devices.txt</filename> in de directory
<filename>Documentation</filename> van de Linux kernelbroncode. 
We zullen <filename>tty1</filename> tot en met <filename>tty6</filename> voor 
de virtuele consoles aan moeten maken als ook <filename>tty0</filename> en
<filename>tty</filename> die de huidige virtuele console voorstellen.
        </para>
      </sect3>

      <sect3>
        <title>/etc/issue</title>

        <para>Het <filename>/etc/issue</filename> bestand is tamelijk 
eenvoudig te construeren.
Iedere willekeurige tekst kan erin worden opgenomen waarvan we willen dat
het op het scherm wordt weergegeven voor de verschijning van de loginprompt.
Het kan iets vriendelijks zijn zoals &#34;Welkom bij Pocket Linux&#34;,
iets bedreigends zoals &#34;Alleen geauthoriseerde gebruikers!&#34; of 
iets informatiefs zoals &#34;Verbonden met tty1 op 9600bps&#34;.
In de agetty(8) manpage wordt uitgelegd hoe informatie zoals de ttylijn
en baud rate met behulp van escape codes weer te geven.
</para>
      </sect3>

      <sect3>
        <title>/etc/passwd</title>

<para>
Het formaat van <filename>/etc/passwd</filename> kan worden verkregen door het
lezen van de passwd(5) manpage. 
We kunnen makkelijk een gebruikersaccount aanmaken door een regel als
&#34;root::0:0:superuser:/root:/bin/sh&#34; aan het bestand toe te voegen.
</para>

<para>Het onderhouden van wachtwoorden is een uitdaging omdat het systeem in 
ramdisk wordt geladen. Alle wijzigingen aan <filename>/etc/passwd</filename>
zullen verloren gaan wanneer het systeem wordt afgesloten. Dus om het makkelijk
te maken, zullen we voor alle gebruikers nul wachtwoorden aanmaken.
</para>
      </sect3>

      <sect3>
        <title>/etc/group</title>

<para>De structuur van <filename>/etc/group</filename> is beschikbaar uit de 
group(5) manpage. Een regel als &#34;root::0:root&#34; definieert een groep 
genaamd &#34;root&#34; zonder wachtwoord, een groepsid nul en de gebruiker
root als enige deelnemer eraan toegekend.
        </para>
      </sect3>

      <sect3>
        <title>Conventies</title>

<para>Namen en id's van gebruikers en groepen worden gewoonlijk niet 
willekeurig gekozen. De meeste Linux systemen hebben zeer vergelijkbaar
uitziende <filename>/etc/passwd</filename> en <filename>/etc/group</filename> 
bestanden. Definities die worden gebruikt voor het toekennen van gebruikers- 
en groepsid's zijn op &eacute;&eacute;n van de volgende lokaties te vinden:
        </para>
        <itemizedlist>
          <listitem>
            <para>De bestanden <filename>/etc/passwd</filename> en 
<filename>/etc/group</filename> in elke populaire GNU/Linux distributie.
            </para>
          </listitem>

          <listitem>
            <para>De Debian Policy Manual -- online beschikbaar op <ulink
            url="http://www.debian.org/doc/debian-policy">http://www.debian.org/doc/debian-policy</ulink>.</para>
          </listitem>

          <listitem>
            <para>De Linux Standard Base specificatie -- in meerdere
formaten te downloaden vanaf
            <ulink
            url="http://www.linuxbase.org/spec/index.shtml">http://www.linuxbase.org/spec/index.shtml</ulink>.</para>
          </listitem>

          <listitem>
            <para>Essential System Administration, 3rd Edition door Aeleen
            Frisch -- beschikbaar bij boekwinkels of direct bij O&#39;Reilly
            Publishing op <ulink url="http://www.oreilly.com/">http://www.oreilly.com/</ulink>.</para>
          </listitem>
        </itemizedlist>
      </sect3>
    </sect2>

    <sect2>
      <title>Afhankelijkheden</title>

<para>
De uitvoering van <command>ldd</command> op het <filename>login</filename> 
programma uit util-linux zal bekendmaken dat het is gelinkt met de library 
<filename>libcrypt.so.1</filename>. 
In aanvulling op libcrypt, is er nog een ander minder vanzelfsprekende
library afhankelijkheid op <filename>libnss_files.so.2</filename>. 
De name service switch library <filename>libnss_files.so.2</filename> is 
nodig voor het login programma om het <filename>/etc/passwd</filename> bestand 
te kunnen benaderen.
Zonder libnss zullen alle logins, op mysterieuze wijze mislukken.
</para>
    </sect2>

    <sect2>
      <title>Eigenaar en permissies toekennen</title>

      <para>Voorheen was het met het single user systeem niet nodig ons
druk te maken om permissies bij de installatie van directory's, bestanden
en devicenodes. De shell was effectief werkzaam als root, dus alles was
toegankelijk. Het werd wat complexer na het toevoegen van de mogelijkheid
voor meerdere gebruikers. Nu moeten we ervoor zorgen dat elke gebruiker
toegang heeft tot wat hij/zij nodig heeft en tegelijkertijd worden
geblokkeerd in wat hij/zij niet nodig heeft.
</para>

<para>Een goede richtlijn voor het toekennen van eigenaars en permissies
is het minimaal vereiste toegangsniveau toe te kennen. Neem als voorbeeld
de directory <filename>/bin</filename>.
Het Filesystem Hierarchy (FHS) document zegt, &#34;<filename>/bin</filename>
bevat opdrachten die door zowel de systeembeheerder als de gebruikers kunnen
worden gebruikt. Uit die bewering kunnen we concluderen dat 
<filename>/bin</filename> voor iedereen
lees- en uitvoerpermissie zou moeten hebben.  Aan de andere kant bevat de
directory <filename>/boot</filename> bestanden voor de bootloader. 
De kans is groot dat reguliere gebruikers niets zullen benaderen in de 
directory <filename>/boot</filename>. Dus het minimale toegangsniveau zou 
leespermissies zijn voor de rootgebruiker en andere beheerders die deelnemer 
zijn van de groep root. Voor normale gebruikers zouden aan de directory 
<filename>/boot</filename> geen permissies worden toegekend.
</para>

      <para>Meestal kunnen we vergelijkbare permissies aan alle opdrachten in
een directory toekennen, maar er zijn een aantal programma's die bewijzen
een uitzondering op de regel te zijn. De opdracht <command>su</command> is 
hiervan een goed voorbeeld. Andere opdrachten in de directory /bin hebben de 
minimumvereisten om te lezen en uit te voeren, maar de opdracht <command>su</command> moet voor de juiste werking worden ingesteld op setuid root. 
Aangezien het 
een setuid binary is, zou het een goed idee kunnen zijn niet iedereen toe 
te staan het uit te voeren.  De eigenaar 0:0 (root gebruiker, groep root)
      en permissies rwsr-x--- (octaal 1750) zou goed passend zijn voor
      <command>su</command>.</para>

      <para>Dezelfde logica kan worden toegepast op andere directory's en
bestanden in het root bestandssysteem door het doorlopen van de volgende
stappen:
      </para>

      <orderedlist>
        <listitem>
          <para>Ken als eigenaar de root gebruiker en de root groep toe.
</para>
        </listitem>

        <listitem>
          <para>Stel de meest beperkende permissies in die mogelijk zijn.
</para>
        </listitem>

        <listitem>
          <para>Pas de eigenaar en permissies aan &#34;wanneer nodig&#34;.
          </para>
        </listitem>
      </orderedlist>
    </sect2>
  </sect1>

  <sect1>
    <title>Constructie</title>

    <sect2>
      <title>Verifieer de aanwezigheid van getty en login</title>

      <para><programlisting>
<prompt>bash#</prompt> ls ~/fase/sbin/getty
<prompt>bash#</prompt> ls ~/fase/bin/login</programlisting></para>
    </sect2>

    <sect2>
      <title>Pas inittab voor de multi-user modus aan</title>

      <para>Pas <filename>~/fase/etc/inittab</filename> aan door het 
standaardrunlevel te wijzigen en <command>getty</command> regels zoals 
hieronder getoond toe te voegen.
      </para>

      <para><programlisting># /etc/inittab - init daemon configuratiebestand
#
# Standaardrunlevel
id:2:initdefault:
#
# Systeeminitialisatie
si:S:sysinit:/etc/init.d/rc S
#
# Runlevel scripts
r0:0:wait:/etc/init.d/rc 0
r1:1:respawn:/bin/sh
r2:2:wait:/etc/init.d/rc 2
r3:3:wait:/etc/init.d/rc 3
r4:4:wait:/etc/init.d/rc 4
r5:5:wait:/etc/init.d/rc 5
r6:6:wait:/etc/init.d/rc 6
#
# Breng virtuele terminals voort
1:235:respawn:/sbin/getty 9600 tty1 linux
2:235:respawn:/sbin/getty 9600 tty2 linux
3:235:respawn:/sbin/getty 9600 tty3 linux
4:235:respawn:/sbin/getty 9600 tty4 linux
5:235:respawn:/sbin/getty 9600 tty5 linux
6:2345:respawn:/sbin/getty 9600 tty6 linux
#
# einde van /etc/inittab</programlisting></para>
    </sect2>

    <sect2>
      <title>Maak tty devices aan</title>

<para><programlisting>
<prompt>bash#</prompt> cd ~/fase/dev
<prompt>bash#</prompt> mknod tty0 c 4 0
<prompt>bash#</prompt> mknod tty1 c 4 1
<prompt>bash#</prompt> mknod tty2 c 4 2
<prompt>bash#</prompt> mknod tty3 c 4 3
<prompt>bash#</prompt> mknod tty4 c 4 4
<prompt>bash#</prompt> mknod tty5 c 4 5
<prompt>bash#</prompt> mknod tty6 c 4 6
<prompt>bash#</prompt> mknod tty c 5 0</programlisting></para>
    </sect2>

    <sect2>
      <title>Maak ondersteuningsbestanden aan in /etc</title>

      <sect3>
        <title>/etc/issue</title>

<para>Maak het bestand <filename>~/fase/etc/issue</filename> aan door gebruik 
te maken van onderstaand voorbeeld of ontwerp een aangepaste melding.</para>

        <para><programlisting>Verbonden met \l op \b bps.</programlisting></para>

        <para>Noot: &#34;\l&#34; is een kleine letter L, niet het getal
&eacute;&eacute;n.
        </para>
      </sect3>

      <sect3>
        <title>/etc/passwd</title>

        <para>Gebruik een teksteditor om een minimaal passwd bestand 
conformerend aan het Linux Standards Base (LSB) document aan te maken.
         Sla het bestand op als <filename>~/fase/etc/passwd</filename></para>

        <para><programlisting>root::0:0:Super User:/root:/bin/sh
bin:x:1:1:Legacy UID:/bin:/bin/false
daemon:x:2:2:Legacy UID:/sbin:/bin/false</programlisting></para>
      </sect3>

      <sect3>
        <title>/etc/group</title>

        <para>Gebruik een teksteditor om een LSB conformerend group bestand
aan te maken en sla het op als <filename>~/fase/etc/group</filename></para>

        <para><programlisting>root::0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon</programlisting></para>
      </sect3>
    </sect2>

    <sect2>
      <title>Kopieer de benodigde library's</title>

      <para><programlisting> 
<prompt>bash#</prompt> cp /lib/libnss_files.so.2 ~/fase/lib</programlisting></para>
    </sect2>

    <sect2>
      <title>Stel de directory- en bestandspermissies in</title>

      <para>Stel minimale privileges in op alle bestanden en directory's onder
<filename>~/fase</filename>. 
De root gebruiker en groep root zijn overal eigenaar van.
      Permissies zijn read-write voor de eigenaar en read-only voor de groep.
      Uitzonderingen op de allesomvattende permissies worden van geval tot
geval afgehandeld.</para>

      <para><programlisting>
<prompt>bash#</prompt>cd ~/fase
<prompt>bash#</prompt>chown -R 0:0 *
<prompt>bash#</prompt>chmod -R 640 *</programlisting></para>

      <para>Stel de uitvoerpermissie in op alle directory's. 
     (Noot: hoofdletter &#34;X&#34;)</para>

      <para><programlisting>
<prompt>bash#</prompt>chmod -R +X *</programlisting></para>

<para>
Bestanden in <filename>/bin</filename> kunnen door iedereen worden gelezen en
uitgevoerd, maar <filename>su</filename> is daarop een uitzondering.
      </para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 755 bin/*
<prompt>bash#</prompt>chmod 4750 bin/su</programlisting></para>

<para>Bestanden in <filename>/dev</filename> hebben diverse permissies. 
Diskdevices zouden alleen toegankelijk moeten zijn voor beheerders. Op 
andere bestanden zoals <filename>/dev/null</filename> zouden volledige 
privileges moeten worden toegestaan voor alle gebruikers.
      </para>

<para><programlisting>
<prompt>bash#</prompt>chmod 660 /dev/fd0 /dev/ram0
<prompt>bash#</prompt>chmod 666 dev/null
<prompt>bash#</prompt>chmod 622 dev/console
<prompt>bash#</prompt>chmod 600 dev/initctl
<prompt>bash#</prompt>chmod 622 dev/tty
<prompt>bash#</prompt>chmod 622 dev/tty?</programlisting></para>

      <para>De <filename>passwd</filename> en <filename>group</filename> bestanden moeten door iedereen kunnen
worden gelezen.</para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 644 etc/passwd
<prompt>bash#</prompt>chmod 644 etc/group</programlisting></para>

      <para>De scripts in <filename>/etc/init.d</filename> moeten worden ingesteld op lezen en 
uitvoeren voor beheerders.
      </para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 750 etc/init.d/*</programlisting></para>

      <para>Library's moeten door iedereen kunnen worden gelezen en
uitgevoerd.</para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 755 lib/*</programlisting></para>

      <para>Alleen root mag toegang krijgen tot de directory
<filename>/root</filename>.
</para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 700 root</programlisting></para>

<para>
Zorg dat bestanden in <filename>/sbin</filename> door de beheerders 
kunnen worden gelezen en uitgevoerd.</para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 750 sbin/*</programlisting></para>

      <para>Temp moet door iedereen kunnen worden gelezen en beschreven met
het sticky bit ingesteld.</para>

      <para><programlisting>
<prompt>bash#</prompt>chmod 1777 tmp</programlisting></para>
    </sect2>

    <sect2>
      <title>Maak het rootdiskimage aan</title>

<para><programlisting>
<prompt>bash#</prompt> cd /
<prompt>bash#</prompt> dd if=/dev/zero of=/dev/ram7 bs=1k count=4096
<prompt>bash#</prompt> mke2fs -m0 /dev/ram7
<prompt>bash#</prompt> mount /dev/ram7 /mnt
<prompt>bash#</prompt> cp -dpR ~/fase/* /mnt
<prompt>bash#</prompt> umount /dev/ram7
<prompt>bash#</prompt> dd if=/dev/ram7 of=~/phase6-image bs=1k
<prompt>bash#</prompt> gzip -9 ~/phase6-image</programlisting></para>
    </sect2>

    <sect2>
      <title>Kopieer de image naar diskette</title>

      <para>Doe de diskette met het label &#34;rootdisk&#34; in
diskettestation fd0.</para>

      <para><programlisting>
<prompt>bash#</prompt> dd if=~/phase6-image.gz of=/dev/fd0 bs=1k</programlisting></para>
    </sect2>
  </sect1>

  <sect1>
    <title>Implementatie</title>

    <sect2>
      <title>Systeemstart</title>

      <para>Als alles goed gaat, dan zou de weergave van de virtuele console
er uit moeten zien als in het volgende voorbeeld:
      </para>

      <para><screen>Verbonden met tty1 op 9600 bps.
gnu-linux login:</screen></para>
    </sect2>

    <sect2>
      <title>Een nieuwe gebruiker aan het systeem toevoegen</title>

      <para>Log in als root.</para>

      <para>Maak een nieuwe niet bevoorrechte gebruiker en groep aan door
een regel aan respectievelijk de bestanden <filename>/etc/passwd</filename>
en <filename>/etc/group</filename> toe
te voegen. Zorg dat je een dubbel groter-dan teken (&#62;&#62;) gebruikt
om te voorkomen dat je de bestanden per ongeluk overschrijft.
      </para>

      <para><programlisting>
<prompt>bash#</prompt> echo &#34;floyd::501:500:User:/home/floyd:/bin/sh&#34; &#62;&#62; /etc/passwd
<prompt>bash#</prompt> echo &#34;users::500:&#34; &#62;&#62; /etc/group
<prompt>bash#</prompt> mkdir /home/floyd
<prompt>bash#</prompt> chown floyd.users /home/floyd
<prompt>bash#</prompt> chmod 700 /home/floyd</programlisting></para>
    </sect2>

    <sect2>
      <title>Test de nieuwe gebruikersmogelijkheid om het systeem te
gebruiken</title>

      <para>Schakel over naar de virtuele terminal tty2 door het indrukken van
      <keycap>ALT</keycap>+<keycap>F2</keycap>.</para>

      <para>Log in als floyd.</para>

      <para>Probeer de volgende opdrachten en verifieer dat ze werken.</para>

      <para><programlisting>
<prompt>bash$</prompt> pwd
<prompt>bash$</prompt> ls -l /
<prompt>bash$</prompt> cat /etc/passwd</programlisting></para>

      <para>Probeer de volgende opdrachten en verifieer dat ze niet werken.
</para>

<para><programlisting>
<prompt>bash$</prompt> ls /root
<prompt>bash$</prompt> /sbin/shutdown -h now
<prompt>bash$</prompt> su -</programlisting></para>
    </sect2>

    <sect2>
      <title>Systeem afsluiten</title>

      <para>Keer terug naar tty1 waar root is ingelogd.</para>

<para><programlisting><prompt>bash#</prompt> shutdown -h now</programlisting></para>
    </sect2>
  </sect1>
</chapter>
