Gentoo Logo

Gentoo Security Handbook

Inhoud:

A. Systeem Veiligheid

1. Pre-Installatie Zorgen

1.a. Fysische veiligheid

Hoeveel veiligheidsmaatregelen je ook treft, ze kunnen allemaal omzeild worden indien de aanvaller fysische toegang heeft tot je pc. Zorg er dus voor dat je hardware niet gewoonweg bereikbaar is voor jan en alleman. Bijvoorbeeld kan je je pc in een gesloten serverkast plaatsen. Het sluiten van je pc-kast is ook een goed idee. Om de hoogste veiligheid te verkrijgen is het het best dat je je BIOS instelt om enkel van HD te kunnen booten. Maw schakel booten van floppy en CD-ROM uit. Voor de paranoide mensen is het instellen van een BIOS- en bootpaswoord ook aangeraden. BIOS paswoorden zijn vooral aangeraden bij laptopgebruikers.

1.b. Daemon/Service Planning

Documenteer welke services er op de pc moeten of zullen draaien. Dit zal je helpen in het opstellen van een goed partitioneerschema voor je systeem. Het zal tevens je ID strategy (Intrusion Detection - Inbraakpoging detectie) vereenvoudigen.

Natuurlijk is het bijhouden van de gedocumenteerde informatie niet noodzakelijk indien je maar 1 of enkele pc's hebt en je de enige bent die er gebruik van maakt.

Bijvoorbeeld:

Vraag: De computer moet als firewall dienen. Welke services zou het moeten draaien?

Antwoord: geeneen, behalve misschien ssh.

Documenteer dit en noteer tevens de huidige versie van SSH - dat zal je helpen met het onderhoud van je systeem indien iemand een veiligheidsprobleem vindt in sshd. Dit zal je tevens helpen met het beoordelen van wie wel en niet toegang moet krijgen tot dat systeem.

1.c. Partitioneringsschema's

Gouden regels:

  • Elke directorie waarnaartoe een gebruiker kan schrijven (/home, /tmp en /var in de meeste gevallen) dienen op een aparte partitie te komen waarop disk quota's ingesteld worden. Portage maakt gebruik van /var/tmp om broncode te compileren dus deze partitie moet groot genoeg zijn. Dit vermindert het risico dat een gebruiker je "/" mountpoint opvult.
  • Elke directoriestructuur waar je niet-distibutie software in wil installeren moet op een aparte partitie komen. Volgens de File Hierarchy Standard (Engels, Standaard voor bestandsstructuur) zijn deze directories /opt of /usr/local. Indien deze aparte partities zijn zullen zij dus niet verwijderd worden indien je het systeem opnieuw installeert, wat de kans op extra downtime van je systeem vermindert.
  • Probeer statische data op zijn eigen partitie te plaatsen, en mount deze partitie read-only (alleen-lezen). Indien je echt paranoide bent kan je deze data proberen te branden op alleen-lezen-media zoals CD-ROMs.

1.d. De root gebruiker

De rootgebruiker is de meest belangrijke maar tevens kwetsbare gebruiker van je systeem en dient niet gebruikt te worden tenzij dit absoluut noodzakelijk is. Indien een aanvaller root-toegang tot je systeem verkregen heeft kan je niets meer van je systeem vertrouwen, en moet je deze dus herinstalleren. Compleet. Inclusief de voordien vermelde niet-distributie software, ook al staat deze op een aparte partitie.

De gouden regels aangaande de root-gebruiker:

  • Maak altijd een gebruiker aan voor algemeen gebruik van je systeem. Indien nodig voeg je deze gebruiker toe aan de wheel-groep zodat deze kan su'en naar root.
  • Draai nooit X of andere gewone gebruikersapplicaties als root.
  • Gebruik altijd volledige padnamen indien je werkt als root. Het is immers mogelijk om root andere applicaties te doen draaien dan dat hij wenst. Bijvoorbeeld indien iemand met jouw gebruiker's PATH-variabele geknoeid heeft, en je gebruiker gaat naar root dmv su ipv su -, dan maakt de root gebruik van die gebruiker zijn PATH en niet die van de root-gebruiker zelf.
  • Indien een gebruiker enkel een klein scala aan commando's dient uit te voeren als root, overweeg dan het gebruik van sudo, maar wees voorzichtig bij het configureren!
  • Laat nooit een root-terminal open staan.

Gentoo heeft een algemene veiligheidsmaatregel tegen gebruikers die proberen te su'en. De default instellingen van PAM laten immers niet toe dat gebruikers die geen lid zijn van de wheel-groep kunnen su'en.

1.e. Beleidsverklaringen (Policies)

Er zijn verschillende redenen waarom beleidsverklaringen nodig zijn.

  • Je kan niet verklaren dat je netwerk veilig is zonder een definitie te geven van "veilig".
  • Het is bijna onmogelijk om potentiele aanvallers vast te grijpen, netwerkproblemen op te lossen of audit's uit te voeren zonder dat je je netwerktraffic bekijkt of in private homedirectories van gebruikers neust. En aangezien dergelijke controles illegaal zijn zonder dat de gebruiker dit goedgekeurd heeft, en ongeveer 60% van alle aanvallen van binnenin de organisatie komen, is het belangrijk dat je een wakend oog hebt en een beleid opstelt.
  • Je kan niet verwachten van je gebruikers dat ze aan veiligheid denken, indien je hen nooit uitlegt waarom en hoe ze zich moeten beschermen tegen zichzelf of andere collega's.
  • Goede regels en netwerkdocumentatie zijn altijd positief, onafhankelijk van de situatie.
  • De politie of het federaal rechtssysteem kan je niet helpen met het vatten van de aanvaller indien ze niet weten hoe je netwerk in elkaar zit of welke services je aanbiedt.
  • Wat zal je doen als er een aanval succesvol uitgevoerd werd? Je moet definieren wat je dan zal doen en wie je ervan op de hoogte houdt. Ga je de politie of een CERT team bij elke mogelijke poging al contacteren? Ze zullen je niet serieus nemen...

Deze zaken zouden je duidelijk moeten gemaakt hebben waarom beleidsverklaringen belangrijk zijn bij systemen met meer dan 1 gebruiker en waarom je je gebruikers moet informeren.

Een beleidsverklaring is een document (of meerdere documenten) met antwoorden op vragen zoals wie, waar, waarom en wat. Elke gebruiker op je systeem/netwerk zou dat document moeten lezen, begrijpen en ondertekenen. Het is belangrijk dat je de tijd neemt om de gebruikers te helpen met het interpreteren van je beleidsverklaring en met het waarom van het ondertekenen, alsook met de repercussies indien ze tegen het beleid in gaan (dit moet tevens in de beleidsverklaring staan). Dit moet minstens 1 keer per jaar herhaald worden, niet enkel omdat het beleid kan veranderen, maar tevens als herinnering voor de gebruikers.

Nota: Maak beleidsverklaringen aan die gemakkelijk lezen en duidelijk maar specifiek elk mogelijk onderwerp aankaarten.

De meeste onderdelen van een beleidsverklaring kunnen direct op het besturingssysteem toegepast worden of via firewalls, maar andere kunnen dan weer niet geautomatiseerd worden.

1.f. Veiligheidsbeleid

Een veiligheidsbeleid is eigenlijk een verzameling van regels die voor de veiligheid van je netwerk of systeem instaan. Het is een document die informatie bevat aangaande de computers, het netwerk, de paswoorden, de e-mail-regels, hoe je gebruikers zich al dan niet moeten gedragen, wat er moet gedaan worden indien er een al-dan-niet succesvolle aanval is geweest, hoe computers geinstalleerd worden, hoe het infrastructuur eruit moet zien etc...

Een veiligheidsbeleid moet op zijn minst de volgende onderwerpen aansnijden:

  • Aanvaardbaar gebruik.
    • Schermbeveiligingen
    • Paswoordonderhoud
    • Downloaden van software
    • Kennisgeving van "spionering"
    • Gebruik van anti-virus software
    • etc.
  • Gebruik van belangrijke, gevoelige informatie (eender welke vorm: telefoon, fax, papier, digitaal, ...).
    • Overzichtelijk bureau en documenten achter slot en grendel
    • Afsluiten van pc's alvorens de zaal/kamer te verlaten
    • Gebruik van encryptie
    • Gebruik van sleutels en uitwisseling met vertrouwde collega's
    • Gebruik van gevoelige informatie tijdens transport of reis
  • Gebruik van computermateriaal tijdens transport of reis
    • Gebruik van laptop in hotels, conferenties, ...

Het beleid voor IT-mensen kan verschillen van die van gewone gebruikers.

Het veiligheidsbeleid kan zeer groot worden, en belangrijke informatie kan gemakkelijk vergeten worden. De IT-mensen hun beleid kan informatie bevatten die geheim is voor de gewone gebruiker, dus is het belangrijk om je beleidsverklaringen te splitsen in kleinere documenten; bijvoorbeeld "Aanvaardbaar gebruik", "Paswoord gebruik", "E-mail beleid", "Werken vanuit andere locaties", ...

Voorbeelden van beleidsverklaringen kan je vinden op De SANS Policy Project (Engels). Indien je een klein netwerk hebt en je denkt dat deze beleidsverklaringen iets te uitgebreid zijn kan je misschien eens kijken naar RFC2196 wat een website's beveiligingsgids is.

2. Betere Beveiliging

2.a. USE flags

Het make.conf bestand bevat alle opties en vermeld de extra bibliotheken die je wil gebruiken wanneer je je ebuilds compileert. In dit bestand moet je minstens ebuild-ondersteuning meegeven voor veiligheidsbibliotheken zoals PAM (Pluggable Authentication Modules), tcp wrappers of SSL (Secure Socket Layer). Je USE-variabele moet dus minstens pam, tcpd en ssl bevatten.

Voeg dus het volgende toe:

Codevoorbeeld 1.1: USE aanpassingen

USE="tcpd pam ssl"

2.b. GRUB paswoord

Grub ondersteunt 2 methodes van paswoordrestrictie in zijn configuratiebestand (/boot/grub/grub.conf). De ene is met een gewoon paswoord, de andere is met md5+salt encryptie.

Codevoorbeeld 2.1: /boot/grub/grub.conf

timeout 5
password changeme

Dit zal het paswoord changeme gebruiken en als er geen paswoord opgegeven wordt zal het de default instellingen opstarten.

Indien je een md5 paswoord wil invullen moet je het paswoord in crypt-formaat (man crypt) converteren wat hetzelfde formaat is als dat het shadow paswoordbestand gebruikt. Bijvoorbeeld zal het geencrypteerde paswoord changeme er als volgt uitzien: $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.

Dit wordt weergegeven in de volgende configuratieinstellingen:

Codevoorbeeld 2.2: /boot/grub/grub.conf

timeout 5
password --md5 $1$T7/dgdIJ$dJM.n2wZ8RG.oEiIOwJUs.

Waarschuwing: Wanneer je dit wil testen, vergeet dan niet de timeout in te stellen. Anders zal je niet de mogelijkheid krijgen om je systeem te booten indien je paswoord verkeerd is.

De 5-seconden timeout is zeer handig indien het systeem op een andere locatie staat en de pc moet kunnen booten zonder keyboard-interactie. Meer informatie over Grub paswoorden kan je vinden in info grub.

2.c. LILO paswoord

LILO ondersteunt ook 2 methodes van paswoorden: een globale en een per-image gebaseerde; beide zijn gewone (niet-geencrypteerde) paswoorden.

Het globale paswoord zet je bovenaan je configuratiebestand:

Codevoorbeeld 3.1: /etc/lilo.conf

password=changeme
restricted
delay=3

In het andere geval voeg je het gewoon toe aan een image.

Codevoorbeeld 3.2: /etc/lilo.conf

image=/boot/bzImage
      read-only
      password=changeme
      restricted

Indien de restricted optie niet meegegeven wordt zal LILO altijd achter een paswoord vragen, indien de optie wel meegegeven wordt zal LILO enkel achter een paswoord vragen indien je iets anders dan de default instellingen wil gebruiken.

Om de nieuw aangebrachte aanpassingen door te voeren moet je /sbin/lilo opnieuw uitvoeren.

2.d. Consolegebruik beperken

/etc/securetty bevat de terminals waarop je als root mag inloggen.

We raden aan dat je alles behalve vc/1 verwijdert. Hierdoor zorg je ervoor dat root maar op 1 terminal tegelijkertijd kan inloggen (su - wordt niet meegerekend).

Codevoorbeeld 4.1: /etc/securetty

