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.
Kim Nielsen
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)
In versie 0.8 (Intrusion Testing -- Inbraakpogingen testen)
In versie 1.0 (After a compromise -- Na een inbraak)
Nota: Merk op dat elke versie op zich zich concentreert op 1 onderwerp per keer. Dit is om kwaliteitsredenen. |
2. Pre-installatie bedenkingen
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.
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.
Gouden regels:
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:
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.
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.
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:
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
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 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 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.
/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 |
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 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 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 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!
Wanneer we een ext2, ext3 of een reiserfs partitie mounten kan je verschillende opties meegeven in /etc/fstab. Deze zijn:
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. |
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. |
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.
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).
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.
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.
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.
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 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 |
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.
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.
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.
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:
Compileer en installeer nu je veiligheids-uitgebreidde kernel.
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. |
En er zijn er waarschijnlijk nog een ganse boel meer...
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.
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.
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 (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 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 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 (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 (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 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 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).
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 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.
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:
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:
Er zijn ongeveer 3 types van firewalls:
Een firewall is idealiter een aparte machine die geen andere services draait (behalve misschien ssh) en beveiligd is zoals deze handleiding je uitlegt.
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:
Normaal gezien gebeurt filteren dus altijd op de data in de header van een pakket en niet in de inhoud van het pakket.
Problemen:
Voordelen:
Voorbeelden van vrije packet filters onder Linux:
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:
Alle traffiek wordt gevalideerd en gecontroleerd; traffiek waar dat niet gedaan kan worden wordt geweigerd.
Zwaktes:
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:
Voordelen:
Zwakheden:
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:
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 |
(Maak een nieuwe keten met 1 regel) # iptables -X mychain # iptables -N mychain # iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT (Het default beleid is dat alle uitgaande traffiek toegelaten wordt. Inkomende wordt echter geweigerd.) # iptables -P OUTPUT ACCEPT # iptables -P INPUT DROP (Voeg ze toe aan de INPUT keten) # iptables -A INPUT -j mychain |
Door de regel toe te passen op de INPUT keten krijgen we het volgende beleid: alles wordt toegelaten wat uitgaand is, en enkel inkomende pakketten die tot een bestaande connectie behoren worden toegelaten. Dit is eigenlijk algemeen gezien een slecht idee. Een beleid zou eigenlijk alles moeten weigeren en dan expliciet enkele zaken toelaten, maar dit is gewoon een voorbeeld.
Indien je meer informatie wenst, kijk dan naar iptables documentatie (Engels).
Laten we een volledig voorbeeld bekijken. Dit voorbeeld zijn mijn firewall/gateway instellingen:
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:
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 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:
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 |
We hebben geleerd dat:
Dus, als je werkelijk een firewall nodig hebt, begin er dan maar aan.
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 12.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 12.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 12.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).
Codevoorbeeld 12.4: Aanmaken van de gebruiker snort |
# user add snort -d /var/log/snort -s /dev/null # chown -R snort /var/log/snort |
Codevoorbeeld 12.5: /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 12.6: /etc/snort/snort.conf |
(Stap 1) var HOME_NET 10.0.0.0/24 var EXTERNAL_NET any var SMTP $HOME_NET var HTTP_SERVERS $HOME_NET var SQL_SERVERS $HOME_NET var DNS_SERVERS [10.0.0.2/32,212.242.40.51/32] var RULE_PATH ./ (Stap 2) preprocessor frag2 preprocessor stream4: detect_scans detect_state_problems detect_scans disable_evasion_alerts preprocessor stream4_reassemble: ports all preprocessor http_decode: 80 8080 unicode iis_alt_unicode double_encode iis_flip_slash full_whitespace preprocessor rpc_decode: 111 32771 preprocessor bo: -nobrute preprocessor telnet_decode (Stap 3) include classification.config (Stap 4) include $RULE_PATH/bad-traffic.rules include $RULE_PATH/exploit.rules include $RULE_PATH/scan.rules include $RULE_PATH/finger.rules include $RULE_PATH/ftp.rules include $RULE_PATH/telnet.rules include $RULE_PATH/smtp.rules include $RULE_PATH/rpc.rules include $RULE_PATH/rservices.rules include $RULE_PATH/dos.rules include $RULE_PATH/ddos.rules include $RULE_PATH/dns.rules include $RULE_PATH/tftp.rules include $RULE_PATH/web-cgi.rules include $RULE_PATH/web-coldfusion.rules include $RULE_PATH/web-iis.rules include $RULE_PATH/web-frontpage.rules include $RULE_PATH/web-misc.rules include $RULE_PATH/web-attacks.rules include $RULE_PATH/sql.rules include $RULE_PATH/x11.rules include $RULE_PATH/icmp.rules include $RULE_PATH/netbios.rules include $RULE_PATH/misc.rules include $RULE_PATH/attack-responses.rules include $RULE_PATH/backdoor.rules include $RULE_PATH/shellcode.rules include $RULE_PATH/policy.rules include $RULE_PATH/porn.rules include $RULE_PATH/info.rules include $RULE_PATH/icmp-info.rules include $RULE_PATH/virus.rules # include $RULE_PATH/experimental.rules include $RULE_PATH/local.rules |
Codevoorbeeld 12.7: /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).
Versie 0.1 -> 0.2
Versie 0.2 -> 0.4
| Vraag | Antwoord |
| Waar kan ik de laatste versie vinden van dit document? | De laatste versie is beschikbaar op http://www.gentoo.org. De laatste kladversie is op http://gentoo.insecurity.dk |
The contents of this document are licensed under the Creative Commons - Attribution / Share Alike license.