[OpenBSD]

[FAQ Index] [Naar Sectie 9 - Migreren naar OpenBSD] [Naar Sectie 11 - Het X Window System]

10 - Systeembeheer


Inhoudsopgave


10.1 - Waarom zegt hij dat ik in de verkeerde groep zit wanneer ik door su root probeer te worden?

Bestaande gebruikers moeten met de hand toegevoegd worden aan de "wheel" groep. Dit wordt gedaan om veiligheidsredenen, en u kan beter voorzichtig zijn met aan wie u toegang geeft. Op OpenBSD is het gebruikers die in de wheel groep zitten, toegelaten om het su(1) userland programma te gebruiken om root te worden. Gebruikers die niet in "wheel" zitten, kunnen su(1) niet gebruiken. Hier is een voorbeeld van een /etc/group entry om de gebruiker ericj in de "wheel" groep te plaatsen.

Als u een gebruiker aan het toevoegen bent met adduser(8), kan u ze in de wheel groep zetten door wheel te antwoorden op de vraag "Invite user into other groups:". Dit zal hen toevoegen aan /etc/group, dat er ongeveer als volgt zal uitzien:

wheel:*:0:root,ericj

Als u een manier zoekt om gebruikers beperkte toegang tot superuser privileges te geven zonder hen in de "wheel" groep te zetten, gebruik dan sudo(8).

10.2 - Hoe dupliceer ik een bestandssysteem?

Om uw bestandssysteem te dupliceren, gebruikt u dump(8) en restore(8). Om bijvoorbeeld alles onder directory SRC naar directory DST te dupliceren, doet u:

# cd /SRC; dump 0f - . | (cd /DST; restore -rf - )

dump is ontworpen om u een waaier aan backup mogelijkheden te geven, en het kan overkill zijn als u gewoon een onderdeel van (of een volledig) bestanddsysteem wil dupliceren. Het commando tar(1) kan voor deze handeling sneller zijn. Het formaat ziet er heel gelijkaardig uit:

# cd /SRC; tar cf - . | (cd /DST; tar xpf - )

10.3 - Hoe start ik daemons op met het systeem? (Overzicht van rc(8))

OpenBSD gebruikt een rc(8) stijl startup. Deze gebruikt een aantal sleutelbestanden om op te starten.

Hoe werkt rc(8)?

De hoofdbestanden waarop een systeembeheerder zich zou moeten concentreren, zijn /etc/rc.conf (of /etc/rc.conf.local), /etc/rc.local en /etc/rc.shutdown. Om een zicht te krijgen op hoe de rc(8) procedure werkt, volgt hier het schema:

Nadat de kernel geboot is, wordt /etc/rc gestart:

Daemons en Services Starten die bij OpenBSD zitten

De meeste daemons en services die standaard bij OpenBSD zitten, kunnen bij het booten gestart worden door eenvoudigweg het /etc/rc.conf configuratiebestand te bewerken. Neem om te beginnen een kijkje naar het standaard /etc/rc.conf bestand. U zal lijnen zien gelijkaardig aan deze:

ftpd_flags=NO # for non-inetd use: ftpd_flags="-D"

Een lijn als deze toont dat ftpd niet samen met het systeem moet opstarten (tenminste niet via rc(8), lees de Anonymous FTP FAQ om hierover meer te lezen). In elk geval heeft elke lijn een stukje commentaar dat u de vlaggen toont voor NORMAAL gebruik van die daemon of service. Dit betekent niet dat u die daemon of service met die vlaggen moet draaien. Lees de relevante manual pagina om te zien hoe u die daemon of service kan laten opstarten op gelijk welke manier die u graag hebt. Hier is bijvoorbeeld de standaard lijn die hoort bij httpd(8).

httpd_flags=NO # for normal use: "" (or "-DSSL" after reading ssl(8))

Hier kan u duidelijk zien dat bij het normaal opstarten van httpd geen vlaggen nodig zijn. Dus een lijn als: " httpd_flags=""" zou nodig zijn. Maar om httpd op te starten met ssl ingeschakeld (raadpleeg de SSL FAQ of ssl(8)) zou u moeten beginnen met een lijn als: "httpd_flags="-DSSL"".

Een goede aanpak is om nooit /etc/rc.conf zelf aan te raken. Maak in plaats daarvan het bestand /etc/rc.conf.local aan, kopieer gewoon de lijnen die u gaat veranderen vanuit /etc/rc.conf en pas ze aan zoals u wenst. Dit maakt toekomstige upgrades makkelijker -- alle veranderingen zitten in één bestand.

Lokale daemons opstarten en configuratie

Voor andere daemons die u misschien op het systeem zou installeren via packages of andere manieren, gebruikt u best het /etc/rc.local bestand. Ik heb bijvoorbeeld een daemon geïnstalleerd op /usr/local/sbin/daemonx. Ik wil hem opstarten bij het booten. Ik zou een entry als deze in /etc/rc.local zetten:

if [ -x /usr/local/sbin/daemonx ]; then echo -n ' daemonx'; /usr/local/sbin/daemonx fi

(Als de daemon zich niet automatisch losmaakt bij het opstarten, onthou dan om een "&" toe te voegen aan het uiteinde van de commandoregel.)

Van nu af zal deze daemon gestart worden bij het booten. U zal fouten kunnen zien bij het booten, een normale boot zonder errors zou een lijn als deze vertonen:

Starting local daemons: daemonx.

rc.shutdown

/etc/rc.shutdown is een script dat uitgevoerd wordt bij het afsluiten. Al wat u wil dat er gedaan wordt alvorens het systeem afsluit, moet aan dit bestand toegevoegd worden. Als u apm hebt, kan u ook "powerdown=YES" instellen, wat u het equivalent van "shutdown -p" zal geven.

10.4 - Waarom krijgen gebruikers "relaying denied" wanneer ze van ergens anders mail versturen via mijn OpenBSD systeem?

Probeer dit:

# grep relay-domains /etc/mail/sendmail.cf

De uitvoer kan er ongeveer zo uitzien:

FR-o /etc/mail/relay-domains

Als dit bestand niet bestaat, maak het dan aan. U zal de hosts moeten invoeren die vanop afstand mail versturen, met de volgende syntaxis:

.domain.com #Allow relaying for/to any host in domain.com sub.domain.com #Allow relaying for/to sub.domain.com and any host in that domain 10.2 #Allow relaying from all hosts in the IP net 10.2.*.*

Vergeet niet om een 'HangUP' signaal te sturen naar sendmail, (een signaal dat de meeste daemons hun configuratiebestand opnieuw laat inlezen):

# kill -HUP `head -1 /var/run/sendmail.pid`

Verdere Leesvoer

10.5 - Ik heb POP ingesteld, maar gebruikers hebben problemen met mail opvragen via POP. Wat kan ik doen?

De meeste problemen die te maken hebben met POP, zijn problemen met tijdelijke bestanden en lock-bestanden. Als uw pop server een foutboodschap als deze stuurt:

-ERR Couldn't open temporary file, do you own it?

Probeer dan uw permissies als volgt in te stellen:

permissie in /var drwxrwxr-x 2 bin mail 512 May 26 20:08 mail permissies in /var/mail -rw------- 1 username username 0 May 26 20:08 username

Iets anders om na te gaan is dat de gebruiker werkelijk zijn/haar eigen /var/mail bestand bezit. Natuurlijk zou dit het geval moeten zijn (zoals /var/mail/joe bezit van joe zou moeten zijn) maar als dit niet correct is ingesteld, zou dat het probleem kunnen zijn!

Natuurlijk, /var/mail schrijfbaar maken voor de groep mail opent enkele vage en obscure beveiligingsproblemen. Het is waarschijnlijk dat u er nooit problemen mee zal hebben. Maar het zou kunnen (vooral als u een high profile site, ISP,... bent)! Er zijn verscheidene POP servers die u meteen kan installeren vanuit de ports collectie. Indien mogelijk, gebruik dan popa3d die beschikbaar is in de OpenBSD basisinstallatie. Of, u zou gewoon de verkeerde opties geselecteerd kunnen hebben voor uw pop daemon (zoals dot locking). Of, u moet misschien gewoon de directory veranderen waarin hij lockt (hoewel de locking dan alleen waardevol zou zijn voor de POP daemon.)

Opmerking: OpenBSD heeft geen groepnaam "mail". U moet deze aanmaken in uw /etc/group bestand als u hem nodig hebt. Een entry als:

mail:*:6:

zou volstaan.

10.6 - Waarom negeert Sendmail het /etc/hosts bestand?

Standaard gebruikt Sendmail DNS voor naamresolutie, niet het /etc/hosts bestand. Het gedrag kan veranderd worden door gebruik van het /etc/mail/service.switch bestand.

Indien u het hosts bestand wil raadplegen vóór DNS servers, maak dan een /etc/mail/service.switch bestand aan dat de volgende lijn bevat:

hosts files dns

Als u ENKEL het hosts bestand wenst te raadplegen, gebruik dan het volgende:

hosts files

Stuur Sendmail een HUP signaal:

# kill -HUP `head -1 /var/run/sendmail.pid`

en de veranderingen zullen resultaat hebben.

10.7 - Een Secure HTTP server opzetten met SSL(8)

OpenBSD wordt verspreid met een SSL-ready httpd en RSA libraries. Voor gebruik met httpd(8), moet u eerst een certificaat laten aanmaken. Dit zal bewaard worden in /etc/ssl/ met de overeenkomstige sleutel in /etc/ssl/private/. De hier getoonde stappen zijn voor een deel overgenomen van de ssl(8) man pagina. Raadpleeg die voor verdere informatie. Deze FAQ entry schetst alleen hoe u een RSA certificaat aanmaakt voor web servers, niet een DSA server certificaat. Om te weten te komen hoe u dat doet, raadpleeg alstublieft de ssl(8) man pagina.

Om te beginnen, moet u uw server sleutel en certificaat maken met OpenSSL:

# openssl genrsa -out /etc/ssl/private/server.key 1024

Of, als u wenst dat de sleutel vercijferd wordt met een passphrase die u zal moeten intypen bij het starten van de servers

# openssl genrsa -des3 -out /etc/ssl/private/server.key 1024

De volgende stap is het genereren van een Certificate Signing Request dat gebruikt wordt om een Certifying Authority (CA) uw certificaat te laten ondertekenen. Om dit te doen, gebruikt u het commando:

# openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

Dit server.csr bestand kan vervolgens aan een Certifying Authority gegeven worden die de sleutel zal ondertekenen. Eén zulke CA is Thawte Certification die u kan bereiken op http://www.thawte.com/.

Als u zich dat niet kan veroorloven, of gewoon zelf het certificaat wil ondertekenen, kan u het volgende gebruiken.

# openssl x509 -req -days 365 -in /etc/ssl/private/server.csr \ -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

Met /etc/ssl/server.crt en /etc/ssl/private/server.key op hun plaats, zou u httpd(8) moeten kunnen starten met de -DSSL vlag (zie de sectie over rc(8) in deze faq), wat https transacties met uw machine toelaat op poort 443.

10.8 - Ik bewerkte /etc/passwd, maar de veranderingen leken geen effect te hebben. Waarom?

Als u /etc/passwd rechtstreeks bewerkt, zullen uw wijzigingen verloren gaan. OpenBSD genereert /etc/passwd dynamisch met pwd_mkdb(8). Het hoofdwachtwoordbestand in OpenBSD is /etc/master.passwd. Volgens pwd_mkdb(8),

FILES /etc/master.passwd current password file /etc/passwd a 6th Edition-style password file /etc/pwd.db insecure password database file /etc/pwd.db.tmp temporary file /etc/spwd.db secure password database file /etc/spwd.db.tmp temporary file