(Voor devfs)
vc/1
(Voor udev)
tty1

3. Loggen

3.a. Syslogd

Syslogd is de meest gebruikte logger voor Linux en Unix algemeen. Het heeft geen logrotatie mogelijkheid. Deze mogelijkheid kan je toch implementeren door middel van /usr/sbin/logrotate in een cronjob te steken en /etc/logrotate.conf goed te configureren. De hoeveelheid van logrotaties zijn afhankelijk van het gebruik van je systeem.

Hier is een voorbeeld van hoe je syslog kan configureren:

Codevoorbeeld 1.1: /etc/syslog.conf

*.=debug                   /var/log/debug
*.err                      /var/log/syslog

#Gebruikers van wie je wil zien wanneer ze ingelogd zijn
*.=alert                   root,je gebruikers hier
*.=emerg                   root,je gebruikers hier

mail.info,mail.notice      /var/log/maillog
kern.*                     /var/log/kern.log
daemon.info;daemon.notice  /var/log/daemon.log
cron.*                     /var/log/cron.log
mail.*                     /var/log/mail.log
user.*                     /var/log/user.log
uucp.*                     /var/log/uucp.log
*.*;auth,authpriv.none     /var/log/syslog

#Plaats de logbestanden in 2 verschillende locaties
authpriv.*;auth.*          /admin/auth.log
authpriv.*;auth.*          /var/log/secure

#Schrijf alles tevens neer in een terminal
*.*                        /dev/tty12

#Stel een andere server in als logserver
*.*                        @logserver

De aanvaller zal waarschijnlijk proberen om zijn voetsporen te wissen door logbestanden aan te passen of te verwijderen. Je kan het hem moeilijk maken door de logs naar een of meer logservers op verschillende machines te sturen.

Meer informatie over syslogd kan je vinden in de manpage (man syslog).

3.b. Metalog

Metalog door Frank Dennis heeft niet de mogelijkheid om naar een andere server te loggen, maar heeft wel voordelen op gebied van performantie en logflexibiliteit.

Het kan per proces loggen of per faciliteit (zoals syslogd werkt) en komt met een eigen expressietaal en uitvoering van commandos. Zeer goed om akties te ondernemen indien nodig.

Codevoorbeeld 2.1: /etc/metalog.conf

maxsize  = 1000000
maxtime  = 86400
maxfiles = 7
minimum  = 7

Kernel messages :

  facility = "kern"
  logdir   = "/var/log/kernel"

Auth messages :
  facility = "auth"
  logdir   = "/var/log/auth"

Emergencies :
  facility = "emerg"
  command  = "/usr/local/sbin/pwdfail.sh"  

Crond :

  program  = "crond"
  logdir   = "/var/log/crond"
  
Password failures :

  regex    = "(password|login|authentication)\s+(fail|invalid)"
  regex    = "(failed|invalid)\s+(password|login|authentication)"
  regex    = "ILLEGAL ROOT LOGIN"
  logdir   = "/var/log/pwdfail"
  command  = "/usr/local/sbin/pwdfail.sh"

SSH Server :

  program  = "sshd"
  logdir   = "/var/log/sshd"

Mail :

  facility = "mail"
  logdir   = "/var/log/mail"

Snort:
  program   = "snort"
  command  = "/usr/local/sbin/pwdfail.sh"

Everything important :

  facility = "*"
  logdir   = "/var/log/everything"

Everything very important :

  facility = "*"
  logdir   = "/var/log/critical"

Dit is een default configuratie met enkele aanpassingen, zoals een minimum logniveau van 7, wat wil zeggen dat alles gelogged zal worden.

pwdfail.sh voor postfix:

Codevoorbeeld 2.2: pwdfail.sh voor Postfix

#! /bin/sh
echo "$3" | mail -s "Warning (program : $2)" root

pwdfail.sh voor netqmail:

Codevoorbeeld 2.3: pwdfail.sh voor netqmail

#!/bin/sh
echo "To: root
Subject:Failure (Warning: $2) 
$3
" | /var/qmail/bin/qmail-inject -f root

Meer informatie kan je vinden op de metalog website.

3.c. Syslog-ng

Syslog-ng levert sommige features van syslog en metalog met enkele kleine verschillen. Het kan berichten filteren op niveau en inhoud (net zoals metalog), ondersteunt logservers zoals syslog, kan syslogd logs aan (zelfs deze van Solaris), kan naar een TTY schrijven en programmas uitvoeren en zelf als logserver fungeren. Dit is dus eigenlijk het beste van beide andere loggers met extra mogelijkheden.

Een klassiek configuratiebestand mits wat kleine aanpassingen.

Codevoorbeeld 3.1: /etc/syslog-ng/syslog-ng.conf

options { long_hostnames(off); sync(0); };

#bron van waar de log ingelezen dient te worden
source src { unix-stream("/dev/log"); internal(); };
source kernsrc { file("/proc/kmsg"); };

#doelen definieren
destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination kern { file("/var/log/kern.log"); };
destination lpr { file("/var/log/lpr.log"); };
destination user { file("/var/log/user.log"); };
destination mail { file("/var/log/mail.log"); };

destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };

destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };

destination debug { file("/var/log/debug"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };
destination console_all { file("/dev/tty12"); };
destination xconsole { pipe("/dev/xconsole"); };

#filters aanmaken
filter f_auth { facility(auth); };
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_user { facility(user); };
filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info..warn) 
	and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };

filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_failed { match("failed"); };
filter f_denied { match("denied"); };

#filter en doel linken
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(kernsrc); filter(f_kern); destination(kern); };
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };

log { source(src); filter(f_debug); destination(debug); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };

#default log
log { source(src); destination(console_all); };

Het is gemakkelijk om te configureren maar tevens zeer gemakkelijk om fouten te maken aangezien het configuratiebestand groot is. De auteur heeft belooft om nog extra mogelijkheden zoals encryptie, identiteits verificatie, compressie en MAC (Mandatory Access Control) in te bouwen. Met deze opties zal dit de perfecte logger worden, aangezien de aanvaller de logs dan niet meer kan bekijken en aanpassen.

En syslog-ng heeft nog een andere mogelijkheid: het moet niet als root werken!

3.d. Logs analyseren met logcheck

Natuurlijk, zijn logs maken en houden maar de helft; Een aplicatie als logcheck kan log-bestanden veel makkelijker controleren. logcheck is een script, en kun je uitvoeren met het commando logtail, die je best gebruikt via je cron. Na de controle op verdachte activiteit; mailt hij alles naar je root's mailbox.

Logcheck en logtail maken deel uit van het app-admin/logsentry pakket.

Logcheck gebruikt vier bestanden om te belangrijke logs te controleren. Deze bestanden zijn logcheck.hacking, die bevat gekende hack-berichten, logcheck.violations bevat patronen die veiligheid-tekortkomingen aantonen, logcheck.violations.ignore bevat sleutelwoorden die lijken als een aanval te blokkeren, en logcheck.ignore bevat regels over geblokkeerde toegang.

Waarschuwing: Laat logcheck.violations.ignore leeg, logcheck gebruikt grep om logs te parsen, sommige versies van welke lege bestanden genomen zullen worden als wildcards, Alle inbraken zouden dan worden genegeerd.

4. Het Aanknopen van Partities

4.a. Mounten van partitions

Wanneer we een ext2, ext3 of een reiserfs partitie mounten kan je verschillende opties meegeven in /etc/fstab. Deze zijn:

  • nosuid - Pas de SUID bit niet toe en maak van het programma een ordinair programma.
  • noexec - Zorgt ervoor dat geen bestanden van deze partitie uitgevoerd kunnen worden.
  • nodev - Negeer apparaatbestanden op deze partitie.

Jammergenoeg kunnen deze instellingen gemakkelijk omzeild worden door een niet-direct pad mee te geven. Het instellen van noexec op /tmp zal toch 99% van de scriptkiddies tegenhouden aangezien hun exploits gemaakt zijn om uitgevoerd te voeren vanuit /tmp.

Codevoorbeeld 1.1: /etc/fstab

/dev/sda1 /boot ext2 noauto,noatime 1 1
/dev/sda2 none swap sw 0 0
/dev/sda3 / reiserfs notail,noatime 0 0
/dev/sda4 /tmp reiserfs notail,noatime,nodev,nosuid,noexec 0 0
/dev/sda5 /var reiserfs notail,noatime,nodev 0 0
/dev/sda6 /home reiserfs notail,noatime,nodev,nosuid 0 0
/dev/sda7 /usr reiserfs notail,noatime,nodev,ro 0 0
/dev/cdroms /cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0
proc /proc proc defaults 0 0

Waarschuwing: /tmp met noexec mounten kan verhinderen dat sommige scripts correct uitgevoerd worden!

Nota: Disk quotas worden in een ander hoofdstuk besproken

Merk op dat we /var niet met noexec of nosuid mounten, ook al zijn bestanden daarin normaal gezien niet uitvoerbaar. De reden hievoor is dat netqmail geinstalleerd wordt in /var/qmail en de mogelijkheid moet hebben om 1 suid file aan te passen en uit te voeren. We maken van /usr wel een read-only partitie aangezien daar nooit naartoe moet geschreven worden, tenzij om Gentoo up te daten. Dan mounten we /usr eventjes in lees-schrijf mode, updaten en hermounten we ze opnieuw in alleen-lezen.

Nota: Zelfs indien je netqmail niet gebruikt, vereist Gentoo nog steeds de executable bit op /var/tmp aangezien ebuilds daarin gecompileerd worden. Een alternatief pad kan ingegeven worden indien je werkelijk /var met noexec wil mounten.

5. Gebruiker/Groep Beperkingen

5.a. /etc/security/limits.conf

Het controleren en beperken van resource-gebruik kan zeer efficient zijn om lokale DoS te voorkomen, of om het maximaal aantal logins van een gebruiker of groep gebruikers te beperken.

Codevoorbeeld 1.1: /etc/security/limits.conf

*    soft core      0
*    hard core      0
*    hard nproc     15
*    hard rss       10000
*    -    maxlogins 2
@dev hard core      100000
@dev soft nproc     20
@dev hard nproc     35
@dev -    maxlogins 10

Indien je overweegt om nproc of maxlogins voor een bepaald gebruiker op 0 te plaatsen, misschien dat je dan beter de gebruiker verwijdert. Het voorbeeld hierboven stelt de instellingen in voor de groep "dev" voor processen, core bestanden en maxlogins. De rest krijgt de default instellingen.

Nota: /etc/security/limits.conf is een deel van de PAM package en zal enkel werken bij programma's die PAM gebruiken.

5.b. /etc/limits

Limieten zijn gelijkaardig aan het limitbestand /etc/security/limits.conf. Het enige verschil is het formaat en het feit dat deze enkel werkt op gebruikers (niet op groepen). Laten we eens kijken naar een degelijke configuratie:

Codevoorbeeld 2.1: /etc/limits

*   L2 C0 U15 R10000
kn L10 C100000 U35

Hier stellen we de default instellingen in alsook een specifieke setting voor de gebruiker kn. Limieten zijn onderdeel van de shadow package en gelden enkel voor het shadow login programma. Het is niet noodzakelijk om hierin instellingen te veranderen indien je de PAM setting in je make.conf aangezet hebt en PAM correct geconfigureerd is.

5.c. Quotas

Het plaatsen van quota's op een bestandssysteem verhindert dat gebruikers die partitie vullen met (al dan niet nutteloze) bestanden, of zelfs dat de gebruikers erop schrijven. Quota-ondersteuning moet in de kernel zitten en moet als optie meegegeven zijn tijdens het mounten van een partitie. De kerneloptie kan je vinden onder File systems -> Quota support.

Codevoorbeeld 3.1: Installeren van quota

# emerge quota

Pas je /etc/fstab aan en voeg usrquota en grpquota toe aan de partities waarvan je het gebruik wil beperken zoals aangegeven in het voorbeeld.

Codevoorbeeld 3.2: /etc/fstab

/dev/sda1 /boot ext2 noauto,noatime 1 1
/dev/sda2 none swap sw 0 0
/dev/sda3 / reiserfs notail,noatime 0 0
/dev/sda4 /tmp reiserfs notail,noatime,nodev,nosuid,noexec,usrquota,grpquota 0 0
/dev/sda5 /var reiserfs notail,noatime,nodev,usrquota,grpquota 0 0
/dev/sda6 /home reiserfs notail,noatime,nodev,nosuid,usrquota,grpquota 0 0
/dev/sda7 /usr reiserfs notail,noatime,nodev,ro	0 0
/dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0
proc /proc proc defaults 0 0

