Gentoo Linux Security Handleiding
1.
Inleiding
Wie zou deze handleiding moeten lezen?
Mensen die Gentoo Linux in een serveromgeving gebruiken en/of de nood hebben
aan meer, of zelfs paranoide veiligheid.
Credits
Kim Nielsen
Speciale dankbetuigingen aan
Een speciale dankbetuiging gaat uit naar de volgende personen die verschillende
inhoud-, spellings- en grammatica-fouten opspoorden en verbeterden.
Bjarke Sørensen, Justin Lambert, Andreas Waschbuesch, Duncan Lissett, Sherman
Boyd, Sami Dalouche en Väinö Järvelä.
Toevoegingen geplanned voor volgende versies:
In versie 0.6 (Backups)
- Arpwatch
- Volledige systeembackups dmv Systemimager
- Partiele backups dmv tar
- Backup nemen van postgres database
In versie 0.8 (Intrusion Testing -- Inbraakpogingen testen)
- Remote audits
- Network audits
- Host audits
- Software audits
In versie 1.0 (After a compromise -- Na een inbraak)
- Hoe een inbraak rapporteren
- Sporen onderzoek
- Een snapshot van je systeem maken zonder bewijsmateriaal te vernietigen
(dmv dd)
- Trap en trace (dmv tcpdump)
- .. Nog enkele zaken ..
- Systeem terugzetten
Nota:
Merk op dat elke versie op zich zich concentreert op 1 onderwerp per keer. Dit
is om kwaliteitsredenen.
|
2.
Pre-installatie bedenkingen
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.
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.
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.
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.
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.
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.
3.
De veiligheid verbeteren tijdens en na de installatie
/etc/make.conf
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 3.1: USE aanpassingen |
USE="tcpd pam ssl"
|
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 3.2: /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 3.3: /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.
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.4: /etc/lilo.conf |
password=changeme
restricted
delay=3
|
In het andere geval voeg je het gewoon toe aan een image.
Codevoorbeeld 3.5: /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.
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 3.6: /etc/securetty |
vc/1
|
Meer loggen
Extra loggen wordt best toegepast om fouten, waarschuwingen en dergelijke meer
op te vangen. Deze kunnen immers een lopende aanval (of succesvol uitgevoerde
aanval) aantonen. Aanvallers maken zeer frequent gebruik van scanning of
probing alvorens ze een systeem aanvallen.
Het is tevens van vitaal belang dat de logbestanden gemakkelijk leesbaar en
onderhoudbaar zijn.
Gentoo Linux laat je toe om tussen 3 verschillende loggers te kiezen tijdens de
installatie.
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 3.7: /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).
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 3.8: /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 3.9: pwdfail.sh voor Postfix |
#! /bin/sh
echo "$3" | mail -s "Warning (program : $2)" root
|
pwdfail.sh voor qmail:
Codevoorbeeld 3.10: pwdfail.sh voor qmail |
#!/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.
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.11: /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!
4.
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 4.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 qmail
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 qmail 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.
User/group limitaties
/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 5.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.
|
/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 5.2: /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.
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 5.3: 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 5.4: /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 5.5: 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 5.6: /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 5.7: 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).
/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.
/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.8: /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.
Bestandspermissies
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.
Wereld/Groep schrijfbaar
Codevoorbeeld 6.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.
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 6.2: 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 6.3: 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 (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 7.1: Installeren van cracklib |
# emerge cracklib
|
Codevoorbeeld 7.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 7.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 7.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
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 8.1: /etc/hosts.deny |
ALL:PARANOID
|
Codevoorbeeld 8.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 security
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.
/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 9.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 9.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 9.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 9.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 9.5: Bescherm tegen slechte errorberichten |
# /bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
|
Schakel bescherming in tegen slechte errormessages.
Codevoorbeeld 9.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 9.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 9.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 9.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.
Grsecurity
De patch van Grsecurity zit in
de Gentoo kernel maar is default uitgeschakeld. Hier staat hoe je het
activeert:
Configureer je kernel zoals je normaal gezien doet, en configureer dan de
Grsecurity optie: kies "customized" en activeer de volgende opties:
- Buffer Overflow Protection
-
- Openwall non-executable stack
- Gcc trampoline support
- Filesystem Protections
-
- Proc restrictions
- Linking restrictions
- Secure file descriptors
- Chroot jail restrictions (Activeer alle andere opties hieronder)
- Kernel Auditing
-
- Log execs within chroot
- (Un)Mount logging
- Signal logging
- Fork failure logging
- Log set*ids to root
- Time change logging
- Executable Protections
-
- Dmesg restriction
- Randomized PIDs
- Altered default IPC permissions (kan resulteren in slecht functionerende
programmas)
- Restricted ptrace
- Network Protections
-
- Randomized IP IDs
- Randomized TCP source ports
- Altered Ping IDs
- Randomized TTL
- Miscellaneous Features
-
- BSD-style coredumps (zal coredumps zoals core.named creeren)
Compileer en installeer nu je veiligheids-uitgebreidde kernel.
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.
|
Andere kernel patches
En er zijn er waarschijnlijk nog een ganse boel meer...
10.
Services beveiligen
Gebruik maken van xinetd
xinetd is een substituut voor inetd (die Gentoo niet levert), de internet
services daemon. Deze ondersteunt toegangscontrole gebaseerd op het adres van
de host en het tijdstip van toegang. Het laat tevens verschillende
logging-mogelijkheden toe, inclusief server starttijd, host adres,
gebruikersnaam, server runtijd, alsook acties om te ondernemen bij bepaalde events.
Zoals met alle andere services is het hier ook belangrijk om een goede
configuratie te hebben. Maar aangezien xinetd als root werkt en protocols
ondersteunt die je misschien niet kent raden we af om deze te gebruiken. Maar
als je het wil gebruiken, dan volgen hier enkele tips over hoe je deze kan
beveiligen:
Codevoorbeeld 10.1: Installeren van xinetd |
# emerge xinetd tcpd
|
Pas het configuratiebestand aan:
Codevoorbeeld 10.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
}
# Dit zal pserver (cvs) opstellen via xinetd met de volgende instellingen:
# - maximum 10 connecties
# - limiteer pserver tot tcp
# - gebruik de cvs gebruiker om deze service uit te voeren
# - bind deze service aan 1 ip
# - laat enkel toegang vanuit 10.0.0.* toe
# - limiteer de tijd van developers van 8am tot 5pm
# - gebruik tcpd wrappers
# - de maximum load van de machine mag 1.0 niet overschrijden
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.
ssh
Het enige wat OpenSSH van beveiliging nodig heeft is een sterkere
identificatie gebaseerd op publieke sleutel-encryptie. Veel te veel sites
(zoals http://www.sourceforge.net, http://www.php.net en
http://www.apache.org) hadden problemen met hun systemen wegens
paswoordlekken of slechte paswoorden.
Codevoorbeeld 10.3: /etc/ssh/sshd_config |
#Laat enkel versie 2 toe
Protocol 2
#Geen directe rootlogins toelaten
PermitRootLogin no
#Schakel RSA sleutelidentificatie aan
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# Schakel .rhosts en gewone paswoordbeveiliging uit (dus enkel sleutels
# toelaten)
RhostsAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
AllowHosts *.gentoo.org
#Niemand behalve mensen in de groepen wheel of admin mogen toegang hebben...
AllowGroups wheel admin
#... op 2 gebruikers na ;)
AllowUsers kn bs
#Activeer logging
SyslogFacility AUTH
LogLevel INFO
#bind
ListenAddress 127.0.0.1
|
Wat al je gebruikers nu nog hoeven te doen is een publieke sleutel aanmaken
(op hun machine van waaruit ze willen inloggen) met het volgende commando:
Codevoorbeeld 10.4: Aanmaken van een RSA sleutelpaar |
# /usr/bin/ssh-keygen -t rsa
|
Type een paswoordzin in:
Codevoorbeeld 10.5: Uitvoer van ssh-keygen |
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kn/.ssh/id_rsa):[Druk op enter]
Created directory '/home/kn/.ssh'.
Enter passphrase (empty for no passphrase): [Type je paswoord/paszin in]
Enter same passphrase again: [Type je paswoord/paszin nogmaals in]
Your identification has been saved in /home/kn/.ssh/id_rsa.
Your public key has been saved in /home/kn/.ssh/id_rsa.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 2 bestanden in je ~/.ssh aanmaken genaamd id_rsa en
id_rsa.pub. Het bestand id_rsa is je privesleutel en mag niet publiek gemaakt
worden. Het andere bestand is id_rsa.pub en dient gedistribueerd te worden naar
elke server waar je toegang tot hebt. Voeg de sleutel toe aan de gebruikers'
homedirectorie in ~/.ssh/authorized_keys. De gebruiker zou normaal
gezien nu moeten kunnen inloggen.
Nu moeten je gebruikers hun eigen private sleutel goed bewaren. Laat ze hun
sleutels op een medium plaatsen die ze altijd bij hebben of sla ze op op hun
werkstation (hint: paswoord beleid).
Meer informatie vind je op OpenSSH's
website.
X beveiligen
Per default is XFree geconfigureerd om als Xserver te fungeren. Dit kan
gevaarlijk zijn aangezien X ongeencrypteerde tcp connecties gebruikt en
luistert naar xclients. Indien je dit niet nodig hebt, schakel deze functie dan
uit! Maar indien je wenst dat je werkstation een Xserver is, maak dan
voorzichtig gebruik van /usr/X11R6/bin/xhost. Dit commando stelt
in welke clients (andere machines) er mogen connecteren naar je pc en je
display gebruiken. Dit kan handig zijn indien je een X-applicatie van een
andere machine wil gebruiken. De syntax is /usr/X11R6/bin/xhost
+hostname.
Waarschuwing:
Gebruik nooit xhost +! Dit laat toe dat eender welke client kan
connecteren naar je X en er gebruik van kan maken. Indien een hacker van je X
kan gebruik maken kan hij je keyboardgebruik loggen en je desktop controleren.
|
Een veiligere oplossing is om deze functionaliteit uit te schakelen door X op
te starten met startx -- -nolisten tcp of door dit permanent uit te
schakelen in het configuratiebestand:
Codevoorbeeld 10.6: /usr/X11R6/bin/startx |
defaultserverargs=""
|
aan te passen naar
Codevoorbeeld 10.7: /usr/X11R6/bin/startx |
defaultserverargs="-nolisten tcp"
|
Indien je een grafische login manager gebruikt moet je een andere manier
toepassen.
Voor: gdm (Gnome Display Manager)
Verander:
Codevoorbeeld 10.8: /etc/X11/gdm/gdm.conf |
[server-Standard]
command=/usr/X11R6/bin/X
|
naar
Codevoorbeeld 10.9: /etc/X11/gdm/gdm.conf |
[server-Standard]
command=/usr/X11R6/bin/X -nolisten tcp
|
Voor: xdm (X Display Manager) en kdm (Kde Display Manager)
Verander
Codevoorbeeld 10.10: /etc/X11/xdm/Xservers |
:0 local /usr/bin/X11/X
|
naar
Codevoorbeeld 10.11: /etc/X11/xdm/Xservers |
:0 local /usr/bin/X11/X -nolisten tcp
|
FTP
FTP (File Transfer Protocol) is algemeen een slecht idee. Het maakt gebruik van
ongeencrypteerde data, luistert naar 2 poorten, ondersteunt anonieme gebruikers
en is eigenlijk juist de service waar hackers naar zoeken (om bv warez uit te
wisselen). Indien mogelijk, probeer dan gebruik te maken van sftpd of http in
plaats van het ftp protocol aangezien het ftp protocol verschillende
veiligheidsproblemen bevat. Indien dit niet mogelijk is, probeer je dan zo
veilig mogelijk te maken en wees op je hoede!
Pure-ftpd
Pure-ftpd is een spin-off van trollftpd. Ze is aangepast met veiligheid
en grotere functionaliteit in gedachten door Frank Dennis.
Maak gebruik van virtuele gebruikers (dus nooit echte systeemaccounts) door de
AUTH optie te activeren. Zet deze op -lpuredb:/etc/pureftpd.pdb en maak
je gebruikers aan met /usr/bin/pure-pw.
Codevoorbeeld 10.12: /etc/conf.d/pure-ftpd |
## Aantal simultane connecties, per ip gerekend ##
MAX_CONN="-c 30"
MAX_CONN_IP="-C 10"
## Laat geen uploads toe indien de partitie voller is dan deze variabele ##
DISK_FULL="-k 90%"
AUTH="-lpuredb:/etc/pureftpd.pdb"
## Misc. Andere... ##
MISC_OTHER="-A -E -X -U 177:077 -d -4 -L100:5 -I 15"
|
Configureer je MISC_OTHER instellingen zodat anonieme toegang geweigerd wordt
(-E), chroot toegepast wordt op alle gebruikers (-A), geweigerd wordt dat
gebruikers bestanden lezen of schrijven die beginnen met een . (dot) (-X),
een maximale idletijd ingesteld staat (-I), recursie gelimiteerd wordt (-L) en
geef een voldoende veilige umask in. En gebruik zeker niet de optie -w
of -W! En indien je een warez-site wil aanmaken: stop met dit document te
lezen!
Meer informatie kan je vinden op http://www.pureftpd.org
Proftpd
Proftpd heeft verschillende veiligheidsproblemen gehad, maar deze zijn allemaal
opgelost. Er zijn echter nog steeds enkele aanpassingen aangeraden:
Codevoorbeeld 10.13: /etc/proftpd/proftpd.conf |
ServerName "Mijn ftp daemon"
#Toon de identificatie van de server niet
ServerIdent on "Heeeeeere's Jhonny!"
#Maak het gemakkelijker om virtuele gebruikers aan te maken
RequireValidShell off
#Gebruik een alternatief password en group bestand
AuthUserFile "/etc/proftpd/passwd"
AuthGroupFile "/etc/proftpd/group"
# Permissies
Umask 077
# Timeouts en limitaties
MaxInstances 30
MaxClients 10 "Only 10 connections allowed"
MaxClientsPerHost 1 "You have already logged on once"
MaxClientsPerUser 1 "You have already logged on once"
TimeoutStalled 10
TimeoutNoTransfer 20
TimeoutLogin 20
#Iedereen chrooten
DefaultRoot ~
#Niet als root draaien
User nobody
Group nogroup
#Alles loggen
TransferLog /var/log/transferlog
#Globbingproblemen elimineren
DenyFilter \*.*/
|
De rest hangt van jezelf en je eigen mogelijkheid tot lezen af
(http://www.proftpd.org).
Vsftpd
Vsftpd (staat voor "Very Secure FTP": zeer veilige ftp) is een snelle
ftp-daemon met een voldoend veilige default configuratie. Ze is simpel en heeft
niet veel features (zoals virtuele gebruikers) die pureftp en proftp wel
hebben.
Codevoorbeeld 10.14: /etc/vsftpd |
anonymous_enable=NO
local_enable=YES
#Enkel lezen
write_enable=NO
#Transfers loggen
xferlog_std_format=YES
idle_session_timeout=20
data_connection_timeout=20
nopriv_user=nobody
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chrootlist
ls_recurse_enable=NO
|
Zoals je ziet is er geen manier voor deze service om individuele permissies en
default chrootacties te ondernemen. Maar wanneer het neerkomt op anonieme
instellingen is ze zeer goed. Soms kan het handig zijn om een anonieme
ftp-server te hebben (om bv open source bestanden te delen) en deze server is
daar ideaal voor.
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 10.15: /etc/conf.d/apache |
HTTPD_OPTS="-D SSL"
|
Codevoorbeeld 10.16: /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
Qmail
Qmail 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 qmail uit en begin met configureren.
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 10.17: /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 10.18: 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).
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.
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 10.19: /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.
Chroot of virtuele servers.
Chrooten is een manier om je service (of gebruiker) te limiteren naar een
beperkte omgeving zodat het/hij geen toegang heeft tot andere informatie van je
systeem, wat zou kunnen leiden tot veiligheidsproblemen. Door de service als
een andere gebruiker dan root te draaien (nobody, apache, named) kan een hacker
enkel de permissies van die gebruiker verkrijgen en dus enkel bestanden van die
gebruiker aanpassen. Dit wil zeggen dat een hacker geen rootaccess kan
verkrijgen ook al bevat de service veiligheidsfouten.
Sommige services zoals pure-ftpd en bind hebben features voor chrooting,
terwijl anderen dat dan weer niet hebben. Indien de service het ondersteunt,
gebruik het dan. Anders moet je zelf een chrootomgeving opstellen voor die
service. Laten we eens bekijken hoe je een eigen chroot omgeving opstelt. Om
het gedrag van een chrootomgeving te verkennen zullen we deze testen met bash.
Maak een directorie aan in / genaamd chroot (mkdir chroot).
Probeer erachter te komen welke dynamische bibliotheekbestanden bash gebruikt
(indien deze statisch gecompileerd is is dit niet nodig):
Het volgende commando zal een lijst aanmaken van bibliotheekbestanden die bash
gebruikt.
Codevoorbeeld 10.20: Tonen van de gebruikte bibliotheekbestanden |
# 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 aanmaken voor bash.
Codevoorbeeld 10.21: Aanmaken van chroot-omgeving |
# mkdir /chroot/bash
# mkdir /chroot/bash/bin
# mkdir /chroot/bash/lib
|
Vervolgens kopieren we de bestanden die door bash gebruikt worden
(/lib) naar de gechrootte omgeving en kopieren we bash zelf naar
de gechroote bin-directorie. Dit zal eenzelfde omgeving voor bash aanmaken,
maar met heel wat minder mogelijkheden. Na het kopieren proberen we het uit:
chroot /chroot/bash. Indien je een prompt krijgt die / leest dan
werkt je chrootomgeving. Anders zal het je duidelijk maken welk bestand er
vermist is. Sommige bibliotheekbestanden hangen immers af van nog andere
bibliotheekbestanden...
Je zal merken dat in de chrootomgeving niets werkt behalve echo. Dit is omdat
we geen enkel ander commando in de chrootomgeving geplaatst hebben behalve
bash, en echo is ingebouwd in bash.
Dit is ongeveer hoe je een gechroote service aanmaakt. Het enige verschil is
dat de services afhangen van configuratiebestanden en devicefiles in
/etc en /dev. Kopieer deze gewoon over (devices
kopieer je het best met cp -a) naar de gechrootte omgeving, en pas het
initscript aan zodat deze chroot gebruikt voordat deze de service uitvoert. Het
kan moeilijk zijn om te weten te komen welke devices en configuratiebestanden
een service nodig heeft. Om hierachter te komen is strace een zeer
handig commando. Start de service met /usr/bin/strace en zoek voor
open, read, stat en misschien connect. Dit zal je een idee geven van welke
bestanden je moet kopieren. In de meeste gevallen moet je
/etc/passwd (na aanpassen zodat enkel de nodige gebruikers erin
staan), /dev/zero, /dev/log en
/dev/random.
Een andere manier van een veilige chrootomgeving op te stellen is door een
virtuele server te creeren. Dit zal een kopie maken van de huidige
Linuxomgeving en booten in een virtuele machine. Dat wil zeggen dat, indien een
hacker de service kan kraken, enkel de virtuele server gehackt is en niet de
werkelijke installatie.
Een voorbeeld van virtuele servers:
11.
Firewalls
Een firewall
Mensen denken vaak dat een firewall de ultieme veiligheid is, maar ze zijn
verkeerd. In de meeste gevallen is een slecht geconfigureerde firewall zelfs de
slechtste veiligheid die je je kan wensen, zelfs slechter dan geen firewall te
hebben. Een firewall is een deel software en moet gezien worden als elke andere
service, aangezien ze even vatbaar is voor fouten (veiligheidsfouten).
Dus denk alvorens je een firewall implementeert. Heb je er werkelijk een nodig?
Indien je denkt dat je er een nodig hebt, schrijf dan een beleidsdocument over
hoe het moet werken, welk soort firewall je wenst en wie deze moet beheren.
Firewalls worden voor 2 redenen gebruikt:
- Om gebruikers (wormen of hackers) buiten te houden
- Om gebruikers (werknemers of kinderen) binnen te houden
Er zijn ongeveer 3 types van firewalls:
- Packet filtering
- Circuit relay
- Application gateway
Een firewall is idealiter een aparte machine die geen andere services draait
(behalve misschien ssh) en beveiligd is zoals deze handleiding je uitlegt.
Packet filtering
Alle netwerktraffiek is in vorm van pakketten. Grote traffiek wordt opgesplitst
in kleinere pakketten voor gemakkelijke routing en worden weer samengevoegd
wanneer ze toegekomen zijn aan hun bestemming. Elk pakket bevat informatie
over hoe en waar deze moet toekomen. En deze informatie is juist datgene wat de
packet filtering firewall gebruikt. Het filteren is gebaseerd op:
- Toelaten of verhinderen van pakketten gebaseerd op bron/bestemming IP
adres
- Toelaten of verhinderen van pakketten gebaseerd op bron/bestemming
poort
- Toelaten of verhinderen van pakketten afhankelijk van het gebruikte
protocol
- Toelaten of verhinderen van pakketten afhankelijk van de vlaggen in het
gebruikte protocol
Normaal gezien gebeurt filteren dus altijd op de data in de header van een
pakket en niet in de inhoud van het pakket.
Problemen:
- Adresinformatie in een pakket kan een potentieel foutief adres zijn (of,
zoals dat heet, een spoofed IP-adres)
- Data of aanvragen van data in een toegelaten pakket kan ongewenste data
bevatten die de hacker kan gebruiken om bekende fouten in services te
exploiteren of een firewall te omzeilen.
- Er is normaal gezien een enkelvoudig foutpunt (1 fout en alles is naar de
knoppen).
Voordelen:
- Simpel en eenvoudig te implementeren
- Kan waarschuwingen geven aangaande een mogelijke hackpoging alvorens de
hackpoging succesvol uitgevoerd is (door bv portscans te detecteren).
- Gemakkelijk om SYN aanvallen tegen te gaan
Voorbeelden van vrije packet filters onder Linux:
Circuit relay
Circuit relays, ook genaamd circuit level gateways, zijn firewalls die
connecties valideren alvorens data mag uitgewisseld worden. Dit wil zeggen dat
het simpelweg pakketten aanvaard of weigert gebaseerd op het feit of de
connectie tussen beide hosts opgemaakt is volgens de configuratieregels van de
firewall. Enkel indien die connectie correct is aangemaakt wordt er een sessie
gestart waardoor data kan uitgewisseld worden. Het filteren is gebaseerd op:
- Doel/bron adres
- Doel/bron poort
- Een tijdsperiode
- Protocol
- Gebruiker
- Paswoord
Alle traffiek wordt gevalideerd en gecontroleerd; traffiek waar dat niet gedaan
kan worden wordt geweigerd.
Zwaktes:
-
Opereert op de transportlaag en vereist mogelijk grote aanpassingen van de
programmacode die normaal gezien de transportlaagfuncties aanbiedt.
Application gateway
De application level gateway is een proxy voor applicaties die data uitwisselen
met een ander systeem op client-niveau. Ze wordt weggehouden van het publiek
door ze achter de DMZ of firewall te plaatsen waar er geen connectie is
vanbuitenuit. Filteren is gebaseerd op:
- Toelaten of weigeren van pakketten gebaseerd op bron/doel
- Gebaseerd op de inhoud van het pakket
- Kan zelf de pakketten aanpassen
- Limiteer toegang tot bestanden gebaseerd op bestandstype of extensie
Voordelen:
- Kan bestanden in een cache plaatsen, waardoor de netwerkperformantie
verbetert.
- Gedetailleerde logging van alle connecties
- Zeer flexibel; sommige proxies kunnen gecachede data uitwisselen
- Geen toegang van buitenuit
Zwakheden:
- Zeer complexe configuratie
Application gateways worden aanzien als de meest veilige oplossing aangezien ze
niet als root moeten draaien en niet vanuit het internet bereikbaar zijn.
Voorbeeld van een vrije application gateway:
Iptables
Om iptables werkende te krijgen moet deze geactiveerd zijn in de kernel. Ik
persoonlijk heb deze als modules gecompileerd (het iptables commando zal die
zelf laden indien nodig) en daarna mn kernel gehercompileerd. Hierna is het
nodig om iptables te installeren (emerge iptables), waarna het zou
moeten werken.
Test iptables door iptables -L uit te voeren. Indien er ergens een fout
optreedt moet je je configuratie in je kernel nog eens goed bekijken.
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 11.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 11.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 11.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 ESTABLISHED,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 11.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 11.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.
Squid
Squid 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 11.6: /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 bestandsextensies in waarvan je niet wenst dat de gebruikers die
kunnen downloaden.
Codevoorbeeld 11.7: /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]$
\.[GgZz]$
\.[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 11.8: /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 11.9: /etc/squid/errors/NOTE_ADS_FILTERED |
<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://www.insecurity.dk/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 heeft squid veel mogelijkheden en is ze zeer efficient in
zowel het filteren als het proxy'en. Ze kan tevens alternatieve squid proxies
aanspreken om op grote netwerken flexibel te werken. De configuratie die ik
hier getoond heb is meer gemaakt voor kleine netwerken met 1 tot 20 gebruikers.
Het combineren van een packet filter (iptables) met een application gateway
(squid) is waarschijnlijk de beste oplossing, zelfs wanneer squid ergens veilig
geplaatst is waar niemand er toegang tot heeft van buitenaf. We moeten immers
steeds behoed zijn tegen aanvallen van binnenuit!
Stel je browsers in om de proxyserver te gebruiken. De gateway zal ervoor
zorgen dat gebruikers enkel toegang hebben tot de buitenwereld via de proxy. Ze
kunnen dus niet naar buiten als ze de proxy niet instellen op hun browser.
Nota:
In Mozilla doe je dit via Edit->Preferences->Advanced->Proxies
|
Het kan tevens goed zijn om alles transparant te laten gebeuren door iptables
alle traffiek te laten forwarden naar een squid proxyserver. Dit kan
gemakkelijk gebeuren door de volgende regels op de gateway te implementeren:
Codevoorbeeld 11.10: Portforwarding van de pakketten naar je 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
|
Wat hebben we geleerd?
We hebben geleerd dat:
- Een firewall een risico op zich is. Een slecht geconfigureerde firewall
is slechter dan geen firewall.
- Hoe moeten we een gateway en transparante proxy configureren
- De sleutel tot een goede firewall is het kennen van het protocol dat je
wil toelaten
- IP traffiek bevat niet altijd correcte informatie. Als voorbeeld denk je
maar aan ICMP pakketten.
- Hoe houden we SYN aanvallen tegen
- Filteren van HTTP traffiek door aanstootnemende fotos en downloaden van
virussen te elimineren
- Combineren van packet filters en application gateways geven betere
controle over het netwerkgebruik
Dus, als je werkelijk een firewall nodig hebt, begin er dan maar aan.
12.
Intrusion detection
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,
best |