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 |
vc/1
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:
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:
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 |
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
# 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:
- Maak je firewallsbeleid alvorens je die implementeert.
- Hou het simpel
-
Weet hoe het protocol werkt (lees de RFCs)
-
Hou in gedachten dat een firewall gewoon een stuk software is dat als root
draait.
- 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;
-
Een firewall hebben ook riskant kan zijn voor jezelf. Een slecht
geconfigureerde firewall is slechter dan geen hebben.
-
Hoe je een basis-opstelling maakt voor een gateway en een transparante
proxy
-
De sleutel tot een goede firewall is een protocols kennen die je wilt
toestaan.
-
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.
- Hoe je een SYN aanval kan voorkomen.
-
Filteren van HTTP trafiek door het verwijderen van afbeeldingen, downlaods
en/of virussen
-
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 |
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 ./
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
include classification.config
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 |
# 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
# glsa-check -p $(glsa-check -t all)
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)
# 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.
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|