Op elke partitie die gebruik moet maken van de quota-ondersteuning moet je de quota-bestanden aanmaken (quota.user en quota.group) en deze in de root van elke partitie plaatsen.

Codevoorbeeld 3.3: Aanmaken van quota-bestanden op /tmp

# touch /tmp/quota.user
# touch /tmp/quota.group
# chmod 600 /tmp/quota.user
# chmod 600 /tmp/quota.group

Deze stap moet uitgevoerd worden op elke partitie waar je quota's wil gebruiken. Nadat je de quota-bestanden aangemaakt hebt en geconfigureerd, moet je een script als rc-script aanmaken zodat de quota's automatisch geactiveerd worden tijdens het booten. Kopieer en plak het volgende script in een bestand genaamd /etc/init.d/quotas. Maak gewoon dat bestand aan (het bestaat nog niet) en maak het uitvoerbaar.

Codevoorbeeld 3.4: /etc/init.d/quotas

#!/sbin/runscript

depend() {
	need localmount
}

start() {
        if [ -x /sbin/quotacheck ] 
        then 
               ebegin "Checking quotas. This may take some time." 
               /sbin/quotacheck -avug 
               eend $?
        fi 
        if [ -x /sbin/quotaon ] 
        then 
               ebegin "Turning on quota." 
               /sbin/quotaon -avug 
               eend $?
        fi
}

stop() {
        if [ -x /sbin/quotaon ] 
        then 
	       ebegin "Turning off quota."
               /sbin/quotaoff
	       eend $?
        fi
}

Voeg deze dan toe aan de default runlevel met rc-update add quotas default en voeg een quota-controle toe als cronjob (crontab -e) om periodisch elke week de quota's te scannen: 0 3 * * 0 /sbin/quotacheck -avug.

Nadat je je systeem gereboot hebt (nieuwe kernel, herinner je nog?) is het tijd om de quota's van de gebruikers en de groepen in te stellen. edquota -u kn zal de gedefinieerde editor ($EDITOR, default is nano) opstarten en zal de quota's voor de gebruiken kn weergeven zodat je deze dan kan aanpassen. -g zal hetzelfde laten doen voor een gegeven groep.

Codevoorbeeld 3.5: Instellen van de quota's van gebruiker kn

Quotas for user kn: 
/dev/sda4: blocks in use: 2594, limits (soft = 5000, hard = 6500) 
         inodes in use: 356, limits (soft = 1000, hard = 1500)

Voor meer details, lees man edquota of The quota mini HOWTO (Engels).

5.d. /etc/login.defs

Indien het beleid verklaart dat de gebruikers hun paswoord elke week moeten aanpassen, moet je de variabele PASS_MAX_DAYS op bijvoorbeeld 14 zetten, en de variabele PASS_WARN_AGE op 7. Het is tevens aangeraden dat je paswoordveroudering gebruikt om brute krachtmethoden tegen te gaan: geef ze genoeg tijd en een brute krachtmethode kan elk paswoord kraken. We raden tevens aan om LOG_OK_LOGINS op yes te plaatsen.

5.e. /etc/login.access

Het login.access bestand is ook deel van de shadow package en bevat een toegangscontroletabel. De tabel wordt gebruikt om te bepalen wie wel en niet kan inloggen gebaseerd op gebruikersnaam, groepnaam of hostnaam. Per default mogen alle gebruikers inloggen dus is dit bestand in het begin enkel gevuld met commentaar en voorbeelden. Als je dus je pc aan het beveiligen bent raden we aan om iedereen uit te schakelen (zodat ze niet kunnen inloggen) behalve de personen die mogen inloggen (en dat is meestal enkel jezelf bij de meeste servers).

Nota: De settings in dit bestand zijn niet geldig voor de root-gebruiker.

Codevoorbeeld 5.1: /etc/login.access

-:ALL EXCEPT wheel sync:console
-:wheel:ALL EXCEPT LOCAL .gentoo.org

Waarschuwing: Wees voorzichtig wanneer je deze opties configureert, aangezien fouten ervoor kunnen zorgen dat je zelf geen toegang meer hebt tot de machine!

Nota: Deze aanpassingen zijn niet geldig voor SSH aangezien SSH niet gebruik maakt van /bin/login per default. Je kan daar echter wel voor zorgen door "UseLogin yes" te plaatsen in /etc/ssh/sshd_config.

Dit voorbeeld zal ervoor zorgen dat leden van de wheel-groep wel kunnen inloggen op de console, alsook gebruikers van het gentoo.org-domein. Misschien te paranoide, maar beter dat dan je systeem te zien vallen in handen van hackers.

6. Bestand-permissies

6.a. Wereldleesbaar (world readable)

Gewone gebruikers zouden geen toegang moeten hebben tot configuratiebestanden of paswoorden. Een hacker kan paswoorden stelen van een database of website en deze defacen of, nog erger, verwijderen. Dit is waarom het belangrijk is dat de permissies correct zijn. Indien je er zeker van bent dat een bestand enkel door root gebruikt moet worden, geef deze dan 0600 permissies en verander de eigenaar via chown.

6.b. Wereld/Groep schrijfbaar

Codevoorbeeld 2.1: Zoeken naar wereldschrijfbare bestanden en directories

# /usr/bin/find / -type f \( -perm -2 -o -perm -20 \) \ 
   -exec ls -lg {} \; 2>/dev/null >writable.txt
# /usr/bin/find / -type d \( -perm -2 -o -perm -20 \) \ 
   -exec ls -ldg {} \; 2>/dev/null >>writable.txt

Dit zal een groot bestand aanmaken met de permissies van alle bestanden die ofwel schrijfbaar zijn voor de groep of voor iedereen. Bekijk deze permissies en elimineer bestanden die door iedereen schrijfbaar zijn, dit door /bin/chmod o-w uit te voeren op die bestanden.

6.c. SUID/SGID files

SUID/SGID bestanden (bestanden met de superuser bit geplaatst) zijn vaak uitvoerbare bestanden waardoor de gebruiker zaken kan uitvoeren met rootpermissies. Deze bestanden kunnen leiden tot een lokale root-escalatie (indien de bestanden/programmas fouten bevatten). Dergelijke bestanden zijn gevaarlijk en moeten vermeden worden. Indien je de bestanden niet nodig hebt, doe dan chmod 0 op deze bestanden, of unmerge de pakketten die deze bestanden levert (dat kan je controleren met qpkg -f dat door gentoolkit geleverd wordt). Anders kan je de SUID bit verwijderen met chmod -s.

Codevoorbeeld 3.1: Zoeken van suid-bestanden

# /usr/bin/find / -type f \( -perm -004000 -o -perm -002000 \) \ 
  -exec ls -lg {} \; 2>/dev/null >suidfiles.txt

Dit zal een bestand aanmaken dat alle SUID/SGID bestanden vermeldt.

Codevoorbeeld 3.2: suid-bestanden op een default Gentoo Linux systeem

/bin/su
/bin/ping
/bin/mount
/bin/umount
/var/qmail/bin/qmail-queue
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/crontab
/usr/bin/chage
/usr/bin/expiry
/usr/bin/sperl5.6.1
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/procmail
/usr/bin/suidperl
/usr/lib/misc/pt_chown
/usr/sbin/unix_chkpwd
/usr/sbin/traceroute
/usr/sbin/pwdb_chkpwd

Per default heeft Gentoo niet veel SUID bestanden (dit hangt natuurlijk af van wat je geinstalleerd hebt), maar je lijst zal er ongeveer zo uitzien. De meeste commando's moeten niet gebruikt worden door gewone gebruikers, maar enkel door root. Schakel de SUID bit uit van ping, mount, umount, chfn, chsh, newgrp, suidperl, pt_chown en traceroute dmv chmod -s op elk van die bestanden. Verwijder niet de bit van su, qmail-queue of unix_chkpwd. Als je dat zou doen zou je niet meer kunnen su'en en mail ontvangen. Maar het is natuurlijk een extra veiligheid (wat betreft su) indien er niemand hoeft te su'en.

De enige SUID bestanden die ik op mijn systeem staan heb zijn su, passwd, gpasswd, qmail-queue, unix_chkpwd en pwdb_checkpwd. Maar indien je X gebruikt zal je er waarschijnlijk nog enkele hebben, aangezien sommige X-tools de SUID-bit vereisen.

7. PAM

7.a. PAM (Pluggable Authentication Modules)

PAM is een set van gedeelde bibliotheekbestanden die een alternatief bieden op gebied van identiteits verificatie in programma's. De PAM instellingen van Gentoo Linux zijn goed, maar er is altijd ruimte voor verbetering :)

Nota: Dit hoofdstuk heeft geen effect op je systeem indien je PAM niet in je USE opties hebt meegegeven in /etc/make.conf

Installeer cracklib:

Codevoorbeeld 1.1: Installeren van cracklib

# emerge cracklib

Codevoorbeeld 1.2: /etc/pam.d/passwd

auth	 required pam_pwdb.so shadow nullok
account	 required pam_pwdb.so
password required pam_cracklib.so difok=3 retry=3 minlen=8 dcredit=-2 ocredit=-2
password required pam_pwdb.so md5 use_authok
session	 required pam_pwdb.so

Dit zal de cracklib bibliotheek toevoegen zodat gebruikers een paswoord van minimum 8 karakters moeten ingeven, waarbij er minstens 2 cijfers zijn, 2 niet-letters en minstens 3 karakters verschillend van het vorige paswoord. Dit forceert de gebruikers om een goed paswoord te gebruiken (paswoord beleid). Zie PAM (Engels) documentatie voor meer mogelijkheden.

Codevoorbeeld 1.3: /etc/pam.d/sshd

auth	 required pam_pwdb.so nullok
auth     required pam_shells.so
auth	 required pam_nologin.so
auth	 required pam_env.so
account	 required pam_pwdb.so
password required pam_cracklib.so difok=3 retry=3 minlen=8 dcredit=-2 ocredit=-2 use_authtok
password required pam_pwdb.so shadow md5
session	 required pam_pwdb.so
session	 required pam_limits.so

Elke service die niet door een PAM bestand in /etc/pam.d geconfigureerd wordt wordt door de "other" regels ingesteld. De default instellingen zijn om alles te weigeren, zoals het moet zijn dus. Maar aangezien we graag veel logs van vanalles hebben, voegen we pam_warn.so toe. De laatste configuratie is pam_limits die geconfigureerd wordt door /etc/security/limits.conf. Zie ook het desbetreffende hoofdstuk.

Codevoorbeeld 1.4: /etc/pam.d/other

auth     required pam_deny.so
auth     required pam_warn.so
account  required pam_deny.so
account  required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session  required pam_deny.so
session  required pam_warn.so

8. TCP Wrappers

8.a. TCP Wrappers

TCP Wrappers is een manier om toegang tot services die door inetd (die Gentoo niet default installeert) of xinetd en anderen gecontroleerd worden te beheren.

Nota: De USE variabele in make.conf moet tcpd bevatten en de service in kwestie dient tcpd te gebruiken als serverargument (in xinetd). Zie ook het hoofdstuk aangaande xinetd voor meer informatie.

Codevoorbeeld 1.1: /etc/hosts.deny

ALL:PARANOID

Codevoorbeeld 1.2: /etc/hosts.allow

ALL: LOCAL @wheel
time: LOCAL, .gentoo.org

Zoals je kan zien is het formaat gelijkaardig aan deze van /etc/login.access. Tcpd ondersteunt specifieke services en beide werken in verschillende plaatsen wat betreft veiligheid. Deze instellingen zijn enkel geldig voor services die gebruik maken van tcp wrappers.

Het is tevens mogelijk om commando's uit te voeren als een service gebruikt wordt (bijvoorbeeld om relaying te activeren voor gebruikers die inbellen) maar het wordt niet aangeraden aangezien mensen zich zo meer problemen op de hals jagen dan dat ze er oplossen. Een voorbeeld van gebruik kan zijn dat je een script gebruikt die uitgevoerd wordt telkens iemand een deny-regel van de tcp wrappers activeert, maar zo kan een hacker dan weer een DoS uitvoeren door constant te proberen. Dit zou dus veeeeeel I/O en mails genereren, dus niet doen is de boodschap. Lees man 5 host_access voor meer informatie.

9. Kernel Beveiliging

9.a. Verwijderen van overbodige functionaliteit