In een traditioneel Unix wachtwoordbestand, zoals /etc/passwd, is alles, met inbegrip van het vercijferde wachtwoord van de gebruiker, beschikbaar voor gelijk wie op het systeem (en is een uitstekend doelwit voor programma's als Crack). 4.4BSD introduceerde het master.passwd bestand, dat een uitgebreid formaat heeft (met bijkomende opties bovenop die voorzien door /etc/passwd) en enkel door root leesbaar is. Voor snellere toegang tot gegevens, lezen de library aanroepen die deze gegevens opvragen, normaal gezien /etc/pwd.db en /etc/spwd.db.

OpenBSD voorziet een tool waarmee u uw wachtwoordbestand zou moeten bewerken. Het heet vipw(8). Vipw zal vi (of uw favoriete editor gedefinieerd door $EDITOR) gebruiken om /etc/master.passwd te bewerken. Nadat u gedaan hebt met bewerken, zal het /etc/passwd, /etc/pwd.db, en /etc/spwd.db opnieuw aanmaken met uw wijzigingen. Vipw zorgt ook voor het locken van deze bestanden, zodat als iemand anders probeert om ze terzelfdertijd te veranderen, hun de toegang geweigerd zal worden.

10.9 - Wat is de beste manier om gebruikers toe te voegen en te verwijderen?

OpenBSD voorziet twee commando's om gemakkelijk gebruikers toe te voegen aan het systeem:

U kan ook met de hand gebruikers toevoegen met vipw(8), maar dit is moeilijker voor de meeste handelingen.

De gemakkelijkste manier om een gebruiker toe te voegen in OpenBSD is door het adduser(8) script te gebruiken. U kan adduser(8) configureren door /etc/adduser.conf te bewerken. adduser(8) laat consistentiecontrole toe op /etc/passwd, /etc/group, en shell databanken. Het zal de entries en $HOME directories voor u maken. Het kan zelfs een bericht naar de gebruiker versturen om ze te verwelkomen. Hier is een voorbeeldgebruiker, testuser, die toegevoegd wordt aan het systeem. Hij/zij zal de $HOME directory /home/testuser krijgen, lid gemaakt worden van de groep guest, en de shell /bin/ksh krijgen.

# adduser Use option ``-silent'' if you don't want to see all warnings and questions. Reading /etc/shells Reading /etc/login.conf Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username []: testuser Enter full name []: Test FAQ User Enter shell csh ksh nologin sh [sh]: ksh Uid [1002]: Enter Login group testuser [testuser]: guest Login group is ``guest''. Invite testuser into other groups: guest no [no]: no Login class auth-defaults auth-ftp-defaults daemon default staff [default]: Enter Enter password []: Type password, then Enter Enter password again []: Type password, then Enter Name: testuser Password: **** Fullname: Test FAQ User Uid: 1002 Gid: 31 (guest) Groups: guest Login Class: default HOME: /home/testuser Shell: /bin/ksh OK? (y/n) [y]: y Added user ``testuser'' Copy files from /etc/skel to /home/testuser Add another user? (y/n) [y]: n Goodbye!

Om gebruikers te verwijderen zou u de rmuser(8) utility moeten gebruiken. Dit zal elk bestaan van een gebruiker verwijderen. Het zal crontab(1) entries, hun $HOME dir (als deze toebehoort aan de gebruiker in kwestie), en hun mail verwijderen. Natuurlijk zal het ook hun /etc/passwd en /etc/group entries verwijderen. Het volgende is een voorbeeld van het verwijderen van de gebruiker die hierboven werd toegevoegd. Merk op dat u gevraagd wordt om de naam, en of u al dan niet de home directory van de gebruiker wil verwijderen.

# rmuser Enter login name for user to remove: testuser Matching password entry: testuser:$2a$07$ZWnBOsbqMJ.ducQBfsTKUe3PL97Ve1AHWJ0A4uLamniLNXLeYrEie:1002 :31::0:0:Test FAQ User:/home/testuser:/bin/ksh Is this the entry you wish to remove? y Remove user's home directory (/home/testuser)? y Updating password file, updating databases, done. Updating group file: done. Removing user's home directory (/home/testuser): done.

Gebruikers toevoegen met user(8)

Deze tools zijn minder interactief dan het adduser(8) commando, wat ze gemakkelijker maakt om in scripts te gebruiken.

De volledige verzameling tools is:

Daadwerkelijk gebruikers toevoegen

Aangezien user(8) niet interactief is, is de gemakkelijkste manier om gebruikers efficiënt toe te voegen, het adduser(8) commando te gebruiken. Het eigenlijke commando /usr/sbin/user is gewoon een front-end voor de rest van de /usr/sbin/user* commando's. Daarom kunnen de volgende commando's toegevoegd worden door user add of useradd te gebruiken, het is uw keuze zoals u wil, en het verandert het gebruik van de commando's helemaal niet.

In dit voorbeeld voegen we dezelfde gebruiker toe met dezelfde specificaties als de gebruiker die hierboven werd toegevoegd. useradd(8) is veel gemakkelijker om te gebruiken als u de standaard instelling kent alvorens een gebruiker toe te voegen. Deze instellingen staan in /etc/usermgmt.conf en kunnen als volgt gezien worden:

$ user add -D group users base_dir /home skel_dir /etc/skel shell /bin/csh inactive 0 expire Null (unset) range 1000..60000

De bovenstaande instellingen zijn wat zal ingesteld worden tenzij u anders specificeert met commandoregelopties. In ons geval willen we de gebruiker bijvoorbeeld tot de groep guest, niet users laten horen. Nog een kleine hindernis bij het toevoegen van gebruikers, is dat wachtwoorden gespecificeerd moeten worden op de commandoregel. Het gaat om de vercijferde wachtwoorden, dus u moet eerst de encrypt(1) utility gebruiken om het wachtwoord aan te maken. Bijvoorbeeld: OpenBSD's wachtwoorden gebruiken standaard het Blowfish algoritme voor 6 rondes. Hier is een voorbeeldlijn om een vercijferd wachtwoord aan te maken om op te geven aan useradd(8).

$ encrypt -p -b 6 Enter string: $2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq

Nu we ons vercijferd wachtwoord hebben, zijn we klaar om de gebruiker toe te voegen.

# user add -p '$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq' -u 1002 \ -s /bin/ksh -c "Test FAQ User" -m -g guest testuser

Opmerking: Zorg ervoor om ' ' (enkelvoudige aanhalingstekens) rond de wachtwoordstring te gebruiken, geen " " (dubbele aanhalingstekens) aangezien de shell deze zal interpreteren alvorens het naar user(8) te sturen. Zorg er bovendien voor dat u de -m optie specificeert als u wil dat de home directory van de gebruiker wordt aangemaakt en de bestanden vanuit /etc/skel overgekopieerd worden.

Om te zien of de gebruiker juist werd aangemaakt, kunnen we vele verschillende utilities gebruiken. Hieronder zijn een aantal commando's die u kan gebruiken om snel na te gaan of alles juist werd aangemaakt.

$ ls -la /home total 14 drwxr-xr-x 5 root wheel 512 May 12 14:29 . drwxr-xr-x 15 root wheel 512 Apr 25 20:52 .. drwxr-xr-x 24 ericj wheel 2560 May 12 13:38 ericj drwxr-xr-x 2 testuser guest 512 May 12 14:28 testuser $ id testuser uid=1002(testuser) gid=31(guest) groups=31(guest) $ finger testuser Login: testuser Name: Test FAQ User Directory: /home/testuser Shell: /bin/ksh Last login Sat Apr 22 16:05 (EDT) on ttyC2 No Mail. No Plan.

Bovenop deze commando's, voorziet user(8) zijn eigen utility om gebruikerseigenschappen te tonen, genaamd userinfo(8).

$ userinfo testuser login testuser passwd * uid 1002 groups guest change Wed Dec 31 19:00:00 1969 class gecos Test FAQ User dir /home/testuser shell /bin/ksh expire Wed Dec 31 19:00:00 1969

Gebruikers verwijderen

Om gebruikers te verwijderen met de user(8) hiërarchie van commando's, zal u userdel(8) gebruiken. Dit is een heel eenvoudig, maar bruikbaar commando. Om de gebruiker die in het laatste voorbeeld werd aangemaakt, te verwijderen, doet u gewoon

# userdel -r testuser

Bemerk de -r optie, die moet opgegeven worden als u wil dat de home directory van de gebruiker eveneens verwijderd wordt. Als alternatief kan u -p en niet -r specificeren en dit zal de account van de gebruiker locken, maar geen informatie verwijderen.

10.10 - Hoe maak ik een ftp-only account aan (niet anonymous FTP!)?

Er zijn een aantal manieren om dit te doen, maar een veel voorkomende manier om dit te doen is door "/usr/bin/false" toe te voegen aan "/etc/shells". Wanneer u vervolgens de shell van een gebruiker instelt op "/usr/bin/false", zullen ze niet interactief kunnen inloggen, maar wel ftp mogelijkheden kunnen gebruiken. U wil misschien ook de toegang beperken door gebruikers in hun home directory vast te zetten in ftpd.

10.11 - Quota's instellen

Quota's worden gebruikt om ruimte voor gebruikers die ze voor zichzelf ter beschikking hebben, te beperken op uw schijven. Dit kan heel nuttig zijn in situaties waarin u beperkte middelen hebt. Quota's kunnen ingesteld worden per gebruiker en/of per groep.

De eerste stap om quota's in te stellen is er voor te zorgen dat "option QUOTA" in uw Kernel Configuratie staat. Deze optie staat in de GENERIC kernel. Daarna moet u in /etc/fstab de bestandssystemen aangeven waarbij quota's zullen ingeschakeld worden. De sleutelwoorden userquota en groupquota moeten gebruikt worden om elk bestandssysteem aan te duiden waarop u quota's zal gaan gebruiken. Standaard zullen de bestanden quota.user en quota.group aangemaakt worden in de root van dat bestandssysteem om de quota informatie te bewaren. Deze standaard kan overschreven worden door de bestandsnaam te specificeren bij de quota optie in /etc/fstab, zoals "userquota=/var/quotas/quota.user". Hier is een voorbeeld van /etc/fstab die één bestandssysteem heeft met userquota's ingeschakeld, en het quotabestand in een niet-standaard locatie:

/dev/wd0a / ffs rw,userquota=/var/quotas/quota.user 1 1

Nu is het tijd om de quota's voor de gebruiker in te stellen. Om dat te doen gebruikt u de utility edquota(8). Een eenvoudig gebruik is gewoon "edquota <user>". edquota(8) zal vi(1) gebruiken om de quota's aan te passen tenzij de omgevingsvariabele EDITOR ingesteld is op een andere editor. Bijvoorbeeld:

# edquota ericj

Dit zal uitvoer geven gelijkaardig aan deze:

Quotas for user ericj: /: blocks in use: 62, limits (soft = 0, hard = 0) inodes in use: 25, limits (soft = 0, hard = 0)

Om limieten toe te voegen, bewerkt u het om resultaten als deze te geven:

Quotas for user ericj: /: blocks in use: 62, limits (soft = 1000, hard = 1050) inodes in use: 25, limits (soft = 0, hard = 0)

Merk op dat de quota toekenning in 1k blokken gebeurt. In dit geval is de softlimit ingesteld op 1000k, en de hardlimit op 1050k. Een softlimit is een limiet waarbij de gebruikers gewoon gewaarschuwd worden als ze er over gaan en tot hun grace period voorbij is, de tijd hebben om hun schijfgebruik onder hun limiet te brengen. Grace periods kunnen ingesteld worden met de -t optie van edquota(8). Nadat de grace period voorbij is, wordt de softlimit behandeld als een hardlimit. Dit leidt gewoonlijk tot een allocatiefout.

Nu de quota's ingesteld zijn, moet u de quota's aanzetten. Om dit te doen gebruikt u quotaon(8). Bijvoorbeeld:

# quotaon -a

Dit loopt /etc/fstab af om de bestandssystemen met quota-opties aan te zetten. Nu de quota's goed en wel draaien, kan u ze zien met quota(1). Een commando "quota <user>" zal de informatie voor die gebruiker geven. Wanneer het opgeroepen wordt zonder argumenten, zal het quota(1) commando uw quota statistieken geven. Bijvoorbeeld:

# quota ericj

Zal leiden tot uitvoer gelijkaardig aan:

Disk quotas for user ericj (uid 1001): Filesystem blocks quota limit grace files quota limit grace / 62 1000 1050 27 0 0

Standaard zullen quota's ingesteld in /etc/fstab opgestart worden bij het booten. Om ze uit te zetten, gebruikt u

# quotaoff -a

10.12 - KerberosV Clients en Servers instellen

OpenBSD bevat KerberosV als een voorgeïnstalleerde component van het standaard systeem.

Gebruik voor meer informatie over KerberosV, vanaf uw OpenBSD systeem, het commando:

# info heimdal

10.13 - Anonymous FTP Diensten opzetten

Anonymous FTP laat gebruikers zonder account toe om bestanden op uw computer op te vragen via het File Transfer Protocol. Hier zal een overzicht gegeven worden van het instellen van de anonymous FTP server, zijn logging, enz.

De FTP account toevoegen

Om te beginnen moet u een ftp account op uw systeem hebben. Deze account mag geen bruikbaar wachtwoord hebben. Hier zullen we de login directory op /home/ftp instellen, maar u kan deze zetten waar u maar wil. Bij gebruik van anonymous ftp, zal de daemon zichzelf chroot'en in de home directory van de ftp gebruiker. Om daarover meer te lezen, leest u de ftpd(8) en chroot(2) man pagina's. Hier is een voorbeeld van het toevoegen van de ftp gebruiker. Ik zal dit doen met adduser(8). We moeten ook /usr/bin/false toevoegen aan onze /etc/shells, dit is de "shell" die we aan de ftp gebruiker zullen geven. Dit zal hun niet toelaten in te loggen, ook al zullen we hen een leeg wachtwoord geven. Om dit te doen kan u gewoon het volgende doen:

echo /usr/bin/false >> /etc/shells
Daarna bent u klaar om de ftp gebruiker toe te voegen:
# adduser Use option ``-silent'' if you don't want to see all warnings and questions. Reading /etc/shells Reading /etc/login.conf Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username []: ftp Enter full name []: anonymous ftp Enter shell csh false ksh nologin sh tcsh zsh [sh]: false Uid [1002]: Enter Login group ftp [ftp]: Enter Login group is ``ftp''. Invite ftp into other groups: guest no [no]: no Login class auth-defaults auth-ftp-defaults daemon default staff [default]: Enter Enter password []: Enter Set the password so that user cannot logon? (y/n) [n]: y Name: ftp Password: **** Fullname: anonymous ftp Uid: 1002 Gid: 1002 (ftp) Groups: ftp Login Class: default HOME: /home/ftp Shell: /usr/bin/false OK? (y/n) [y]: y Added user ``ftp'' Copy files from /etc/skel to /home/ftp Add another user? (y/n) [y]: n Goodbye!

Directory Instelling

Samen met de gebruiker, heeft dit de directory /home/ftp aangemaakt. Dit is wat we willen, maar er zijn enkele veranderingen die we zullen moeten doen om het klaar te maken voor anonymous ftp. Opnieuw worden deze veranderingen uitgelegd in de ftpd(8) man pagina.

U moet NIET een /home/ftp/usr of /home/ftp/bin directory aanmaken.

Merk op dat al deze directories ''root'' als owner zouden moeten hebben. Hier is een lijst van hoe de directories er zouden moeten uitzien na het aanmaken.

# pwd /home # ls -laR ftp total 5 dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 . drwxr-xr-x 7 root wheel 512 Jul 6 10:58 .. dr-x--x--x 2 root ftp 512 Jul 6 11:34 etc dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 pub ftp/etc: total 43 dr-x--x--x 2 root ftp 512 Jul 6 11:34 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 .. -r--r--r-- 1 root ftp 316 Jul 6 11:34 group -r--r--r-- 1 root ftp 40960 Jul 6 11:34 pwd.db ftp/pub: total 2 dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 ..

De server opstarten en loggen

U kan kiezen of u ftpd laat opstarten door inetd(8) of via de rc scripts. Deze voorbeelden zullen tonen dat onze daemon opgestart wordt vanuit inetd.conf. Eerst moeten we vertrouwd raken met enkele van de opties van ftpd. De standaard lijn van /etc/inetd.conf is:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US

Hier wordt ftpd aangeroepen met -US. Dit zal anonymous verbindingen loggen naar /var/log/ftpd en aan de gang zijnde sessies naar /var/run/utmp. Dat zal toelaten om deze sessies te zien met who(1). Voor sommigen wil u misschien alleen een anonymous server draaien, en ftp niet toestaan voor gebruikers. Om dat te doen moet u ftpd aanroepen met de -A optie. Hier is een lijn die ftpd opstart enkel voor anonymous verbindingen. Deze gebruikt ook -ll wat elke verbinding logt naar syslog, samen met de get, retrieve, enz, ftp commando's.

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -llUSA

Opmerking: Voor mensen die DRUK verkeer ftp servers gebruiken, wil u misschien ftpd niet aanroepen vanuit inetd.conf. De beste optie is om de ftpd lijn in inetd.conf te commentariëren en ftpd te starten vanuit rc.conf.local samen met de -D optie. Dit zal ftpd starten als een daemon, en heeft veel minder overhead dan ftp starten vanuit inetd. Hier is een voorbeeldlijn om het te starten vanuit rc.conf.local.

ftpd_flags="-DllUSA" # for non-inetd use: ftpd_flags="-D"

Dit werkt natuurlijk alleen als u ftpd uit /etc/inetd.conf gehaald hebt en inetd zijn configuratiebestand opnieuw heeft laten lezen.

Andere relevante bestanden

10.14 - Gebruikers vastzetten in hun home directories in ftpd(8)

Standaard kunnen gebruikers, wanneer ze inloggen via ftp, naar gelijk welke directory gaan op het bestandssysteem waar ze toegang toe hebben. Dit kan in sommige gevallen niet gewenst zijn. Het is mogelijk om te beperken wat gebruikers kunnen zien via ftp sessies, door ze te chroot'en in hun home directory.

Als u alleen chrooted ftp logins wenst toe te laten, gebruik dan de -A optie van ftpd(8).

Als u ze nauwkeuriger wil toepassen, maken OpenBSD's login capability infrastructuur en ftpd(8) dit samen gemakkelijk.

Gebruikers in een login klasse met de ftp-chroot variabele ingesteld, worden automatisch gechroot. Bovendien kan u een gebruikersnaam toevoegen aan het bestand /etc/ftpchroot om die gebruikersnamen te chroot'en. Een gebruiker moet slechts op één van deze plaatsen vermeld staan.

10.15 - Patches aanbrengen in OpenBSD

Zelfs in OpenBSD komen er bugs voor. Sommige bugs kunnen tot betrouwbaarheidsproblemen leiden (dus iets kan ervoor zorgen dat het systeem ophoudt te functioneren zoals gewenst). Andere bugs kunnen tot beveiligingsproblemen leiden (wat anderen kan toelaten uw computer op onbedoelde manieren te "gebruiken"). Wanneer een kritieke bug gevonden wordt, zal de correctie gecommit worden in de -current source tree, en zullen patches verschijnen voor de ondersteunde versies van OpenBSD. Deze patches verschijnen op de errata webpagina, en worden onderverdeeld in "algemene" errata die alle platformen treffen, en errata die slechts individuele platformen treffen.

Merk echter op dat er geen patches gemaakt worden voor nieuwe toevoegingen aan OpenBSD, en dat dit alleen gedaan wordt voor belangrijke betrouwbaarheids- of beveiligingsproblemen die best meteen worden aangepakt op getroffen systemen (wat vaak NIET alle systemen is, afhankelijk van hun doel).

Er zijn drie manieren om uw systeem te updaten met gepatchte code:

Opnieuw, individuele bestanden patchen is niet altijd eenvoudig, dus denk ernstig na over het volgen van de -stable (of "patch") branch van OpenBSD. Het mengen en laten overeenstemmen van patch-oplossingen kan gedaan worden als u begrijpt hoe alles werkt, maar nieuwe gebruikers kiezen er best een methode uit en houden zich daaraan.

Hoe verschillen "errata" patches van wat er in de CVS tree zit?

Alle patches vermeld op de errata webpagina zijn patches rechtstreeks tegen de source tree van de aangegeven release. Patches tegen de laatse CVS tree zouden ook andere veranderingen kunnen bevatten die niet gewenst zouden zijn op een release systeem. Dit is belangrijk: Als u een snapshot geïnstalleerd hebt, de source trees uitgecheckt hebt op het tijdstip wanneer u dat snapshot verkreeg en deze probeert te patchen met een gepubliceerde patch, kan u mogelijk vaststellen dat de patch niet werkt, aangezien de code kan veranderd zijn.

Patches aanbrengen.

Patches voor het OpenBSD Besturingssysteem worden verspreid als "Unified diffs", dit zijn tekstbestanden die verschillen met de oorspronkelijke broncode bevatten. Ze worden NIET verspreid in binaire vorm. Dit betekent dat u om uw systeem te patchen, de broncode van de RELEASE versie van OpenBSD beschikbaar en klaar voor gebruik moet hebben. In het algemeen moet u de volledige source tree ter beschikking hebben. Als u een release van de officiële CD-ROM draait, zijn de source trees beschikbaar op schijf 3, ze zijn ook als bestanden beschikbaar via de FTP servers. We zullen veronderstellen dat u de volledige tree uitgecheckt hebt.

Voor ons voorbeeld hier, zullen we naar patch 001 voor OpenBSD 3.6 kijken, die te maken heeft met de st(4) driver, die tape drives afhandelt. Zonder deze patch, is het herstellen van gegevens van backups erg moeilijk. Mensen die een tape drive gebruiken hebben deze patch nodig, zij zonder tape drive hebben misschien niet bepaald de behoefte om deze te installeren. Laten we de patch bekijken:

# more 001_st.patch Apply by doing: cd /usr/src patch -p0 < 001_st.patch Rebuild your kernel. Index: sys/scsi/st.c =================================================================== RCS file: /cvs/src/sys/scsi/st.c,v retrieving revision 1.41 retrieving revision 1.41.2.1 diff -u -p -r1.41 -r1.41.2.1 --- sys/scsi/st.c 1 Aug 2004 23:01:06 -0000 1.41 +++ sys/scsi/st.c 2 Nov 2004 01:05:50 -0000 1.41.2.1 @@ -1815,7 +1815,7 @@ st_interpret_sense(xs) u_int8_t skey = sense->flags & SSD_KEY; int32_t info; - if (((sense->flags & SDEV_OPEN) == 0) || + if (((sc_link->flags & SDEV_OPEN) == 0) || (serr != 0x70 && serr != 0x71)) return (EJUSTRETURN); /* let the generic code handle it */
Zoals u zal opmerken, bevat het bovenste deel van de patch korte instructies omtrent het aanbrengen ervan. We zullen aannemen dat u deze patch in de /usr/src directory gezet hebt, in dat geval worden de volgende stappen gebruikt:
# cd /usr/src # patch -p0 < 001_st.patch Hmm... Looks like a unified diff to me... The text leading up to this was: -------------------------- |Apply by doing: | cd /usr/src | patch -p0 < 001_st.patch | |Rebuild your kernel. | |Index: sys/scsi/st.c |=================================================================== |RCS file: /cvs/src/sys/scsi/st.c,v |retrieving revision 1.41 |retrieving revision 1.41.2.1 |diff -u -p -r1.41 -r1.41.2.1 |--- sys/scsi/st.c 1 Aug 2004 23:01:06 -0000 1.41 |+++ sys/scsi/st.c 2 Nov 2004 01:05:50 -0000 1.41.2.1 -------------------------- Patching file sys/scsi/st.c using Plan A... Hunk #1 succeeded at 1815. <-- Hou deze boodschap in de gaten! done
Let op de "Hunk #1 succeeded" boodschap hierboven. Dit geeft aan dat de patch met succes werd aangebracht. Vele patches zijn complexer dan deze, en zullen meerdere "hunks" en meerdere bestanden met zich meebrengen, in dat geval moet u verifiëren dat alle hunks gelukt zijn op alle bestanden. Als dat niet gelukt is, betekent het gewoonlijk dat uw source tree niet juist is, u de instructies niet nauwkeurig gevolgd hebt, of uw patch vermengd was. Patches zijn heel gevoelig aan "white space" -- kopiëren en plakken vanuit uw browser zal vaak tab tekens veranderen naar spaties of op een andere manier de white space van een bestand veranderen, waardoor de patch ontoepasbaar wordt.

Op dit punt kan u de kernel bouwen zoals normaal, hem installeren en het systeem herstarten.

Niet alle patches zijn voor de kernel. In sommige gevallen zult u individuele utilities moeten herbouwen. Andere keren zal het vereist zijn dat u alle utilities hercompileert die statisch gelinkt zijn met een gepatchte library. Volg de begeleiding in de hoofding van de patch, en indien u onzeker bent, bouw dan het gehele systeem opnieuw.

Patches die irrelevant zijn voor uw bepaald systeem, hoeven niet aangebracht te worden -- gewoonlijk. Bijvoorbeeld, als u geen tape drive op uw systeem had, zou u geen voordeel hebben bij de bovenstaande patch. Patches worden echter verondersteld om "in volgorde" aangebracht te worden -- het is mogelijk dat een latere patch afhankelijk is van een vroegere. Wees u hiervan bewust als u verkiest om "uit te kiezen" welke patches u aanbrengt, en indien u twijfelt, breng ze dan allemaal aan, in volgorde.

10.16 - Vertel me over die chroot(2) Apache?

In OpenBSD werd de Apache httpd(8) server standaard chroot(2)ed. Hoewel dit een enorme bevordering is voor de veiligheid, kan het problemen scheppen, als u zich niet voorbereidt.

Wat is een chroot?

Een chroot(2)ed toepassing wordt opgesloten in een bepaalde directory en kan niet rondwaren in de rest van de directory tree, en ziet deze directory als zijn "/" (root) directory. In het geval van httpd(8), start het programma, opent zijn logbestanden, maakt zich vast aan zijn TCP poorten (het aanvaardt echter nog geen gegevens), en leest zijn configuratie. Vervolgens sluit het zichzelf op in /var/www en laat privileges vallen, daarna begint het aanvragen te aanvaarden. Dit betekent dat alle bestanden bediend en gebruikt door Apache in de /var/www directory moeten staan. In de standaardconfiguratie van OpenBSD kunnen alle bestanden in de /var/www directory alleen gelezen worden door de gebruiker die Apache draait, www. Dit helpt de veiligheid enorm -- als er een beveiligingsprobleem is met Apache, zal de schade beperkt blijven tot een enkele directory met slechts "read only" permissies en zonder middelen om onheil mee aan te richten.

Wat betekent dit voor de beheerder?

Botweg gezegd, is Apache chroot(2)en iets dat niet standaard gebeurt in de meeste andere besturingssystemen. Vele toepassingen en systeemconfiguraties zullen niet werken in een chroot(2) zonder wat aanpassing. Verder moet onthouden worden dat veiligheid en gemak vaak geen compatibele doelstellingen zijn. OpenBSD's implementatie van Apache compromitteert veiligheid niet voor functionaliteit of "gemak".

In sommige gevallen kan de toepassing of configuratie aangepast worden om binnen de chroot(2) te draaien. In andere gevallen zal u deze functionaliteit gewoon moeten uitschakelen met de -u optie voor httpd(8) in /etc/rc.conf.

Voorbeeld van een toepassing chroot(2)en: wwwcount

Als voorbeeld van een proces dat kan gebruikt worden om een toepassing te chroot'en, zullen we kijken naar wwwcount, een eenvoudige webpagina teller beschikbaar via packages. Hoewel dit een heel effectief programma is, weet het niets over chroot(2)ed Apache, en zal niet chroot(2)ed werken in zijn standaardconfiguratie.

Eerst installeren we de wwwcount package. We configureren en testen het, en we stellen vast dat het niet lijkt te werken, we krijgen een Apache boodschap die "Internal Server Error" zegt. De eerste stap is om Apache te stoppen en te herstarten met de -u vlag om te verifiëren dat het probleem in het chroot(2)en ligt, en niet in de systeemconfiguratie.

# apachectl stop /usr/sbin/apachectl stop: httpd stopped # httpd -u
Hierna zien we dat de teller juist werkt, ten minste nadat we de eigenaar van een directory veranderen zodat Apache (en de CGI's die het draait) kan schrijven naar de bestanden die het bijhoudt. We hebben dus zeker een chroot probleem, dus we stoppen en herstarten Apache opnieuw, met de standaard chrooting:
# apachectl stop /usr/sbin/apachectl stop: httpd stopped # httpd

Een goed vertrekpunt zou zijn om te veronderstellen dat wwwcount enkele libraries en andere bestanden gebruikt die het niet kan vinden vanuit de chroot. We kunnen het ldd(1) commando gebruiken om dynamische object dependencies te weten te komen die de CGI nodig heeft:

# cd /var/www/cgi-bin/ # ldd Count.cgi Count.cgi: Start End Type Ref Name 00000000 00000000 exe 1 Count.cgi 03791000 237ca000 rlib 1 /usr/lib/libc.so.30.3 03db4000 03db4000 rtld 1 /usr/libexec/ld.so
Ok, hier is een probleem, twee bestanden die niet beschikbaar zijn in de chroot(2) omgeving. We kopiëren ze dus:
# mkdir -p /var/www/usr/lib /var/www/usr/libexec # cp /usr/lib/libc.so.30.3 /var/www/usr/lib # cp /usr/libexec/ld.so /var/www/usr/libexec
en proberen de teller opnieuw.

Wel, nu draait het programma ten minste, en het geeft ons rechtstreeks foutboodschappen: "Unable to open config file for reading". Vooruitgang geboekt, maar nog niet klaar. Het configuratiebestand staat normaal in /var/www/wwwcount/conf, maar binnen de chroot omgeving, lijkt dat /wwwcount/conf te zijn. Onze mogelijkheden zijn ofwel het programma te hercompileren om het te laten werken waar de bestanden nu staan, of de gegevensbestanden te verplaatsen. Aangezien we van een package installeerden, zullen we gewoon het gegevensbestand verplaatsen. Om dezelfde configuratie ofwel chroot(2)ed of niet te gebruiken, zullen we een symbolische link gebruiken:

# mkdir -p /var/www/var/www # cd /var/www/var/www # ln -s ../../wwwcount wwwcount
Merk op dat de symbolische link gemaakt is om binnen de chroot te werken. Opnieuw testen we... en we stellen vast dat we nog een ander probleem hebben. Nu klaagt wwwcount dat het de "strip image" bestanden niet kan vinden die het gebruikt om boodschappen weer te geven. Na een beetje zoekwerk vinden we dat deze bewaard worden in /usr/local/lib/wwwcount, dus we moeten die ook nog in de chroot kopiëren.
# tar cf - /usr/local/lib/wwwcount | (cd /var/www; tar xpf - )
we testen opnieuw... en het werkt!

Merk op dat we alleen bestanden hebben gekopieerd die absoluut vereist zijn voor de werking. In het algemeen moet alleen het minimum aan bestanden nodig om een toepassing te draaien, gekopieerd worden in de chroot.

Moet ik de chroot functionaliteit gebruiken?

In het bovenstaande voorbeeld is het programma vrij eenvoudig, en toch hebben we verschillende soorten problemen gezien.

Niet elke toepassing kan of moet ge-chroot(2)ed worden.

De doelstelling is een veilige webserver, chroot(2)en is gewoon een hulpmiddel om dit te verwezenlijken, het is niet de doelstelling zelf. Onthou dat de beginconfiguratie van OpenBSD's gechroot(2)ed Apache is dat de gebruiker die het httpd(8) programma draait, geen andere programma's kan draaien, geen bestanden kan wijzigen, en niet de identiteit van een andere gebruiker kan aannemen. Versoepel deze beperkingen, en u hebt de beveiliging verminderd, chroot of geen chroot.

Sommige toepassingen zijn vrij eenvoudig, en ze chroot(2)en houdt steek. Andere zijn heel complex, en ofwel zijn ze niet de moeite om ze in een chroot(2) te dwingen, ofwel hebt u, tegen de tijd dat u voldoende van het systeem in de chroot kopieert, het voordeel van de chroot(2) omgeving verloren. Het OpenWebMail programma vereist bijvoorbeeld de mogelijkheid om te lezen en te schrijven naar de mail directory, de home directory van de gebruiker, en moet als gelijk welke gebruiker kunnen werken op het systeem. Proberen om het in een chroot te duwen zou volledig zinloos zijn, aangezien u uiteindelijk al de voordelen van chroot(2)en zou uitschakelen. Zelfs met een toepassing zo eenvoudig als de bovenstaande teller, die naar de schijf moet schrijven (om zijn tellers bij te houden), gaat het voordeel van de chroot(2) voor een deel verloren.

Gelijk welke toepassing die root-privileges moet aannemen om te werken is zinloos om te proberen chroot(2)en, aangezien root in het algemeen uit een chroot(2) kan ontsnappen.

Vergeet niet dat, als het chroot-proces voor uw toepassing te ingewikkeld is, u misschien het systeem niet zo vaak zal upgraden of updaten als u zou moeten doen. Dit kan uiteindelijk uw systeem MINDER veilig maken dan een meer onderhoudbaar systeem met de chroot functionaliteit uitgeschakeld.

10.17 - Kan ik de root shell wijzigen?

Er wordt soms gezegd dat men de root shell best nooit verandert, hoewel daarvoor geen reden is in OpenBSD.

De standaard shell voor root op OpenBSD is ksh.

Een traditionele Unix richtlijn is om alleen statisch gecompileerde shells te gebruiken voor root, omdat wanneer uw systeem in single user modus start, niet-root partities niet gemount zullen worden en dynamisch gelinkte shells geen toegang zullen hebben tot libraries in de /usr partitie. Dit is eigenlijk geen aanzienlijk probleem voor OpenBSD, aangezien het systeem u zal vragen om een shell wanneer het in single user modus start, en de standaard is sh. De drie standaard shells in OpenBSD (csh, sh en ksh) zijn allemaal statisch gelinkt, en dus bruikbaar in single user modus.

10.18 - Wat kan ik nog doen met ksh?

In OpenBSD is ksh eigenlijk pdksh, de Public Domain Korn Shell, en is dezelfde binary als sh.

Gebruikers die vertrouwd zijn met bash, vaak gebruikt op Linux systemen, zullen ksh waarschijnlijk heel vertrouwd vinden. Ksh(1) biedt de meeste van de veel gebruikte functionaliteiten in bash, inclusief tabvervollediging, commandoregelbewerking en geschiedenis via de pijltjestoetsen, en CTRL-A/CTRL-E om naar begin/einde van de commandoregel te springen. Als andere functionaliteiten van bash gewenst zijn, kan bash zelf geladen worden via ofwel packages of ports.

De commandoprompt van ksh kan makkelijk veranderd worden naar iets dat meer informatie biedt dan de standaard "$ " door de PS1 omgevingsvariable in te stellen. Bijvoorbeeld, het invoegen van de volgende lijn:

export PS1='$PWD $ '
in uw /etc/profile geeft de volgende commandoprompt:
/home/nick $
Zie het bestand /etc/ksh.kshrc, dat veel nuttige functionaliteiten en voorbeelden bevat, en aangeroepen kan worden in de .profile van uw gebruiker.

OpenBSD's ksh(1) werd verbeterd met een aantal "speciale tekens" voor de primaire prompt string, PS1, gelijkaardig aan die die gebruikt worden in bash. Bijvoorbeeld:

\e - Voeg een ASCII escape karakter in.
\h - De hostname, min domeinnaam.
\H - De volledige hostname, inclusief domeinnaam.
\n - Voeg een newline karakter in.
\t - De huidige tijd, in 24-uur HH:MM:SS formaat.
\u - De gebruikersnaam van de huidige gebruiker.
\w - De huidige werkdirectory. $HOME wordt afgekort als `~'.
\W - De basisnaam van de huidige werkdirectory.
\$ - Vertoont "#" voor root gebruikers, "$" voor niet-root gebruikers.
(zie de ksh(1) man pagina voor meer details, en nog veel meer speciale tekens! Merk ook op dat het "$" teken speciale betekenis heeft tussen dubbele aanhalingstekens, dus wees er voorzichtig mee)

Men zou het volgende commando kunnen gebruiken:

export PS1="\n\u@\H\n\w \\$ "
om een heel uitgebreide maar ietwat nuttige prompt te geven.

[FAQ Index] [Naar Sectie 9 - Migreren naar OpenBSD] [Naar Sectie 11 - Het X Window System]


[terug] www@openbsd.org
$OpenBSD: faq10.html,v 1.28 2007/11/17 12:49:52 tobias Exp $