************************************ Server routeduvel ************************************ INHOUD -------------------------------------------------------------------------- 1. Layout bestandsysteem 2. gebruikers beheren - http gebruiker toevoegen - andere gebruiker toevoegen (mail, ordinary user) - gebruikers verwijderen 3. apache server beheren 4. mailserver beheren 5. DNS beheren 6. MySQL databases, PostGreSQL databases 7. softwarepaketten beheren - binaire pkgsrc pakketten installeren, verwijderen, upgraden - pkgsrc tree gebruiken voor compileren - buiten pkgsrc om software installeren 8. software core OS beheren - basis spul in /usr - kernel spul (/sys) 9. core OS zelf configureren en tunen - netwerk interfaces - ipnat NAT instellingen - ipf firewall-instellingen - atactl harde-schijf instellingen - .... 1. LAYOUT BESTANDSSYSTEEM -------------------------------------------------------------------------- / 100MB (/dev/wd0a) root FS, bevat de kernel, en basisutilities nodig om op te starten, en mountpoints voor partities. /altroot 100MB (/dev/wd1a) alternatieve root FS op de 2e harde schijf, mirror van / en read-only gemount. Als wd0a niet meer werkt kan hier vanaf geboot worden. Moet zo nu en dan gesynct worden met / swap 256 MB /dev/wd0b swap 256 MB /dev/wd1b swappartities op elk aanwezig harde schijf moet een swappartitie aangemaakt worden, dit om performance redenen. het OS kiest zelf de harde schijf uit die het snelst is of het minste gebruikt wordt. /var 500MB filesystems voor variabele kortlevende bestanden als log- files en mail queue's /usr 500MB filesystem voor core-OS onderdelen en utilities, read-only gemount om root-kits te voorkomen (te voorkomen dat hackers ongemerkt het core-OS kunnen veranderen) /usr/local 500MB filesystem voor eigen software en scripts en simpele zelfgecompileerde software dat niet door een packagemanager wordt geregistreerd /opt 700MB filesystem voor additionele software dat niet door een pacakge- manager wordt geregistreerd, voor hele pakketten /usr/pkg 700MB filesystem voor software dat wordt beheerd door de pkgsrc package manager, kan zowel uit de /usr/pkgsrc tree worden gecompileerd als uit binairy pakketten. /tmp 500MB filesystem voor tijdelijke bestanden. kan eventueel no-exec worden gemount om hackers zo min mogelijk de mogelijkheid te geven malware te kunnen installeren en uitvoeren. Inhoud wordt bij elke reboot geleegd en eventueel periodiek ontdaan van oude bestanden. /var/tmp 300MB filesystem voor tijdelijke bestanden die niet worden geleegd tijdens rebooten e.d. en dus bewaard blijven. Ook eventueel no-exec mouten. /var/mail 700MB filesystem voor de user mailboxes voor inkomende mail van de mailserver. no-exec mounten. /var/databases 500MB filesystem voor de databases van mysql, postgresql, bind en eventuele andere databases. no-exec mounten. /users/mail 5GB filesystem voor homedirectories van users die een mailaccount hebben, waar hun unix account dus hoofdzakelijk voor de mail gebruikt wordt. Kunnen ook homepages in staan in /users/mail/$USER/public_html. Users hierin hebben de groep mail, de bestanden die erin staan ook, echter /users/mail/$USER/public_html hebben de groep www zodat de apache webserver erbij kan. Homedirs in de mode 711, zodat ze er alleen zelf in kunnen kijken maar wel de apache server erin kan voor de public_html directory. /users/http 2,5GB filesystem voor websites, staan homedirectories van unix users in die voor websites bedoeld zijn. Users hierin staan zelf in de groep http, de homedirs en bestanden zelf hebben echter de groep www zodat de apache server erbij kan en zij zelf niet in andermans websites kunnen snuffelen. De homedirs hebben de mode 770. /users/rembrandtkd 5GB filesystem voor lokale users en andere users die niet specifiek uitsluitend voor mail of een website op het systeem staan. Users en dirs hebben de groep 'users' en homedirs staan 711 /var/ftp 2,5GB filesystem voor de anonieme ftp site, zowel read-only als anoniem writable in /var/ftp/incoming /usr/pkgsrc 2GB filesystem met een buildtree voor het compileren van pkgsrc packages /usr/src 1GB filesystem met de operating system source en de kernel source, kan gebruikt worden voor upgraden en patchen van het core-OS /home 40MB filesystem (eigelijk achteraf niet nodig) met symlinks van alle gebruikers van het systeem naar de corresponderende echte homedirectories (bv /home/$MAILGEBRUIKER => /users/mail/$MAILGEBRUIKER) zodat gebruikers altijd makkelijk en uniform via /home/$GEBRUIKER hun eigen homedir kunnen vinden in (website) scripts e.d. Aanmerkingen: - de filesystem layout bestaat momenteel uit erg veel losse partities, kan verminderd worden, door voor een aantal doelen meerder partities tot een samen te voegen en via symlinks of hermounten naar originele mountpoints. Zo kan /tmp komen te vervallen en alleen /var/tmp bestaan, en de directory /var/tmp/tmp NULFS mounten op /tmp - de FS mogelijkheden zoveel mogelijk beperken door zaken no-exec, no-suid, nodev en zels read-only te mounten om eventuele hackers het zo moeilijk mogelijk te maken. Op /var, /var en /var/tmp na alle FS'en nocoredump mounten zodat niet overal core files kunnen komen te staan die hinderlijk zijn en gevoelige data in kan staan. FS'en met special mount-options: /altroot: read-only /usr: read-only /tmp: noexec, nodev /var/tmp: noexec, nodev /var/mail: noexec, nodev /users/*: nosuid /var/ftp: noexec, nodev /var/databases: noexec,nodev uitleg mount-options: read-only: FS kan nimmer op geschreven worden alleen van gelezen noexec: kunnen geen binaries en scripts vanaf uitgevoerd worden nosuid: de eventuele suid bit van binaries werken niet. suid bits geven binaries normaal de gelegenheid om zomaar van user te wisselen(bv root), gevaarlijk bij ongecontroleerde FS'en nodev: special device files die onbedoeld directe toegang kunnen verschaffen tot apparaten zijn ongeldig nocoredump: er kunnen geen coredump files op het FS gezet worden die automatisch onstaan nadat een programma gecrashed is -------------------------------------------------------------------------- 2. GEBRUIKERS BEHEREN -------------------------------------------------------------------------- Voor het toevoegen en verwijderen van gebruikers bestaan de tools useradd en userdel. Tevens kan door /etc/master.passwd en /etc/group te editten zaken als passwords, shells en group-owning worden aangepast. Voor het toevoegen van gebruikers voor websites bestaat een speciaal script om de vele losse zaken die hierbij gemoeid gaan te automatiseren. Het betreffende script staat in /usr/local/sbin/maakhttpgebruikeraan.sh Zaken die geautomatiseerd worden door dit script zijn: aanmaken van de gebruiker met de juiste homedirectory, shell en groep, aanmaken bestanden en directories in de homedirectory, het juist zetten van de mode en groep van de bestanden en directories, en het configureren van apache en postfix voor het configuren van het juiste webserverdomein en maildomein voor de gebruiker. HTTP USER TOEVOEGEN Voor het toevoegen van een user voor een website (http user) gebruikt men als eerste het useradd script: # maakhttpgebruikeraan.sh username websitedomein maildomein Waarbij: - username een logische username is, bijvoorbeeld njneindhoven Hiermee moet de webmaster inloggen. Geen spaties, hoofdletters of rare tekens, en liefst niet te lang. - websitedomein het domein is van de website zoals die in apache als virtual host wordt opgegeven, bijvoorbeeld www.eindhoven.njn.nl - maildomein het domein is van de website waarop mail ontvangen wordt en welke in de postfix mailserver wordt ingesteld als ontvangend maildomein. Bijvoorbeeld eindhoven.njn.nl Vervolgens moet een (al dan niet tijdelijk) wachtwoord aan de user gegeven worden: # passwd username Hierna moet blind 2x een nieuw wachtwoord voor de user ingevoerd worden. Typ van te voren een wachtwoord in bijvoorbeeld een texteditor, liefst combinatie met cijfers, hoofdletters en vreemde tekens maar wel te onthouden, en plak dat vervolgens 2x in de console. Hierna moet ervoor gezorgt worden dat het websitedomein en eventueel het maildomein ook in het echt gaan bestaan; dus in de DNS worden gezet en naar de juiste servers staan. Door het maakhttpgebruikeraan.sh script wordt het volgende gedaan: - maak gebruiker $username aan, homedirectory in /users/http/$usename, in groep http, shell /usr/pkg/bin/bash - maak symlink naar de homedir in /home/$username - verander groep van de bestanden in de homedirectory /users/http/$username in de groep www - zet de mode van de homedirectory /users/http/$username op 750 - zet de volgende symlinks en dirs in de homedirectory /users/http/$username: www/ (documentroot van de site) cgi-bin/ (map voor CGI programma's bereikbaar vanaf http://$sitenaam/cgi-bin) access.log (symlink naar /var/log/httpd/$sitenaam-acces_log, log bestand met alle sitebezoeken, read-only) error.log (symlink naar /var/log/httpd/$sitenaam-error_log, log bestand met alle problemen die optreden met de site, read-only) mailaliases.conf (symlink naar /usr/pkg/etc/postfix/vhosts/$maildomein, bestand waar alle emailadressen in geconfigureerd worden, read-only) httpd.conf (symlink naar /usr/pkg/etc/httpd/vhosts/$sitenaam, configuratie bestand voor de webserver binnen de virtual host) - past het /usr/pkg/etc/httpd/vritualhost.conf bestand aan, voeg de voeg de virtual host met het websitedomein toe - maakt de volgende bestanden aan: /usr/pkg/etc/httpd/vhosts/$sitenaam, configuratie binnen de virtual host container vult deze met een standaard configuratie /usr/pkg/etc/postfix/vhosts/$maildomein, lijst met emailadressen van het maildomein met de destinatie (ander adres, mail user), gevuld met standaard configuratie /var/log/httpd/$sitenaam-access_log /var/log/httpd/$sitenaam-error_log de twee belangrijke log files voor de website, read-only. - zorgen dat al deze bestanden geownd worden door de username. ANDERE GEBRUIKER TOEVOEGEN (MAIL, ORDINARY USER) Voor het aanmaken van niet-website gerelateerde gebruikers zijn (nog) geen scripts geschreven, omdat de bezigheden daar te eenvoudig en te gevarieerd voor zijn. Over het algemeen hebben we nog twee type users over: - users om email te ontvangen, gebruikers zitten in de groep mail met een homedirectory in /users/mail - andere users voor algemeen doel, zoals systeembeheer, etc. In de groep users en een homedirectory in /users/njn Het aanmaken van deze users gaat als volgt: voor mail users: # useradd -b /users/mail -m -s /usr/pkg/bin/bash -g mail $gebruikersnaam voor overige users: # useradd -b /users/njn -m -s /usr/pkg/bin/bash -g users $gebruikersnaam Hiermee wordt de username aangemaakt, en de homedirectory aangemaakt in /users/mail/$gebruikersnaam of /users/njn/$gebruikersnaam $gebruikersnaam een zo simpel mogelijke naam, zonder vreemde tekens of hoofdletters. Vervolgens moet een (al dan niet tijdelijk) wachtwoord aan de user gegeven worden: # passwd $gebruikersnaam Hierna moet blind 2x een nieuw wachtwoord voor de user ingevoerd worden. Typ van te voren een wachtwoord in bijvoorbeeld een texteditor, liefst combinatie met cijfers, hoofdletters en vreemde tekens maar wel te onthouden, en plak dat vervolgens 2x in de console. Hierna kan nog het volgende worden gedaan: - symlink naar de homedirectory in /home aanmaken, zodat deze makkelijk altijd zo te vinden is - directory public_html in de homedirectory aanmaken en de groep van deze map wijzigen naar www. (# chgrp www public_html). Hierdoor kunnen mensen documenten of een site stallen in deze map, die vervolgens beschikbaar komen onder http://hostname.server/~gebruikersnaam/ - Mode van de homedirectory veranderen naar 711: # chmod 711 /users/njn/$gebruikersnaam of # chmod 711 /users/mail/$gebruikersnaam zodat niemand behalve de gebruiker de bestanden kan zien in de homedirectory. 700 is ongewenst omdat dan bepaalde servers niet meer in de homedirectory kunnen (zoals apache voor de public_html directory) GEBRUIKERS VERWIJDEREN Het verwijderen van gebruikers gaat makkelijk: userdel $gebruikersnaam En de gebruikersnaam is verwijderd uit het syteem en de betreffende gebruiker kan niet meer inloggen. De homedirectory is echter nog wel aanwezig. Deze kan handmatig verwijderd worden met: # rm -rf ~gebruikersnaam Eventueel kan de homedirectory voor het verwijderen gebackupt worden: # cd ~gebruikersnaam # cd .. # tar czf /tmp/gebruikersnaam.tar.gz gebruikersnaam/ In sommige gevallen moeten configuratiebestanden en serverbestanden worden opgeschoond als het om een mailuser of een website user gaat. Denk hierbij aan: /usr/pkg/etc/httpd/virtualhosts.conf: VirtualHost uit de configuartie halen /usr/pkg/etc/httpd/vhosts/$websitedomein: Apache configuartiebestand ~websiteuser/mailaliases.conf: emailadres van de mailgebruiker uit de mailserver configuratie halen. -------------------------------------------------------------------------- 3. DE APACHE SERVER BEHEREN -------------------------------------------------------------------------- Als webserver draaien we momenteel apache 2.0.54 met php 4.4.0. Elke website heeft zijn eigen configuratiebestand en logfiles, toegankelijk en configureerbaar voor de webmaster. Websites worden in virtualhost containers onderscheiden van elkaar, dit gaat dus op hostname. De configuratie van de apache server steekt als volgt in elkaar: /usr/pkg/etc/httpd/ hieronder staan alle configuratiefiles van apache httpd.conf algemeen instellingenbestand apache, zo min mogelijk aan veranderen virtualhosts.conf bestand waar alle virtual hosts van apache zijn gedeclareerd vhosts/* alle site-lokale virtual hosts configuraties. Deze bestanden worden geownd door de betreffende username van de site, zodat deze aangepast kan worden door de webmaster, en ge-include door virtualhosts.conf, in de betreffende VirtualHost container. Na aanpassen apache herstarten. /usr/pkg/etc/rc.d/apache RC bestand gebruikt om de apache server te stoppen en te starten met: # /usr/pkg/etc/rc.d/apache start (start de apache server als deze uit is) # /usr/pkg/etc/rc.d/apache stop (stop de apache server als deze aan is) # /usr/pkg/etc/rc.d/apache restart (herstart de de apache server als deze aan is) /usr/local/bin/httpd.update Script dat door alle gebruiker in de groep http kan worden aangeroepen (website gebruikers dus) om de apache server te herstarten, zonder dat er root-rechten voor nodig zijn. Moet worden gebruikt de webmasters als ze iets in hun httpd.conf hebben veranderd. /var/log/httpd Directory waar alle log files in staan. Elke aparte site heeft een aparte log file. Deze worden geowned door de respectievelijke gebruikers en staan mode 400 zodat ze read-only zijn voor deze gebruikers. /usr/local/sbin/rotatehttpdlogfiles.py Script waarmee een keer per week de httpd logfiles 'geroteerd' moeten worden zodat ze niet tot absurde grootes groeien in de loop der tijd en onnodig schijfruimte gebruiken. Onder 'roteren' wordt verstaan dat de in gebruik zijnde logfiles worden ge-gzipt en hernoemd naar $logfile.0.gz. Dankzij gzip nemen ze aanzienlijk minder ruimte in. De logfile die al $logfile.0.gz van de vorige keer wordt hernoemd naar $logfile.1.gz. Dit gaat door tot $logfile.5.gz, de laatste wordt weggegooid. Het script moet nog in een cron o.i.d worden opgenomen zodat dit automatisch gebeurt. Voor de configuratie van PHP hebben we het bestand /usr/pkg/etc/php.ini. Dit bestand is globaal voor de hele server en dient zo min mogelijk gewijzigd te worden. Er moet nog gekeken worden of php.ini instellingen per site kunnen worden bewerkstelligd en op deze manier op site-niveau kan worden beheerd (en niet op systeem). -------------------------------------------------------------------------- 4. DE MAIL SERVER BEHEREN (POSTFIX) -------------------------------------------------------------------------- Voor de mailserver gebruiken we momenteel postfix 2.2.* Ook hier geldt dat elke websitegebruiker z'n eigen mailaliases configuratiebestand heeft waar deze de emailadressen van zijn email-domein kan aanpassen. De globale serverconfiguratie biedt diverse geadvanceerde configuratiemogelijkheden, o.a. voor het tegengaan van spam. /usr/pkg/etc/postfix/ configuratie van postfix main.cf algemeen configuratiebestand Postfix access lijst met hostnames en IP addressen die we blacklisten of juist volledige toegang willen geven Na wijzigen even met "postmap access" de access.db file bijwerken. aliases lijst met gebruikersnaam aliases en piped commando's Na wijzigen even met "postalias aliases" de aliases.db file bijwerken. aliases.lijst Symlink naar /home/http/lijst/mailman/data/aliases, staan alle piped commando's naar de mailinglijst software. Hoeft niet aangepast te worden, doet mailman voor ons. vhosts/* alle site-lokale virtual hosts configuraties. De bestanden worden geownd door de betreffende username van de site, zodat deze aangepast kan worden door de webmaster. compileallvirtuals.inc compileallvirtuals.php php script dat alle niet-becommentarieerde regels uit vhosts/* bestanden en virtual samenvoegt tot één allvirtual bestand en database. Aanroepen als er iets gewijzigd is in vhosts/*, mortal users kunnen dat doen met /usr/local/contrib/mailaliases.update allvirtual bestand dus dat wordt samengesteld door compileallvirtuals.php uit vhosts/* en virtual virtual addittionele virtual hosts configuraties die niet in vhosts/* thuishoren. BODY-filtering.regexp bestand waarin regexps staan die worden gebruikt om de body van emailtjes te checken op spam. Na bewerken van bestand even postfix restarten. HEADER-filtering.regexp bestand waarin regexps staan die worden gebruikt om de header van emailtjes te checken op spam Na bewerken van bestand even postfix restarten. MIME-filtering.regexp bestand waarin regexps staan die worden gebruikt om MIME attachment namen van emailtjes te checken op spam Na bewerken van bestand even postfix restarten. MAIL_FROM-restrictions bestand waarin restricties staan van de MAIL FROM: enveloppe SMTP commando, handig om bepaalde emailadressen te weren. Na bewerken met "postmap" even de db bijwerken. RCPT_TO-restrictions bestand waarin restricties staan van de RCPT TO: enveloppe SMTP commando, handig om bepaalde emailadressen te weren. Na bewerken met "postmap" even de db bijwerken. contentfiltering.regexp bestand waarin regexps staan die worden gebruikt om het hele mailtje te checken op spam Na bewerken van bestand even postfix restarten. rblreplies SMTP banners als reactie op het weigeren van hostnames gebaseerd op RBL databases. Zie hiervoor ook main.cf. /etc/rc.d/postfix RC script om de postfix server te stopen, starten, etc # /etc/rc.d/postfix start (om de server te starten als ie uit is) # /etc/rc.d/postfix start (om de server te stoppen als ie aan is) # /etc/rc.d/postfix restart (om de server te herstarten als ie aan is) /usr/local/bin/mailaliases.update Script die website gebruikers kunnen aanroepen om hun mailaliases configuratie bestand te updaten naar de mailservers -------------------------------------------------------------------------- 5. DE DNS BEHEREN (DOMEINNAMEN) -------------------------------------------------------------------------- De DNS server werkt redelijk eenvoudig. Voor NJN zaken hebben we momenteel het domein (ook wel zone genoemd) njn.welmers.net die we eenvoudig kunnen aanpassen. Het njn.nl domein kan tot op heden minder makkelijk worden aangepast, de subdomeinen hieronder laten we CNAME'en naar het njn.welmers.net domein. /etc/namedb/named.conf configuratiebestand van de DNS server. Hier worden de verschillende zones (hoofddomeinen) gedeclareerd evenals andere configuratieinstelllingen. /var/databases/named Directory met de zonefiles, waarin de subdomeinen kunnen worden beheerd. Momenteel hebben we de volgende DNS configuratie: afdeling.njn.nl MX mx1.welmers.net (de mailserver) afdeling.njn.nl A 62.251.25.220 (simpele apache server die de http aanvragen redirect naar http://www.afdeling.njn.nl/) www.afdeling.njn.nl CNAME afdeling.njn.welmers.net afdeling.njn.welmers.net A ip.adres.van.huidige.webserver -------------------------------------------------------------------------- 6. SQL BEHEREN (MySQL en PostGreSQL -------------------------------------------------------------------------- Voor databases hebben we mysql 4.1 en postgresql 8.0 geinstalleerd. De databases van deze systemen zijn te vinden onder respectievelijk /var/databases/mysql en /var/databases/postgresql. Met http://routeduvel.rembrandtkd.welmers.net/phpPgAdmin kan de postgresql server worden beheerd, met gebruikersnaam pgsql en het rootwachtwoord van de machine. Met http://routeduvel.rembrandtkd.welmers.net/phpMyAdmin kan de mysql server worden beheerd, met gebruikersnaam root en het rootwachtwoord van de machine. Ook bestaan er de teminal programma's mysql en psql waarmee ook de zaak beheerd kan worden. TODO: Zaken als database dumps maken en weer invoeren voor backup en verplaats doeleinden moeten nog gedocumenteerd worden. -------------------------------------------------------------------------- 6. SOFTWAREPAKETTEN BEHEREN -------------------------------------------------------------------------- NetBSD maakt voor additionele 3rd party software gebruik van het pkgsrc package management en build systeem. Hiermee kunnen softwarepakketen zowel in binary vorm geinstalleerd worden als gecompileerd worden uit source. Bij het installeren worden de pakketten en hun dependencies geinstalleerd in /usr/pkg/ en geregistreerd in /var/db/pkg/$pakketnaam/. In deze laatste database directory wordt bijgehouden welke bestanden er zijn geinstalleerd, zodat deze weer makkelijk verwijderd kan worden. BINARY PAKKETTEN INSTALLEREN OF UPGRADEN Binaire pakketen zijn tgz tarballs waar de progrmamabestanden in staan relatief tegenover /usr/pkg/ plus een aantal hulpbestandjes met afhankelijkheden, filelist en scripts en installatie messages. Ze kunnen voorgecompileerd gevonden worden in zogenaamde repositories op een ftp of http site. De URL naar deze repository dient te worden opgegeven in de environmentvariabele PKG_PATH, bijvoorbeeld: # export PKG_PATH=ftp://ftp.nluug.nl/pub/os/BSD/NetBSD/packages/2.0/i386/All In deze directory staan alle pakketten én hun afhankelijkheden die we willen installeren. Vervolgens kunnen we met: # pkg_add volledig_pakketnaam Een pakket installeren. Deze wordt dan automatisch gedownload, en geinstalleerd. Afhankelijke pakketten worden ook automatisch gedownload en geinstalleerd. De naam volledige_pakketnaam is wat verwarrend. Dit is vaak een ingewikkelde naam van het programma, met de versie en patchlevel erachter. Om deze makkelijk te kunnen vinden kan je het volgende doen: # ncftp $PKG_PATH Waardoor een gebruikersvriendelijk ftp programma ncftp wordt gestart die meteen naar de server en juiste directory gaat. Hierna kan je met 'ls softwarenaam*' kijken wat de naam van het pakket precies is, bijvoorbeeld: > ls php* Om alle php pakketten te zien, je zult dan dingen als php-4.4.1nb1.tgz, php-5.0.5.tgz, php-gettext-4.4.1.tgz, etc Indien er een of meerde pakketten die je wilt installeren al bestaan, al dan niet een lagere versie (upgraden dus), zal het pkg_add programma een foutmelding geven. Daarom moet daarvoor met pkg_delete het oude pakket verwijderd worden: pkg_delete pakketnaam In /var/db/pkg zijn in mapnamen de pakketten te vinden die zijn geïnstalleerd, evenals via het programma pkg_info. PKGSRC TREE GEBRUIKEN VOOR BUILDEN PROGRAMMA'S Soms zijn de gewenste binary pakketten niet beschikbaar, linken ze naar de verkeerde programma's of willen we om een andere reden pakketten (her)compileren vanuit source. Dit kan met de pkgsrc tree, te vinden onder /usr/pkgsrc/.