De basisregel van kernelconfiguratie is om alles te verwijderen wat je niet nodig hebt. Dit zorgt ervoor dat je een kleine kernel hebt met de minste kans op fouten (die zich bevinden in drivers e.d.).

Overweeg tevens om module-ondersteuning uit te schakelen. Alhoewel het mogelijk is om rootkit modules te gebruiken zonder deze feature maakt het het toch moeilijker voor gewone hackers om dit te proberen.

9.b. /proc (kernel flags)

Veel kernelparameters kunnen aangepast worden via het /proc bestandssysteem of door gebruik te maken van sysctl.

Om dynamisch kernelparameters aan te passen moet CONFIG_SYSCTL aan staan in je kernel. Dit is default in een 2.4-kernel.

Codevoorbeeld 2.1: Negeren van ping-pakketten

# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

Dit zal ICMP type 0 (gekend als ping) pakketten uitschakelen. De reden hiertoe is dat ICMP meer informatie bevat dan dat je denkt. Sommige beheerders zullen misschien klagen dat ze niet kunnen pingen ter controle van het netwerk. Er is echter geen reden voor outsiders om te kunnen pingen. Maar soms kan het wel interessant zijn voor insiders om te kunnen pingen. Om dit toe te laten sluit je ICMP type 0 enkel uit op de publieke interface via je firewall.

Codevoorbeeld 2.2: Negeren van broadcast-pings

# /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Dit schakelt broadcast-antwoorden uit.

Je wil zeker geen smurf versterker worden. Smurf versterkers of X-mass trees zijn methoden die een hacker gebruikt om een explosief grote hoeveelheid traffic te genereren naar een bepaald doel.

Codevoorbeeld 2.3: Weigeren van source-routed pakketten

# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

Dit schakelt source-gerouteerde pakketten uit.

Aanvaard geen source-gerouteerde pakketten. Hackers gebruiken soms sourcerouting om traffic te genereren die lijkt alsof ze vanuit je eigen netwerk komen, maar die teruggerouteerd worden langs het pad dat ze kwamen, zodat hackers je netwerk kunnen misleiden. Source routing wordt amper gebruikt voor meer vriendelijke doeleinden, dus mag je die gerust uitschakelen.

Codevoorbeeld 2.4: Negeren van redirect-pakketten

# /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

Schakelt ICMP redirect uit. ICMP redirects kunnen gebruikt worden om je routingtabellen aan te passen, mogelijk met kwade bedoelingen.

Codevoorbeeld 2.5: Bescherm tegen slechte errorberichten

# /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

Schakel bescherming in tegen slechte errormessages.

Codevoorbeeld 2.6: Activeren van reverse path filtering

# for i in /proc/sys/net/ipv4/conf/*; do
        /bin/echo "1" > $i/rp_filter;
done

Nota: Indien je IP forwarding aanschakelt, wordt dit al vanzelf gedaan.

Schakel reverse path filteren in. Dit verzekert je dat de pakketten legitieme bronadressen gebruiken, en dit door automatisch binnenkomende pakketten te weigeren wiens bronadres niet overeenkomt met de netwerkinterface waar ze op toekomen. Dit heeft als voordeel dat IP spoofing niet mogelijk wordt, echter kan het problemen opleveren bij assymetrische routering (pakketten die van jouw host naar een andere host gaan nemen een andere weg dan deze die van de andere host naar jouw host gaan) alsook indien je een non-routing host gebruikt die verschillende IP adressen heeft op verschillende interfaces.

Codevoorbeeld 2.7: Loggen van alle voordien uitgeschakelde pakketten

# /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

Log gespoofede pakketten, source gerouteerde pakketten en redirect pakketten.

Codevoorbeeld 2.8: IP forwarding uitschakelen

# /bin/echo "0" > /proc/sys/net/ipv4/ip_forward

Verzeker jezelf ervan dat IP forwarding af staat. Je wenst dit enkel voor speciale doeleinden.

Al deze instellingen worden gereset nadat je gereboot hebt. Het is dus aangeraden om het volgende script aan een runlevel toe te voegen en deze uitvoerbaar te maken:

Codevoorbeeld 2.9: /etc/init.d/procparam

#!/sbin/runscript

depend() {
 before *
}

start() {
 ebegin "Setting /proc options."
 /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
 /bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
 /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
 /bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
 /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
 for i in /proc/sys/net/ipv4/conf/*; do
   /bin/echo "1" > $i/rp_filter
 done
 /bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
 /bin/echo "0" > /proc/sys/net/ipv4/ip_forward
 eend 0
}

Voeg het nu toe aan de default runlevel door rc-update add procparam default uit te voeren.

9.c. Grsecurity

De patch van Grsecurity zit in de sys-kernel/hardened-sources maar is default uitgeschakeld. Configureer je kernel zoals je normaal doet en configueer daarna de Grsecurity opties. Een goede uitleg is beschikbaar op de Gentoo Hardened project pagina.

Recente Hardened-sources voorzien de 2.* versie van Grsecurity Grsecurity website

9.d. Kerneli

Kerneli is een patch die encryptie toevoegt aan de huidige kernels. Door je kernel te patchen krijg je nieuwe opties zoals Cryptografische sleutels, Digest algoritmen en Cryptografische loopfilters.

Waarschuwing: De kerneli patch is op dit moment niet beschikbaar in een stabiele versie voor de laatste stabiele kernel, dus wees op je hoede als je die gebruikt.

9.e. Andere kernel patches

En er zijn er waarschijnlijk nog een ganse boel meer...

10. Beveilig Diensten (Services)

10.a. Apache

Apache (1.3.26) komt met een leuk en goed configuratiebestand, maar toch zijn er enkele aanpassingen nodig, zoals het binden aan 1 enkel adres en informatielekken tegenhouden. Dit zijn de opties die je in het configuratiebestand zou moeten toepassen:

Indien je ssl aan je /etc/make.conf hebt toegevoegd alvorens je apache geinstalleerd hebt is er toegang tot een ssl webserver. Voeg gewoon de volgende regel toe om deze te activeren:

Codevoorbeeld 1.1: /etc/conf.d/apache

HTTPD_OPTS="-D SSL"

Codevoorbeeld 1.2: /etc/apache/conf/apache.conf

#Laat het naar jouw localhost luisteren
Listen 127.0.0.1
BindAddress 127.0.0.1
#Het is geen goed idee om nobody of nogroup te gebruiken voor elke service die
#niet als root draait. Maak gewoon een user/group apache aan voor apache.
User apache
Group apache
#Zeg niet welke versie je hebt
ServerSignature Off
ServerTokens min

Apache is gecompileerd met --enable-shared=max en --enable-module=all. Dit zal per default alle modules activeren dus moet je de modules in de LoadModule sectie (LoadModule en AddModule) wegcommentarieren indien je ze niet wil gebruiken. Herstart de service door /etc/init.d/apache restart uit te voeren.

Meer documentatie kan je vinden op http://www.apache.org

10.b. Netqmail

Netqmail wordt verondersteld de meest veilige mailserver te zijn die er bestaat. Ze is geschreven met veiligheid (en paranoia) in gedachten. Ze laat geen relaying toe per default en heeft geen enkele veiligheidslek gehad sinds 1996. Voer gewoonweg emerge netqmail uit en begin met configureren.

10.c. Bind

Bind is gekend voor zijn (on)veiligheidsgeschiedenis en dat moet je niet lichtjes opvatten. Zoals met elke andere service mag het nooit als root draaien, dus verander aub niet de default configuratie van deze service op dat vlak. Per default stelt Gentoo geen configuratie in voor deze service dus zal je je eigen dns zones in /etc/bind/named.conf moeten installeren. Maar de veiligheid hangt niet enkel af van de dns-server, maar tevens van het protocol dat gebruikt wordt moet goed geconfigureerd zijn.

Mensen vragen vaak "Waarom niet djbdns" gebruiken (zeer veilige dns van D.J. Bernstein) en het antwoord is: Bind heeft features die djbdns niet heeft, zoals ondersteuning voor IPv6 (of toch niet zonder patches).

Codevoorbeeld 3.1: /etc/bind/named.conf

#Stel ACLs in
acl "mynet" { 10.0.0.0/24; };

options {
  directory "/var/bind";
  pid-file "/var/run/named/named.pid";
#Laat toe dat "mynet" queries uitvoert.
  allow-query { "mynet"; };
#Laat geen zonetransfers toe.
  allow-transfer { none; };
  forward only;
  forwarders { 10.0.0.2; };
#Laat enkel recursie toe aan "mynet"
  recursion no;
  allow-recursion { mynet; };
#Bind aan een interface
  listen-on { 10.0.0.1; };
#Toon de versie niet
  version "Heeeeeeeres Jhonny!";
};

key "rndc-key" {
  algorithm hmac-md5;
  secret "o1BYkYC+bXeZgHDsrVBwRQ==";
};

#Laat enkel beheer toe van localhost en met een sleutel
controls {
  inet 127.0.0.1 port 953
  allow { 127.0.0.1; } keys { "rndc-key"; };
};

Dit is een default goede configuratie. Echter heeft Bind versie 9 speciale chrootfunctionaliteit dat je best gebruikt. Hier leg ik uit hoe je je gechroote bind aanmaakt:

Codevoorbeeld 3.2: Aanmaken van chrootomgeving

# mkdir -p /chroot
# mkdir /chroot/dns
# mkdir /chroot/dns/dev
# mkdir /chroot/dns/etc
# mkdir /chroot/dns/var
# mkdir /chroot/dns/var/run
# mkdir /chroot/dns/var/run/named
# chown -R named:named /chroot/dns/var/run/named
# cp -R /etc/bind /chroot/dns/etc/.
# cp /etc/localtime /chroot/dns/etc/localtime
# cp -R /var/bind /chroot/dns/var/.
# mknod /chroot/dns/dev/zero c 1 5
# chmod 666 /chroot/dns/dev/zero
# mknod /chroot/dns/dev/random c 1 8
# chmod 666 /chroot/dns/dev/random
# cp -a /dev/log /chroot/dns/dev/log
# cd /chroot/dns
# chattr +i etc etc/localtime var

Dit zal een chrootomgeving aanmaken in /chroot. Al wat we nu nog moeten doen is de initscript aanpassen om de nieuwe chrootomgeving te gebruiken. Editeer /etc/init.d/named en voeg -t /chroot/dns toe aan de startfunctie. Je zou tevens beter de stop-functie ook aanpassen om naar het correcte PID-bestand te wijzen (/chroot/var/run/named/named.pid). Herstart je DNS-server.

Nota: Een hacker kan uit een chrootjail ontsnappen indien hij goed genoeg is (zie hoe je dat voorkomt in de kernelpatch sectie van dit document).

Documentatie kan gevonden worden op het Internet Software Consortium (Engels).

10.d. Djbdns

Er is niet echt veel te vertellen over djbdns behalve dat de auteur geld wil verwedden op het feit dat zijn software veilig is. Dus ga en probeer het eens: http://www.djbdns.org. Het is verschillend van Bind v9 wat betreft configuratie e.d. maar echt moeilijk is het nie.

10.e. Samba

Samba is een netwerk file/printer-sharing protocol tussen Microsoft/Novell netwerken en zou niet mogen gebruikt worden over het internet. Maar ongeacht dat heeft het nog steeds veiligheid nodig.

Codevoorbeeld 5.1: /etc/samba/smb.conf

[global]
  #Aan een interface binden
  interfaces = eth0 10.0.0.1/32

  #Geencrypteerde paswoorden gebruiken
  encrypt passwords = yes
  directory security mask = 0700

  #Enkel toegang verlenen aan het 1.0.0.* netwerk
  hosts allow = 10.0.0.

  #Gebruikersidentificatie gebruiken
  #(dus geen share-mode)
  security = user
  
  #Alle gepriviligeerde accounts weigeren
  invalid users = root @wheel

  #Maximaal gebruik (in kilobytes)
  max disk size = 102400

  #Paswoordbeleid forceren
  min password length = 8
  null passwords = no

  #PAM gebruiken (indien ondersteund)
  obey pam restrictions = yes
  pam password change = yes

Zorg ervoor dat de permissies correct zijn op elke share en herinner je eraan om de documentatie (Engels) te lezen.

Herstart nu je server en voeg de gebruikers toe die toegang moeten hebben tot deze service. Dit kan je doen door /usr/bin/smbpasswd te gebruiken met de -a optie.

10.f. ssh

De enige beveiliging dat OpenSSH nodig heeft is een sterkere authenticatie gebruiken die gebaseerd is op publieke-sleutel encryptie. Veel sites zoals http://www.sourceforge.net, http://www.php.net and http://www.apache.org) hebben geleden onder ongewenste invallen door een paswoord-lek of slecht wachtwoord.

Codevoorbeeld 6.1: /etc/ssh/sshd_config

#Laat alleen versie 2 toe
Protocol 2

#Schakel root login uit. Gebruikers moeten inloggen moeten met su naar 
#root-gebruiker overschakelen
PermitRootLogin no

#Schakel Public key authenticatie aan
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

#Laat .rhost and normaal paswoord authenticatie niet toe
RhostsAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no

#Laat alleen users in the groep wheel of admin toe om in te loggen
AllowGroups wheel admin

#Laat in die groepen alleen de volgene gebruikeres toe
#De @<domeinnaam> is optioneel maar vervangt
#de oudere AllowHosts optie
AllowUsers kn@gentoo.org bs@gentoo.org

#Loggen 
SyslogFacility AUTH
LogLevel INFO

ListenAddress 127.0.0.1

Controleer ook dat je UsePAM yes aan hebt staan in je configuratie-bestand omdat deze het publieke-sleutel authenticatie uitschakelt.

Alles wat je nu nog hoeft te doen is voor elke gebruiker een sleutel aanmaken op de machine waar ze willen inloggen; met de volgende commando:

Codevoorbeeld 6.2: Creer een DSA keypair

# /usr/bin/ssh-keygen -t dsa

En voer een wachtwoord in.

Codevoorbeeld 6.3: Uitvoer van ssh-keygen

Generating public/private dsa key pair.
Enter file in which to save the key (/home/kn/.ssh/id_dsa):[Press enter]
Created directory '/home/kn/.ssh'.
Enter passphrase (empty for no passphrase): [Enter passphrase]
Enter same passphrase again: [Enter passphrase again]
Your identification has been saved in /home/kn/.ssh/id_dsa.
Your public key has been saved in /home/kn/.ssh/id_dsa.pub.
The key fingerprint is:
07:24:a9:12:7f:83:7e:af:b8:1f:89:a3:48:29:e2:a4 kn@knielsen

Dit zal twee bestanden in jouw ~/.ssh/ map toevoegen id_dsa and id_dsa.pub genaamd. Het bestand id_dsa is jouw private sleutel en moet weggehouden worden van andere mensen dan jezelf. Het andere bestand id_dsa.pub kan uitgedeeld worden aan elke server dat je toegang tot hebt. Voeg de sleutel toe aan de gebruikers in de home map in ~/.ssh/authorized_keys en dan zou de gebruiker moeten kunnen inloggen:

Codevoorbeeld 6.4: Toevogen van het id_dsa.pub bestand aan het authorized_keys bestand

$ scp id_dsa.pub other-host:/var/tmp/currenthostname.pub
$ ssh other-host
password: 
$ cat /var/tmp/currenthostname.pub >> ~/.ssh/authorized_keys

Nu dat je gebruikers deze privé sleutel goed moeten bewaren. Laat het op een verwijderbaar medium plaatsen dat ze altijd bijhebben of laat het ze opslaan op hun wekrstation (plaats dit in het wachtwoord policy).

Voor meer informatie ga naar de OpenSSH web site.

10.g. Gebruiken van xinetd

Xinetd is een vervanging voor inetd (die Gentoo niet heeft), het internet service daemon. Het ondersteund toegang op basis van het adres of van de externe host en van de tijd van toegang. Het heeft ook een uitgebreide log capaciteit, waaronder server starttijd, externe host adressen, externe gebruiksnaam, server looptijd en aangevraagde acties.

Zoals andere services is het belangrijk om een goede configuratie te hebben. Maar sinds xinetd moet gestart worden door root en protocols ondersteund die je waarshijnlijk nieuw in het oor klinken, raden we je aan ze niet te gebruiken. Maar als je het wilt gebruiken, hier kun je zien hoe je veiligheid op toevoegt.

Codevoorbeeld 7.1: Installeer xinetd

# emerge xinetd tcp-wrappers

En pas het configuratie bestand aan.

Codevoorbeeld 7.2: /etc/xinetd.conf

defaults
{
 only_from = localhost
 instances = 10
 log_type = SYSLOG authpriv info
 log_on_success = HOST PID
 log_on_failure = HOST
 cps = 25 30
}

# This will setup pserver (cvs) via xinetd with the following settings:
# max 10 instances (10 connections at a time)
# limit the pserver to tcp only
# use the user cvs to run this service
# bind the interfaces to only 1 ip
# allow access from 10.0.0.*
# limit the time developers can use cvs from 8am to 5pm
# use tpcd wrappers (access control controlled in 
# /etc/hosts.allow and /etc/hosts.deny)
# max_load on the machine set to 1.0
# The disable flag is per default set to no but I like having 
# it in case of it should be disabled
service cvspserver
{
 socket_type = stream
 protocol = tcp
 instances = 10
 protocol = tcp
 wait = no
 user = cvs
 bind = 10.0.0.2
 only_from = 10.0.0.0
 access_times = 8:00-17:00
 server = /usr/sbin/tcpd
 server_args = /usr/bin/cvs --allow-root=/mnt/cvsdisk/cvsroot pserver
 max_load = 1.0
 log_on_failure += RECORD
 disable = no
}

Voor meer informatie lees man 5 xinetd.conf.

10.h. X

Standaard is Xorg geconfigureerd om als xserver te fungeren. Dit kan gevaarlijk zijn aangezien X ook luistert naar onge-encrypteerde TCP conneties voor xclients.

Belangrijk: Als je dit niet nodig hebt; dan schakel je die best uit!

Maar als je afhangt van een workstation te gebruikena ls een Xserver gebruik dan de /usr/X11R6/bin/xhost commando. Dit commando laat clienten toe om van andere pc's te connecteren en de display gebruiken. Dit kan handig zijn als je een X aplicatie van een andere machine nodig hebt and de enige manier is door het netwerk, maar het kan ook uitgebuid worden door een aanvaller. De syntax van dit comamndo is /usr/X11R6/bin/xhost +hostname

Waarschuwing: Gebruik nooit het xhost + optie! Dit zal alle clienten tolaten om te connecteren en controle van je x overnemen. Als een aanvaller toegang kan krijgen tot je X kan hij alle ingetypte toetsen loggen en controle van je desktop over nemen. ALs je het moet gebruiken, gebruik atijd een ingestelde hostnaam.

Een veiligere oplossing is om deze optie uit te schakelen en volledig dit uit te schakelen bij het starten van X, dit kan met startx -- -nolisten tcp of schakel dit permanent uit in de config.

Codevoorbeeld 8.1: /usr/X11R6/bin/startx

defaultserverargs="-nolisten tcp"

Controleer dat startx niet overschreven wordt als je een nieuwe versie van xorg installeerd. Daarom moet je het beschermen. Voeg de volgende lijn in /etc/make.conf:

Codevoorbeeld 8.2: /etc/make.conf

CONFIG_PROTECT_MASK="/usr/X11R6/bin/startx"

Als je een grafische login manager gebruikt; heb je een andere aanpak nodig.

Voor gdm (Gnome Display Manager)

Codevoorbeeld 8.3: /etc/X11/gdm/gdm.conf

[server-Standard]
command=/usr/X11R6/bin/X -nolisten tcp

Voor xdm (X Display Manager) en kdm (Kde Display Manager)

Codevoorbeeld 8.4: /etc/X11/xdm/Xservers

:0 local /usr/bin/X11/X -nolisten tcp 

11. Chrooting en Virtuele Servers

11.a. Chrooting

Een dienst chrooten is een manier om restricties op te leggen aan een dienst of gebruiker-omgeving om enkel toe te staan wat het zou moeten en dus niet de toegang krijgen tot informatie die zou kunnen leiden tot het verkrijgen van root-toegang. Door het uitvoeren van een dienst als een andere gebruiker dan root (nobody, apache, named) kan een aanvaller alleen bestanden met de permissie van die gebruiker raadplegen. Dat betekent dat een aanvaller dus geen root -toegang kan krijgen zelfs als de service een veiligheidsgebrek.

Sommige diensten zoals pure-ftpd en bind hebben eigenschappen om te chrooten, en andere niet. Als de dienst het ondersteund, gebruik het. Anders moet je uitvissen hoe je zelf een omgeving kan creeeren voor die dienst. Laten we eens bekijken hoe we een chroot creeeren, om de basisbegrippen van hoe chroot werkt, zullen we het testen met bash, een gemakkelijke manier om het aan te leren.

creeer de /chroot map met mkdir /chroot. Zoek uit met welke dynamische bibliotheken bash gecompileerd zijn (als het is gecompileerd is met de -static optie is deze stap onnodig).

Het volgende commando zal een lijst maken met bibliotheken gebruikt door bash.

Codevoorbeeld 1.1: Een lijst verkrijgen van gebruikte bibliotheken

# ldd /bin/bash
  libncurses.so.5 => /lib/libncurses.so.5 (0x4001b000)
  libdl.so.2 => /lib/libdl.so.2 (0x40060000)
  libc.so.6 => /lib/libc.so.6 (0x40063000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Laten we nu een omgeving voor bash maken.

Codevoorbeeld 1.2: Maak een chroot-omgeving voor bash

# mkdir /chroot/bash
# mkdir /chroot/bash/bin
# mkdir /chroot/bash/lib

Kopieer vervolgens de bestanden die gebruikt zijn door bash (/lib) naar de chrooted lib en kopieer het bash commando naar de chroot- bin map. Dit zal exact dezelfde omgeving maken, enkel met minder functies. Na het kopieren kunt ut het uittesten: chroot /chroot/bash /bin/bash. Als jee een bericht krijgt die / bevat, werkt het! Anders zal het zeggen welke file je mist. Sommige gedeelde bibliotheken hangen af van elkaar.

je zal een bericht krijgen dat je binnen de chroot niets werkt behalve echo. Dit is omdat we geen andere comamndo's in onze chroot-omgeving dan bash hebben. Dit is omdat echo is een ingebouwde funtie van bash.

Deze stappen moet je ook uitvoeren om je eigen chroot-omgeving te maken voor je dienst. Het enige verschil is dat de dienst meestal afhangt van apparaten en configuratie bestanden in de /etc map. Kopieer die simpelweg (apparaten kunnen worden gekopieerd, met cp -a) naar een chroot-omgeving. Bewerk het init-script om de omgeving te gebruiken voor het opstarten ervan. Het kan moeilijk zijn om uit te zoeken welk apparaat en configuratie bestand nodig zijn voor een dienst. Dit is waar het strace commando handig is. start de dienst met /usr/bin/strace bash en kijk uit voor open, read, stat en soms connect in de output van het commando. Dit zal een hint geven welke bestanden je moet kopieren. Maar in de meeste gevallen moet je het passwd bestand (bewerk eerst dit bestand zodanig dat overbodige gebruikers voor deze service er niet meer inzitten.), /dev/zero, /dev/log en /dev/random.

11.b. Gebruikers-modus Linux

Een andere manier voor het creeeren van een veilige gebruikers-omgeving is door het opstarten van een virtuele machine. Een virtuele machine zoals het woord zegt is een proces die bovenop je eigen OS loopt, gebruikmakend van je eigen hardware en OS-omgeiving. De veiligheids-voordeel die we hieruit halen is dat de server niet aangetast wordt(enkel de virtuele server).

Voor meer informatie over hoe je een Gebruikers-modues voor linux opstart, raadpleeg de Gebruikers-mode Linux gids.

12. Firewalls

12.a. Een firewall

Mensen denken vaak dat een firewall de beste veiligheid garandeerd, maar ze zijn fout in de meeste gevallen kan een fout-geconfigureerde firewall minder veiligheid geven dan geen hebben. Een firewall is ook een software en zou moeten op de zelfde manier behandeld worden als een ander, omdat het hoogstwaarschijnlijk fouten bevat.

Dus denk, voor je een firewall implementeerd in je systeem! Heb je echt een nodig? Als denkt dat je een nodig hebt, schrijf een beleid van wat het moet doen, hoe het moet werken, welke soort firewall je nodig hebt en wie het moet onderhouden. Maar allereerst lees deze firewall-gids.

Firewalls worden gebruikt voor twee doelstellingen.

  • Om gebruikers wormvrij/aanvalvrij te houden
  • Om gebruikers toegang te beperken tot het intern netwerk

Er zijn slechts 3 soorten van firewalls:

  • Pakket filters (Packet filtering)
  • (Circuit relay)
  • (Application gateway)

Een firewall zou moeten werken op een machine speciaal gemaakt voor deze service en geen andere (of sshd als enige) en beveiligd zoals aangeraden in deze gids.

12.b. Pakket filters (Packet filtering)

Alle netwerk trafiek wordt verzonden in de vorm van pakketten. Grote aantallen van trafiek worden opgedeeld in kleinere pakketen in de vorm van pakketten voor het makkerlijker te kunnen behandelen. Daarna worden die terug aaneengeschakeld als ze aangekomen zijn op de bestemming. In het pakket-kop van ieder bestand zit informatie van waar en hoe het zou moeten afgeleverd zijn. Deze informatie is exact wat een pakket filter firewall gebruikt. Filteren gebeurd op basis van :

  • Toestaan of verwerpen pakketten op basis van bestemming/bron IP adres
  • Toestaan of verwerpen pakketten op basis van bestemming/bron IP poort
  • Toestaan of verwerpen pakketten op basis van het gebruikte protocol
  • Toestaan of verwerpen pakketten op basis van bepaalde opties binnenin een protocol

Met andere woorden, Het filteren is gebaseerd op de data in de kop van het pakket en niet op de inhoud.

zwakheden:

  • Adres informatie in een pakket kan een vals IP adres bevatten van de zender (of een gespoofd adres zoals we dat noemen).
  • Data of aanvragen binnen een toegestaan pakket kan ongewenste data dat de aanvaller kan gebruiken om het gebruiken van gekende virussen in een dienst of achter een firewall.
  • Meestal alleenstaand falingspunt

voordelen:

  • Simpel en gemakkelijk in te voegen
  • Kan waarschuwingen geven over een mogelijke aanval voor het gebeurd (bv. door het detecteren van poort-scans)
  • Goed voor het stoppen van SYN aanvallen

Voorbeelden van gratis pakket filters voor Linux:

Nota: Het is aangeraden dat je IPtables gebruikt. Ipchains is verouderd.

12.c. Circuit relay

Een circuit level gateway is een firewall die verbindingen valideerd vooralleer het data uitwisselen toelaat. Dit betekend dat het niet alleen toelaat of wijgert pakketten gebaseert op de pakket-kop maar controleert als de connectie tussen zender en ontvanger goed is gebeurt volgend vooropgestelde regels. Daarna opent de firewall pas een sessie en laat het toe data uit te wisselen. Filteren gebeurd op basis van :

  • Bron/bestemming IP adres
  • Bron/bestemming port
  • Duur van de overdracht
  • Protocol
  • Gebruiker
  • Wachtwoord

Al het verkeer is gevalideerd en in de gaten gehouden en ongewenst verkeer kan worden geweigerd.

zwakheden:

  • Is actief op het Transport Layer en kan enige wijzigingen van programma's, die normaal transporteer functies verstrekken, teweeg brengen.

12.d. Application Gateway

Het Aplicatie Gateway level is een proxy voor aplicaties, die data uitwisselt met de externe server opdat de clients beveligigd zouden zijn. Het is meestal goed weggehouden van het publieke gedeelte, geplaast achter een DMZ (geDeMilitarizeerde Zone : Het deel van een geheim netwerk dat zichtbaar is door een firewall) of een firewall die geen connecties toestaat van buitenaf. Filteren is gebaseerd op:

  • Toestaan of weigeren op basis van Bron/Bestemming IP adres
  • Gebaseerd op het pakket's inhoud
  • Raadpleeg limitaties op een bestand opleggen op basis van extensies

Voordelen:

  • Kan bestanden cachen zodat de netwerkstabiliteit verhoogd.
  • Kan gedetailleerde logs aanmaken van alle connecties
  • Schaalt goed (Sommige proxy servers kunnen de gecachte date "delen")
  • Geen toegang tot buiten (het netwerk)
  • Kan de inhoud van een bestand meteen aanpassen

Zwakheden:

  • Complexe configuratie

Application gateways zijn algemeen de veiligste ondervonden sinds ze geen root-toegang nodig hebben om op te starten en de computers "achter" die pc zijn niet bereikbaar.

Voorbeeld van een gratis application gateway:

12.e. Ipfiltering via Iptables

Om Iptables te kunnen gebruiken moet het toelaten in de kernel. Ik heb Iptables als module toegelaten in mijn kernel( de Iptables commando zal ze laden als hij die nodig heeft), en heb mijn kernel opnieuw gebouwd (maar je kunt evengoed Iptables in de kernel bakken, als je liever oadable Kernel Modules afzet in je kernel-configuratie). Voor meer informatie over hoe je je kernel moet configureren kun je terrecht op de volgende url : Iptables gids hoofdstuk 5: voorbereidingen. Na de nieuwe kernel geinstaleerd te hebben (of tijdens het hercomileren) moet je ook nog het iptables comando toevoegen aan het systeem; Dit kan simpelweg met emerge iptables.

Test nu iptables door het volgende commando uit te voeren: iptables -L. Als dit niet lukt dan is er iets mis met je configuratie.

Iptables is een stateful packet filter wat wil zeggen dat ze meer controle en veiligheid biedt dan ipchains (Linux versie 2.2) die niet stateful is. Nu vraag je je waarschijnlijk af wat stateful wil zeggen? En wat het verschil is?

We weten allemaal dat TCP uitgemaakt is als een serie pakketten. Elke pakket bevat informatie over bronadres, doeladres en een sequentienummer opdat de pakketten weer samengebracht kunnen worden. We weten tevens dat TCP connectie-georienteeerd is en UDP connectieloos. Dat zijn de "states" die gebruikt worden. Nu vraag je je waarschijnlijk af "En dan?" Wel, daar kom ik nu aan toe...

Stel je nu voor dat je een stateless firewall hebt (ipchains) en je wil niet dat externe pc's een connectie naar je interne services aanmaken; maar hoe kan je nu weten of een pakket nu behoort tot een connectie naar of een connectie van? Een stateless firewall kan geen onderscheidt tussen beide maken door te kijken naar de SYN vlag.

Veronderstel dat een hacker een bende zelfgemaakte pakketten verstuurt waarin hij de SYN vlag of andere vlaggen aangepast heeft. Dit is iets wat hackers vaak doen. Ze zenden zo pakketten langs de firewall om en passen routingtables aan of exploiteren services die op de firewall draaien maar zogezegd veilig moeten zijn. Een stateful firewall zal bijhouden welke connecties er zijn en kan gemakkelijk verifieren of een pakket tot een bestaande connectie behoort of niet. Wanneer een connectie, die zegt dat hij een deel is van een bestaande connectie, ontmaskert wordt als vals, dan kan deze aangeduid worden als "ongeldig" en kan men de bijhorende pakket weigeren. Op die manier is het dus mogelijk om "Stealth Scans" tegen te houden, aangezien deze gebruik maken van valse connecties.

Er zijn nog tientallen andere redenen waarom, maar ik denk wel dat je bovenstaande uitleg begrijpt. Eenvoudige regels maken een kleinere firewallconfiguratie mogelijk waardoor ze dus ook gemakkelijker is om te beheren.

Iptables biedt verschillende andere mogelijkheden, zoals rate limitaties. Deze feature is zeer handig indien je bepaalde DoS aanvallen zoals SYN aanvallen wil tegengaan. Maar wat is nu een SYN aanval?

Wel, wanneer een TCP connectie opgemaakt wordt wordt er gebruik gemaakt van een 3-wegs handdruk:

Three-way handshake

Een SYN aanval is wanneer de vijand maar 1 SYN pakket verstuurt maar niet het andere pakket waardoor de connectie niet wordt opgemaakt. Een SYN pakket moet geen geldig zender-IP-adres bevatten omdat ze geen antwoord vereist van de hacker. Dus blijft de half-open connectie hangen totdat deze timeout. Indien de hacker dus veel SYN pakketyrn verzendt met een valse zender-IP dan zal de doelpc blijven wachten op een antwoord die nooit komt. Afhankelijk van de timeout instellingen van je systeem zal de connectie gedurende 30 tot 60 seconden open blijven. Wanneer de connectielimiettabel volledig in gebruik is kan je pc geen andere connecties meer aangaan, en is je server dus onbereikbaar via het internet.

Dit is waar rate limit in het spel komt. Het is mogelijk om het aantal SYN pakketten van een bepaald bronadres te limiteren dmv -m limit --limit 1/s. Dit zal het aantal SYN pakketten per bronadres restricteren en dus de SYN floods tegengaan.

Nu wat praktische zaken...

Wanneer iptables in de kernel geladen is heeft het 5 plaatsen waarin je je regels kan plaatsen. Ze noemen INPUT, OUTPUT, FORWARD, PREROUTING en POSTROUTING. Deze lijsten worden ketens (chains) genaamd omdat ze werken als een ketting: deel per deel wordt ingegeven, elk pakket doorloopt alle regels. Indien 1 regel nyet zegt, wordt het pakket geweigerd.

Je kan je regels direct in 1 van de 5 hoofdketens plaatsen, ofwel zelf ketens maken en deze toevoegen als regel aan een bestaande keten. Laten we eens kijken hoe je dat doet:

Optie: Uitleg:
-A Append (Toevoegen)
-D Delete (Verwijderen)
-I Insert (Invoegen)
-R Replace (Vervangen)
-L List (Toon)
-F Verwijder alle regels in een of alle ketens
-Z Zet de tellers van een of alle ketens op nul
-C Test dit pakket op de keten(s)
-N Maak een eigen keten
-X Verwijder een zelfgemaakte keten
-P Verander het beleid van een keten
-E Verander de naam van de keten
-p Protocol
-s Bronadres of -mask
-d Doeladres of -mask
-i Invoer naam (netwerkinterface)
-o Uitvoer naam (netwerkinterface)
-j Spring (commando voor in een keten)
-m Uitgebreide herkenning
-n Numerieke uitvoer van IP-adressen
-t Tabel om aan te passen
-v Veel uitleg geven (Verbose)
-x Nummers uitbreiden (volledige nummers tonen)
-f Enkel 2e of verdere delen onderzoeken
-V Pakket versie
--line-numbers Geef regelnummering

Allereerst proberen we alle ICMP pakketten te blokkeren (dit als voorbeeld van het gebruik van iptables):

Codevoorbeeld 5.1: Weigeren van ping-pakketten

# iptables -A INPUT -p icmp -j DROP

Eerst definieren we de keten waar dit aan moet toegevoegd worden. Daarna specifieren we het protocol en dan de regel die moet toegevoegd worden. De regel kan ACCEPT, DROP, REJECT, LOG, QUEUE, MASQUERADE, een geladen module of een zelfgedefinieerde keten zijn. In dit geval gebruiken we DROP die alle pakketten die aan de regel voldoen zullen wegsmijten zonder dit mede te delen aan de bronpc die het pakket verstuurt heeft.

Probeer nu ping localhost uit te voeren. Je zal zien dat je geen antwoord zal verkrijgen aangezien de firewall alle ICMP-pakketten weigert die toekomen op de pc. Je zal tevens geen andere pc's kunnen pingen aangezien de ICMP antwoorden ook geweigerd worden. Laten we nu alle regels verwijderen om ICMP weer toe te laten:

Codevoorbeeld 5.2: Flushen van iptables-rules

# iptables -F

Laten we nu eens kijken naar het stateful deel in iptables. Indien we een stateful inspectie van de pakketten wensen die toekomen op eth0 kunnen we dit als volgt uitvoeren:

Codevoorbeeld 5.3: Toelaten van pakketten die al tot een bestaande connectie behoren

# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Dit zal alle pakketten, die tot een al bestaande connectie behoren, of die voldoen aan de INPUT keten, doorlaten. Je kan alle pakketten die niet in de state tabel zitten weigeren door iptables -A INPUT -i eth0 -n state --state INVALID -j DROP uit te voeren juist voor bovenstaande regel. Dit zal ervoor zorgen dat de stateful deel in iptables geactiveerd wordt door de extension state te laden. Indien je een connectie van buitenuit wil toelaten tot je pc kan je --state NEW gebruiken. Iptables bevat nog enkele andere modules voor verschillende doeleinden. Onder deze modules zijn:

Module/Regel Uitleg Uitgebreide opties
mac Afhankelijk van het MAC adres van de binnenkomende pakketten regels opstellen. --mac-source
state Stateful inspectie activeren --state (states zijn ESTABLISH ED,RELATED, INVALID, NEW)
limit Rate matching limiteren --limit, --limit-burst
owner Probeert om verschillende eigenschappen van de pakketmaker te herkennen --uid-owner userid --gid-owner groupip --pid-owner processid --sid-owner sessoinid
unclean Verschillende random controles op pakketten.

Laten we een zelfgedefinieerde keten maken en deze toepassen op een van de bestaande ketens:

Codevoorbeeld 5.4: Aanmaken van een gebruiker-gedefinieerde keten

(Maak een nieuwe keten met 1 regel)
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(Het default beleid is dat alle uitgaande traffiek toegelaten wordt.
Inkomende wordt echter geweigerd.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(Voeg ze toe aan de INPUT keten)
# iptables -A INPUT -j mychain

Door de regel toe te passen op de INPUT keten krijgen we het volgende beleid: alles wordt toegelaten wat uitgaand is, en enkel inkomende pakketten die tot een bestaande connectie behoren worden toegelaten. Dit is eigenlijk algemeen gezien een slecht idee. Een beleid zou eigenlijk alles moeten weigeren en dan expliciet enkele zaken toelaten, maar dit is gewoon een voorbeeld.

Indien je meer informatie wenst, kijk dan naar iptables documentatie (Engels).

Laten we een volledig voorbeeld bekijken. Dit voorbeeld zijn mijn firewall/gateway instellingen:

  • Connecties naar de firewall zijn enkel toegelaten via SSH (poort 22)
  • Het lokale netwerk heeft toegang tot HTTP, HTTPS en SSH (en DNS natuurlijk ook)
  • ICMP traffiek kan teveel informatie bevatten en wordt dus niet toegelaten. Natuurlijk moet er wel een beetje ICMP-traffiek mogelijk zijn.
  • Portscans moeten gedetecteerd en gelogged worden
  • SYN aanvallen dienen vermeden te worden
  • Alle andere traffiek dient geweigerd en gelogged te worden

Codevoorbeeld 5.5: /etc/init.d/firewall

#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#binnenin
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#buiten
OIP=217.157.156.144
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net procparam
}

rules() {
  stop
  ebegin "Setting internal rules"

  einfo "Setting default rule to drop"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #default regel
  einfo "Creating states chain"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
      "Bad packet from ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #ICMP traffiek
  einfo "Creating icmp chain"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #Inkomende traffiek
  einfo "Creating incoming ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #Flood beveiliging
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -p tcp --dport ssh -j ACCEPT

  #Uitgaande traffiek
  einfo "Creating outgoing ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT

  einfo "Creating outgoing dns traffic chain"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
      -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
     -j ACCEPT

  einfo "Creating outgoing http/https traffic chain"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT

  #Portscanners tegenhouden
  einfo "Creating portscan detection chain"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
      --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
      5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
      -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
      --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Pas toe en voeg ongeldige states toe aan de ketens
  einfo "Applying chains to INPUT"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -j icmp_allowed
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allowed-connection

  einfo "Applying chains to FORWARD"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -j icmp_allowed
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allowed-connection

  einfo "Applying chains to OUTPUT"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allowed-connection

  # Laat clients toe om via NAT te werken
  $IPTABLES -t nat -A POSTROUTING -o $IINTERFACE -j MASQUERADE
  eend $?
}

start() {
  ebegin "Starting firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} does not exists. Using default rules."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Stopping firewall"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "NAT status"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Setting panic rules"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Saving Firewall rules"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Restoring Firewall rules"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      will restore setting if exists else force rules"
  echo "stop)       delete all rules and set all to accept"
  echo "rules)      force settings of new rules"
  echo "save)       will store settings in ${FIREWALL}"
  echo "restore)    will restore settings from ${FIREWALL}"
  echo "showstatus) Shows the status"
}

Nota: Ik gebruik \ in sommige regels voor betere leesbaarheid. Het is misschien een goed idee om de regels samen te voegen in de werkelijke configuratie.

Gratis advies voor het aanmaken van firewalls:

  1. Maak je firewallsbeleid alvorens je die implementeert.
  2. Hou het simpel
  3. Weet hoe het protocol werkt (lees de RFCs)
  4. Hou in gedachten dat een firewall gewoon een stuk software is dat als root draait.
  5. Test je firewall

Indien je denkt dat iptables moeilijk te verstaan is, of veel tijd inneemt om op te stellen, maak dan gebruik van Shorewall. Dit is een front-end van iptables.

12.f. Squid

quid is een zeer sterke proxyserver en kan traffiek filteren en weigeren gebaseerd op: tijd, reguliere expressies van paden/uri's, bron en doeladressen, domeinen, browser, geidentificeerde gebruiker, mime-type, poort (protocol). En waarschijnlijk heb ik nog enkele features vergeten, maar squid is dan ook enorm uitgebreid.

In het volgende voorbeeld heb ik een bannerfilter geplaatst in plaats van een filter die gebaseerd is op pornosites. De reden hiertoe is dat Gentoo.org niet als pornosite mag gezien worden. En ik wil tevens mijn tijd niet verdoen om enkele goede pornosites voor jou op te zoeken :)

In bovenstaand geval:

  • Surfen (HTTP/HTTPS) wordt toegelaten tijdens werkuren (maandag tot vrijdag van 08 tot 17, en zaterdag van 08 tot 13 uur). Als ze hier extra lang blijven moeten ze werken. Niet surfen.
  • Downloaden is niet toegestaan (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg etc...)
  • We haten banners dus filteren we die uit en vervangen we ze met een transparante gif (hier kan je nog wel leukere zaken bedenken :)
  • Elke andere connectie van en naar het internet wordt niet toegestaan

Dit wordt in 4 gemakkelijke stappen geimplementeerd:

Codevoorbeeld 6.1: /etc/squid/squid.conf

# Binden aan een ip en poort
http_port 10.0.2.1:3128

# Default configuratie
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

# ACLs toevoegen
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255

# Wie deze proxyserver kan gebruiken
acl localnet src 10.0.0.0/255.255.0.0

# Welke poorten er toegelaten zijn
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE

# ACL gebaseerd op regexps
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"

# ACL gebaseerd op tijden/datums
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00

acl CONNECT method CONNECT

#Beheer enkel via localhost
http_access allow manager localhost
http_access deny manager

#Purge aanvragen enkel via localhost
http_access allow purge localhost
http_access deny purge

# Onbekende poorten weigeren
http_access deny !Safe_ports

# Alle poorten behalve SSL moeten niet naartoe geconnecteerd worden
http_access deny CONNECT !SSL_ports

# En nog wat enkele persoonlijke regels...

# Pagina bij banner 
deny_info NOTE_ADS_FILTERED url_ads

# En die bannerurl's dan verwijderen
http_access deny url_ads

# Alle archieven weigeren
http_access deny archives

# Enkel toegang tijdens werkuren
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends

# Al de rest weigeren
http_access deny all

Vul nu de lijst in met bestanden die de gebruikers niet mogen downloaden. Ik heb zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz and z toegevoegt.

Codevoorbeeld 6.2: /etc/squid/files.acl

\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$

Nota: Merk op dat tussen [] er telkens een hoofdletter en een kleine letter voorkomt. Dit is omdat men anders wel .AVI bestanden kan downloaden maar geen .avi...

Hierna voegen we enkele reguliere expressies toe om banners te identificeren. Je bent zelf waarschijnlijk iets creatiever dan ik hier:

Codevoorbeeld 6.3: /etc/squid/banner-ads.acl

/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif

En het laatste deel. We willen dat dit bestand getoond wordt wanneer er een banner verwijderd is. Het is niet meer dan een stukje HTML-code die een transparante 4x4 gif toont.

Codevoorbeeld 6.4: /etc/squid/errors/NOTE_ADS_FILTERED

<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif">
<TITLE>ERROR: The requested URL could not be retrieved</TITLE>
</HEAD>
<BODY>
<H1>Add filtered!</H1>

Nota: Sluit de <HTML> en <BODY> tags niet. Dit wordt vanzelf gedaan door squid.

Zoals je kan zien, squid heeft veel mogelijkheden en is heel efficient om te filteren en om als proxy ingesteld te worden. Je kunt squid zelfs alternatief gebruiken om grote netwerken te verkleinen. De configuratie die ik heb hier heb opgegeven is heel geschikt voor een klein netwerk van 1-20 gebruikers.

Maar om een packet filter (iptables) en een apcliation gateway (Squid) combineren is de beste oplossing, zelfs als Squid ergens veilig is weggestoken en niemand aan kan van buitenaf. We moeten nog altijd bereid zijn tot aanvallen van binnenaf.

Configureer nu je client browsers om de proxy server te gebruiken. De gateway zal elk contact met buitenaf weigeren tenzij ze die gebruiken.

Nota: In Mozilla kun je dit doen in Edit->Preferences->Advanced->Proxies.

Het kan ook zodanig ingesteld zijn dat je proxy als transparant wordt ingesteld : dit wil zeggen dat hij autmatisch het trafiek door de proxy stuurd.

Codevoorbeeld 6.5: Portforwarding toestaan in onze proxyserver

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128

Nota: Als de proxy aan het werken is op de packet filter; (dit is niet aangeraden), Kan dit noodzakelijk zijn dat u genoeg reserve computers hebt (gebruik REDIRECT doel in de plaats van DNAT; REDIRECT stuurt de pakketten naar de localhost).

12.g. Geleerde lessen

We hebben geleerd dat;

  1. Een firewall hebben ook riskant kan zijn voor jezelf. Een slecht geconfigureerde firewall is slechter dan geen hebben.
  2. Hoe je een basis-opstelling maakt voor een gateway en een transparante proxy
  3. De sleutel tot een goede firewall is een protocols kennen die je wilt toestaan.
  4. Dat IP verkeer niet altijd legale data bevat; bvb ICMP pakketten, wat een That IP traffic does not always contain legitimate data, e.g. ICMP packets, die een kwaadwillige inhoud kan bevatten.
  5. Hoe je een SYN aanval kan voorkomen.
  6. Filteren van HTTP trafiek door het verwijderen van afbeeldingen, downlaods en/of virussen
  7. Packet filters and application gateways combineren verstrekken een betere controle.

Nu, als je echt nood hebt, creeer een firewall die you noden toekomen.

13. Opsporen van het binnendringen in je systeem

13.a. Aide (Advanced Intrusion Detection Environment)

Aide is een hostgebaseerde IDS (vrij alternatief voor Tripwire). Indien je Tripwire kent dan zou je geen moeilijkheden mogen hebben met de configuratie van Aide.

Het configuratiebestand is gebaseerd op reguliere expressies, macros en regels voor bestanden en directories. We hebben de volgende macro's:

Macro Uitleg Syntax
ifdef Indien gedefinieerd @@ifdef "name"
ifndef Indien niet gedefinieerd @@ifndef "name"
define Definieer een variabele @@define "name" "value"
undef Undefinieer een variabele @@undef "name"
ifhost Indien "hostname" @@ifhost "hostname"
ifnhost Indien niet "hostname" @@ifnhost "hostname"
endif Endif moet gebruikt worden na alle macro's behalve define en undef @@endif

Deze macro's zijn zeer handig indien je meer dan 1 Gentoo pc hebt en je wil Aide op alle pc's gebruiken. Niet alle machines bevatten immers dezelfde services of dezelfde gebruikers.

Vervolgens hebben we een verzameling van eigenschappen van bestanden of directories waarop we controleren. Dit zijn een combinatie van permissies, bestandseigenschappen en cryptografische hashes of checksums.

Flag Uitleg
p permissies
i inode
n aantal links
u gebruiker
g groep
s grootte
b hoeveelheid blokken
m mtime
a atime
c ctime
S controleer op groeiende grootte
md5 md5 checksum
sha1 sha1 checksum
rmd160 rmd160 checksum
tiger tiger checksum
R p+i+n+u+g+s+m+c+md5
L p+i+n+u+g
E Lege groep
> Groeiende logbestand p+u+g+i+n+S

En indien Aide gecompileerd is met mhash ondersteuning heeft het nog enkele andere mogelijkheden:

Flag Uitleg
haval haval checksum
gost gost checksum
crc32 crc32 checksum

Nu kan je je eigen regels aanmaken gebaseerd op bovenstaande vlaggen door deze als volgt te combineren:

Codevoorbeeld 1.1: Instellen van AIDE-regel

All=R+a+sha1+rmd160
Norm=s+n+b+md5+sha1+rmd160

Het laatste wat we nu moeten doen is kijken hoe je regels toevoegt voor een bestand of directorie. Eenvoudig gezegd geef je gewoon de bestandsnaam of directorie naam in en dan de regel. Aide zal dan alle bestanden recursief toevoegen tenzij je iets anders specifieert:

Flag Uitleg
! Voeg dit bestand of directorie niet toe
= Voeg deze directorie toe, maar niet recursief

Laten we eens een volledig voorbeeld beschouwen:

Codevoorbeeld 1.2: /etc/aide/aide.conf

@@ifndef TOP DIR 
@@define TOPDIR /
@@endif

@@ifndef AIDEDIR 
@@define AIDEDIR /etc/aide
@@endif

@@ifhost smbserv
@@define smbactive
@@endif

# De locatie van de database waarvan gelezen moet worden
database=file:@@{AIDEDIR}/aide.db

# De locatie van de database waarnaartoe geschreven moet worden
database_out=file:aide.db.new

verbose=20
report_url=stdout

# Regel definities
All=R+a+sha1+rmd160
Norm=s+n+b+md5+sha1+rmd160

@@{TOPDIR} Norm
!@@{TOPDIR}etc/aide
!@@{TOPDIR}dev
!@@{TOPDIR}proc
!@@{TOPDIR}root
!@@{TOPDIR}tmp
!@@{TOPDIR}var/log
!@@{TOPDIR}var/run
!@@{TOPDIR}usr/portage
@@ifdef smbactive
!@@{TOPDIR}etc/smb/private/secrets.tdb
@@endif
=@@{TOPDIR}home Norm

In bovenstaand voorbeeld specifieren we enkele macro's alsook waar de hoofddirectorie is en waar de aide-directorie is. Aide controleert /etc/aide/aide.db voor de bestandsintegriteit. Maar wanneer er geupdate moet worden of wanneer een nieuw bestand aangemaakt wordt wordt deze opgeslagen in /etc/aide/aide.db.new. Dit is omdat het eerste db-bestand niet zou overschreven worden. De optionele report_URL is een "nog te implementeren" feature dat nu nog geen resultaat geeft, maar de bedoeling is dat er in de toekomst de URL komt van een e-mailadres of van een script waarnaartoe gemaild kan worden of welke uitgevoerd kan worden.

Na de configuratie moet je je eigen db-bestand aanmaken door aide -i uit te voeren, en dan het bestand /etc/aide/aide.db.new naar /etc/aide/aide.db te kopieren. Daarna voeg je de controle toe aan cron door crontab -e als root uit te voeren.

Nota: Afhankelijk van je CPU en de vlaggen die gebruikt hebt kan de controle een tijdje duren.

Codevoorbeeld 1.3: aide -u als een cronjob instellen

0 3   * * * /usr/bin/aide -u

Nota: Herinner je eraan om je mailserver te configureren zodat je de root's mail krijgt. Anders zal je nooit Aides rapporten ontvangen.

In bovenstaand geval wordt aide om 3am uitgevoerd. Dit is omdat ik niet de gebruikers wil lastig vallen wanneer deze werken. Ik gebruik tevens de -u (Update) optie in plaats van de -C (Check). De reden daartoe is dat -u de bestanden controleert en niet de originele database overschrijft waardoor je tijd wint aangezien het enige wat je moet doen wanneer een bestand veranderd is is het aidebestand kopieren. Controleer gewoon de aanpassingen om te zien of jij het wel bent die de verandering heeft doorgevoerd in plaats van een hacker alvorens je aide aanpast aan de nieuwe situatie.

Nu is er een probleem met het opslaan van de database op je bestandssysteem aangezien de hacker (als hij weet dat aide geinstalleerd is) waarschijnlijk zal proberen om de db-bestanden aan te passen of te verwijderen. Dus is het belangrijk dat deze bestanden op een CD of een ander medium staan (origineel of als kopie) alsook de aide binaire bestanden (want die kan een hacker ook aanpassen). Dus maak je best een CD of een ander medium en maak je het best een kopie van de .db bestanden en de aide binaire bestanden.

Meer informatie vind je op aide's projectpagina (Engels).

13.b. Snort

Codevoorbeeld 2.1: Aanmaken van de gebruiker snort

# user add snort -d /var/log/snort -s /dev/null
# chown -R snort /var/log/snort

Codevoorbeeld 2.2: /etc/conf.d/snort

PID FILE=/var/run/snort_eth0.pid
MODE="full"
NETWORK="10.0.0.0/24"
LOG DIR="/var/log/snort"
CO NF=/etc/snort/snort.Cong
SNORT_OPTS="-D -s -u snort -dev -l $LOGDIR -h $NETWORK -c $CONF"

Codevoorbeeld 2.3: /etc/snort/snort.conf

(Stap 1)
var HOME_NET 10.0.0.0/24
var EXTERNAL_NET any
var SMTP $HOME_NET
var HTTP_SERVERS $HOME_NET
var SQL_SERVERS $HOME_NET
var DNS_SERVERS [10.0.0.2/32,212.242.40.51/32]
var RULE_PATH ./

(Stap 2)
preprocessor frag2
preprocessor stream4: detect_scans detect_state_problems detect_scans disable_evasion_alerts
preprocessor stream4_reassemble: ports all
preprocessor http_decode: 80 8080 unicode iis_alt_unicode double_encode iis_flip_slash full_whitespace 
preprocessor rpc_decode: 111 32771
preprocessor bo: -nobrute
preprocessor telnet_decode

(Stap 3)
include classification.config

(Stap 4)
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/smtp.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/rservices.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules
include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-attacks.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/backdoor.rules
include $RULE_PATH/shellcode.rules
include $RULE_PATH/policy.rules
include $RULE_PATH/porn.rules
include $RULE_PATH/info.rules
include $RULE_PATH/icmp-info.rules
include $RULE_PATH/virus.rules
# include $RULE_PATH/experimental.rules
include $RULE_PATH/local.rules

Codevoorbeeld 2.4: /etc/snort/classification.config

config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Potentially Bad Traffic, 2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: successful-recon-largescale,Large Scale Information Leak,2
config classification: attempted-dos,Attempted Denial of Service,2
config classification: successful-dos,Denial of Service,2
config classification: attempted-user,Attempted User Privilege Gain,1
config classification: unsuccessful-user,Unsuccessful User Privilege Gain,1
config classification: successful-user,Successful User Privilege Gain,1
config classification: attempted-admin,Attempted Administrator Privilege Gain,1
config classification: successful-admin,Successful Administrator Privilege Gain,1

# Nieuwe classificaties
config classification: rpc-portmap-decode,Decode of an RPC Query,2
config classification: shellcode-detect,Executable code was detected,1
config classification: string-detect,A suspicious string was detected,3
config classification: suspicious-filename-detect,A suspicious filename was detected,2
config classification: suspicious-login,An attempted login using a suspicious username was detected,2
config classification: system-call-detect,A system call was detected,2
config classification: tcp-connection,A TCP connection was detected,4
config classification: trojan-activity,A Network Trojan was detected, 1
config classification: unusual-client-port-connection,A client was using an unusual port,2
config classification: network-scan,Detection of a Network Scan,3
config classification: denial-of-service,Detection of a Denial of Service Attack,2
config classification: non-standard-protocol,Detection of a non-standard protocol or event,2
config classification: protocol-command-decode,Generic Protocol Command Decode,3
config classification: web-application-activity,access to a potentially vulnerable web application,2
config classification: web-application-attack,Web Application Attack,1
config classification: misc-activity,Misc activity,3
config classification: misc-attack,Misc Attack,2
config classification: icmp-event,Generic ICMP event,3
config classification: kickass-porn,SCORE! Get the lotion!,1

Meer informatie kan je vinden op Snorts website (Engels).

13.c. Het ontdekken van slecht werkende software met chkrootkit

HIDS zoals AIDE zijn een goede manier om veranderingen op te merken in jouw systeem, maar het zal nooit pijn doen om nog een andere beveiliging voor je pc te gebruiken. chkrootkit is een programma dat gewone system files controleert op hun aanwezigheid van rootkits (software die gemaakt is om aanvalacties wegsteekt en hem toelaat andere slecht-werkende software te instaleren. Waar chkrootkit en alternativen zoals rkhunter) zijn handige gebruiksinstrumenten, bijde voor systeemonderhoud en opsporen van invallen na een aanva, ze kunnen niet verzekeren dat je systeem veilig is.

De beste manier om chkrootkit te gebruiken aanvallen te ondekken is gewoon het te starten en best ook regelmatig via cron. Om te starten; emerge app-admin/chkrootkit. chkrootkit kan ook in de command line worden opgestart met het gelijknamige command, of via cron met zo'n uitzicht.

Codevoorbeeld 3.1: Plan chkrootkit als een cronjob

0 3 * * * /usr/sbin/chkrootkit

14. Up-to-date blijven

14.a. up-to-date blijven

Eenmaal je jouw systeem succesvol hebt geinstaleerd en verzekert hebt dat je een goede beveiliging hebt, moet je je systeem up to date houden. Dit is omdat beveiliging is een voortbewegend object is die als-maar evulueert.

Als je een recente versie van de portage hebt geinstaleerd, kun je best eerst de portage syncen en daarna het commando glsa-check --list uitvoeren. Deze controleerd als je systeem up-to-date is (veiligheidswijze). glsa-check is een onderdeel van app-portage/gentoolkit.

Codevoorbeeld 1.1: Example output of glsa-check -l

# glsa-check -l
WARNING: This tool is completely new and not very tested, so it should not be
used on production systems. It's mainly a test tool for the new GLSA release
and distribution system, it's functionality will later be merged into emerge
and equery.
Please read http://www.gentoo.org/proj/en/portage/glsa-integration.xml
before using this tool AND before reporting a bug.

[A] means this GLSA was already applied,
[U] means the system is not affected and
[N] indicates that the system might be affected.

200406-03 [N] sitecopy: Multiple vulnerabilities in included libneon ( net-misc/sitecopy )
200406-04 [U] Mailman: Member password disclosure vulnerability ( net-mail/mailman )
.......

Waarschuwing: De glsa-check is nog altijd experimenteel, dus als veilgheid je hoogste prioriteit is zou het verstandig zijn om alles dubbel te controleren in een lijst met andere bronnen.

Alle lijnen met een [A] en [U] kunnen meestal worden genegeerd. Het update is niet dringend voor het systeem.

Belangrijk: Constateer dat de gewoonlijke emerge -vpuD world niet alle pakketen update. Je moet glsa-check gebruiken als je wil zekere zijn dat alle GLSAs opgelost zijn op jouw systeem.

Codevoorbeeld 1.2: Check all GLSAs

(Check if your system is affected by GLSAs)
# glsa-check -t all
WARNING: This tool is completely new and not very tested, so it should not be
used on production systems. It's mainly a test tool for the new GLSA release
and distribution system, it's functionality will later be merged into emerge
and equery.
Please read http://www.gentoo.org/proj/en/portage/glsa-integration.xml
before using this tool AND before reporting a bug.

This system is affected by the following GLSA:
200504-06
200510-08
200506-14
200501-35
200508-12
200507-16

(See what packages would be emerged)
# glsa-check -p $(glsa-check -t all)
     (partial output)
Checking GLSA 200504-06
The following updates will be performed for this GLSA:
     app-arch/sharutils-4.2.1-r11 (4.2.1-r10)

     **********************************************************************

     Checking GLSA 200510-08
     The following updates will be performed for this GLSA:
          media-libs/xine-lib-1.1.0-r5 (1.1.0-r4)

(Pas de nodige oplossingen toe)
# glsa-check -f $(glsa-check -t all)

Als je een service hebt upgedate die momenteel wordt gebruikt, vergeet dan niet die even te herstarten.

Je kernel up-to-date houden is ook een aanrader.

Als je een email wilt ontvangen als GLSA is vernieuwd; Voeg jezelf toe aan de gentoo-announce mailing list. Instructies om jezelf toe te voegen kun je vinden op Gentoo Linux Mailing List Overview.

Een andere goede veiligheid bron is de Bugtraq mailing list.

Print

Upgedate op 3 augustus 2006

De originele versie van dit document was laatst geupdate om 10 april 2014

Korte inhoud: Deze is een stap-voor-stap gids voor "hardening" Gentoo Linux.

Kim Nielsen
Author

John P. Davis
Editor

Eric R. Stockbridge
Editor

Carl Anderson
Editor

Jorge Paulo
Editor

Sven Vermeulen
Editor

Benny Chuang
Editor

Sune Jeppesen
Editor

Tiemo Kieft
Editor

Zack Gilburd
Editor

Dan Margolis
Editor

Dimitry Bradt
Translator

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.