Security
7/5 Beveiligingstips voor beheer 7/5.1
Werken als root
Tips en trucs voor het inloggen met verschillende gebruikersaccounts; werken als root. 7/5.1.1 Inleiding Het beheer van een OES – Linux-server brengt wat zaken met zich mee die onder NetWare nog niet bekend waren. Een van de belangrijkste is dat er lokaal op de server via de bash-shell kan worden ingelogd. Voor dit inloggen staan verschillende gebruikersaccounts ter beschikking. Voor de beheerder is het account van de gebruiker het meest aantrekkelijk om zijn dagelijkse werkzaamheden uit te voeren. Toch is dit niet aan te raden. Gelukkig zijn er goede alternatieven voorhanden voor het standaard werken als root: met su kunt u tijdelijk de identiteit van de beheerder of iedere willekeurige andere gebruiker aannemen. Daarnaast is er sudo: door gebruik te maken van dit mechanisme zorgt de beheerder ervoor dat gebruikers alleen voor bepaalde specifieke taken gebruik kunnen maken van root-permissies. Daarnaast zijn er nog de nodige commando’s die hun eigen mechanisme hebben om aan te geven wie dit commando met root-privileges mag uitvoeren. Tot slot is er nog de opdracht newgrp, waarmee een gebruiker tijdelijk kan profiteren van de voordelen die lidmaatschap van een andere groep hem biedt.
Novell Netwerkoplossingen, aanvulling 18
7/5.1-1
Beveiligingstips voor beheer
7/5.1.2 Redenen om niet als root te werken Het lijkt zo voor de hand liggend gewoon in te loggen als root. U hebt dan tenminste alle permissies direct beschikbaar en hoeft nooit na te denken over met welke identiteit u op dat moment bent aangemeld. Toch valt het zeer af te raden gebruik te maken van de identiteit van root als dat niet echt nodig is. Een aantal argumenten zijn nogal belerend, maar er is ook een goede technische reden er geen gewoonte van te maken standaard te werken als root. Wanneer u root bent, kan een kleine fout tot catastrofale gevolgen leiden. Bedenk maar eens wat er gebeurt als u als root per ongeluk een typefout maakt waardoor u rm -rf / home/pietje in plaats van rm -rf /home/pietje typt. Nu bent u natuurlijk beheerder en beheerders zijn perfect en maken geen fouten. Daarom als volgende een argument van organisatorische aard: u bent binnen uw bedrijf een persoon. Als persoon onderhoudt u waarschijnlijk ook een persoonlijke omgeving waarin uw persoonlijke documenten zijn opgeslagen. Als gebruiker root voert u een functionele taak uit binnen uw organisatie. Grote kans dat u niet de enige bent die deze taak uitvoert. Om uw persoonlijke bestanden en instellingen persoonlijk te houden en niet direct beschikbaar te stellen aan ieder van uw collega’s die eventjes als root wil werken, is het handig als u naast het almachtige root-account ook nog beschikt over een gebruikersaccount met minder permissies.
7/5.1-2
Novell Netwerkoplossingen, aanvulling 18
Security
Op Open Enterprise Server – Linux kan het u niet ontgaan als u per ongeluk nog bent ingelogd als root.
Als u nog niet overtuigd bent, als laatste nog een technische reden om niet standaard als root in te loggen. Een van de redenen waarom Linux zo veel veiliger is dan Windows, is juist omdat gebruikers op een Linux-systeem maar beperkte rechten hebben. Stel u maar eens voor dat u als gewone gebruiker een virus, trojaan of andere exploit binnenhaalt op uw computer. Stel dat dit een virus is dat als doel heeft alle bestanden op deze computer te vernietigen. Als gewone gebruiker betekent dit in het ergste geval dat uw homedirectory wordt gewist en u de bestanden uit uw homedirectory moet terugzetten van de backup-tape. Als dit u daarentegen als root overkomt, kan het betekenen dat alle bestanden van uw server worden verwijderd en uw server urenlang niet kan worden gebruikt. Ooit uitgerekend wat een uur downtijd uw organisatie kost?
Novell Netwerkoplossingen, aanvulling 18
7/5.1-3
Beveiligingstips voor beheer
Switch user
7/5.1.3 Su De meest gebruikte manier om tijdelijk de identiteit van een andere gebruiker aan te nemen, is door gebruik te maken van het commando su (switch user). Als u deze opdracht geeft zonder dat er verdere argumenten worden meegegeven, vraagt su u om een wachtwoord. Voer nu het wachtwoord van de gebruiker root in en u bent root. Klaar met werken? Geef dan de opdracht exit om weer terug te keren naar uw normale, beperkte gebruikersaccount. Nu is er bij het gebruik van het commando su een vervelend issue. Su start vanuit uw huidige shell een subshell op. Dit betekent dat u niet over alle variabelen kunt beschikken die normaal voor uw gebruikersaccount actief zijn omdat veel van deze variabelen afkomstig zijn uit het shell-configuratiebestand /etc/profile of ~/.profile dat alleen wordt gelezen bij het opstarten van een log-inshell. De oplossing voor dit probleem is eenvoudig: geef aan het commando su een - mee, of als u dat liever doet de optie –l, die volkomen gelijkwaardig is. Er wordt nu een log-in-shell gestart voor de nieuwe identiteit waarmee u aan het werk gaat. Met su kunt u tijdelijk de identiteit van de gebruiker root aannemen. Daarom denken sommige mensen wel dat de naam van de opdracht verwijst naar “superuser”, een andere naam voor de gebruiker root. Het is echter ook mogelijk om met su tijdelijk de identiteit aan te nemen van een andere gebruiker. Type bijvoorbeeld su alex om tijdelijk als alex aan het werk te gaan. Handig als u even de instellingen van de betreffende gebruiker wilt testen. Probeert u dit als gewone gebruiker, dan moet u wel eerst het wachtwoord invoeren van de gebruiker wiens identiteit u wilt aannemen. Als u daarentegen als root tijdelijk de
7/5.1-4
Novell Netwerkoplossingen, aanvulling 18
Security
identiteit van een normale gebruiker wilt aannemen, kan dat zonder dat een wachtwoord wordt ingevoerd. Naast het normale commando su is er onder SuSE Linux een variant die speciaal is ontworpen voor gebruik in een grafische omgeving. Als u in plaats van su sux typt, worden alle omgevingsvariabelen die nodig zijn om zonder problemen in de grafische omgeving te werken, ook gewoon goed ingesteld. Voor de rest gedraagt sux zich precies hetzelfde als het commando su. Type bijvoorbeeld sux - om ervoor te zorgen dat een log-in-shell wordt gestart in plaats van een normale subshell waarin niet alle benodigde omgevingsvariabelen beschikbaar zijn.
Met het commando sux - zorgt u ervoor dat u vanuit een grafische omgeving tijdelijk root wordt waarbij alle omgevingsvariabelen op de juiste wijze worden meegenomen.
Naast de mogelijkheid met su een log-in-shell op te starten, biedt su nog een andere heel handig optie. Door gebruik te maken van de optie -c kunt u één commando als
Novell Netwerkoplossingen, aanvulling 18
7/5.1-5
Beveiligingstips voor beheer
root uitvoeren. Geef bijvoorbeeld als normale gebruiker de opdracht su - -c “ps aux | grep httpd” om te achterhalen of uw webserver wel actief is. Su vraagt om het wachtwoord van de gebruiker root en toont netjes het resultaat van het ene commando dat u als root hebt uitgevoerd. Wanneer het daarmee klaar is, werkt u vervolgens vrolijk weer verder met de permissies die u als normale gebruiker op de console hebt. Deze optie leent zich bijvoorbeeld ook heel goed voor gebruik in shellscripts. 7/5.1.4 Grafische toepassingen opstarten als root Naast de mogelijkheid vanuit een console-venster tijdelijk root te worden, kunt u ook grafische toepassingen opstarten als root, of met de identiteit van welke andere gebruiker dan ook. De meest handige wijze om dit te doen, is door met de toetsencombinatie Alt-F2 het “run command”venster aan te roepen. Klik dan op Options. Selecteer nu de optie Run as a different user en voer de gebruikersnaam en het wachtwoord in van de gebruiker in wiens hoedanigheid u de opdracht wilt uitvoeren. Type nu in het command-veld de opdracht in die u wilt uitvoeren en druk op Run. De ingevoerde opdracht wordt nu uitgevoerd als de gebruiker wiens naam u hebt ingevoerd.
7/5.1-6
Novell Netwerkoplossingen, aanvulling 18
Security
In het Run Command-venster kunt u ook aangeven dat u een opdracht wilt uitvoeren als een andere gebruiker.
U kunt er ook voor zorgen dat bepaalde toepassingen vanuit uw grafische omgeving altijd als root worden uitgevoerd. Voor een pictogram dat op uw desktop staat, regelt u dat door de properties op te vragen en vervolgens het tabblad Application te activeren. Klik nu op Advanced Options en geef aan dat u de toepassing altijd als andere gebruiker wilt starten. Voer nu de naam van de gebruiker root in. U merkt dat er geen mogelijkheid is het wachtwoord van die gebruiker automatisch in te voeren: dat zou om beveiligingsredenen ook helemaal niet verstandig zijn. U zult elke keer dat u deze toepassing start zelf het wachtwoord moeten invoeren en dat is echt niet te vermijden. 7/5.1.5 Sudo Werken met su is handig, maar niet ideaal. Op het moment dat u met su namelijk het wachtwoord hebt ingevoerd van de gebruiker root, bent u alsnog almachtig op uw systeem. In veel omgevingen is dit helemaal niet wenselijk en heeft een gebruiker alleen voor een beperkt aantal taken de permissies van de gebruiker root nodig. Voor dit doel maakt u
Novell Netwerkoplossingen, aanvulling 18
7/5.1-7
Beveiligingstips voor beheer
gebruik van het sudo-mechanisme. Om als normale gebruiker met sudo een taak uit te voeren waarvoor u root-permissies nodig hebt, geeft u eerst de opdracht sudo en dan het commando dat u wilt uitvoeren, bijvoorbeeld sudo /sbin/fdisk. Er wordt vervolgens een wachtwoord gevraagd en als u het juiste wachtwoord invoert, wordt het commando in kwestie voor u uitgevoerd. Om op deze wijze opdrachten te starten, is echter wel wat meer nodig: de beheerder moet een configuratiebestand aanmaken waarin precies staat aangegeven wie wat mag doen door middel van het sudo-mechanisme. Als beheerder moet u een bestand aanmaken met de naam /etc/sudoers. Om dit bestand aan te maken, maakt u gebruik van de opdracht visudo. De basisstructuur van de regels in het sudoers-bestand is vrij eenvoudig: user/group host = commando1,commando2
Dit betekent dat u door middel van de regel franck ALL=/sbin/shutdown -h now
ervoor kunt zorgen dat gebruiker franck vanaf alle computers op deze host het commando shutdown mag uitvoeren om de host down te brengen. Let er even op dat er standaard geen wachtwoord hoeft te worden ingevoerd; het is voldoende dat de gebruiker die via /etc/sudoers is geautoriseerd deze opdracht uit te voeren, de opdracht uitvoert. Bedenk dus goed welke gebruikers u op welke opdrachten door middel van sudo rechten wilt geven!
Aliassen
7/5.1-8
Naast deze basisstructuur in /etc/sudoers is het ook mogelijk om in dit bestand te werken met aliassen. In het volgende voorbeeld wordt gedemonstreerd hoe dit werkt:
Novell Netwerkoplossingen, aanvulling 18
Security
User_Alias
BEHEERDERS
User_Alias
PRINTERBEHEERDERS = anouk
= franck, alex
User_Alias
WEBMASTER
= kees
Cmd_Alias
PRINTEN
= lpc, lpq. lprm
Cmd_Alias
SHUTDOWN
= /sbin/shutdown
Cmd_Alias
WEBSERVER
= /sbin/yast — apache, /etc/init.d/a pache2
root BEHEERDERS
ALL=(ALL) ALL ALL=SHUTDOWN, !/usr/bin/passwd, /usr/bin/passwd [A-z] *, !/usr/bin/passwd root, !/usr/bin/passwd root -l
WEBMASTER
ALL=WEBSERVER
PRINTERBEHEERDERS
ALL=PRINTEN
In dit voorbeeld gebeurt er een aantal speciale zaken. Om te beginnen wordt er gewerkt met aliassen. Door aliassen te gebruiken, geeft u namelijk op eenvoudige wijze rechten aan meerdere gebruikers of rechten op meerdere opdrachten. In dit voorbeeld wordt gebruikgemaakt van twee soorten alias: de User_Alias wordt gebruikt om groepen gebruikers te definiëren, de Cmd_Alias wordt ingezet om groepen opdrachten te definiëren. Het volgende dat opvalt, is dat er ook wordt aangegeven dat bepaalde opdrachten niet mogen worden uitgevoerd. U ziet dit in de regel waar de commando’s voor de beheerders worden gedefinieerd. Om te beginnen mogen de beheerders alle opdrachten uitvoeren die in de commando-alias SHUT-
Novell Netwerkoplossingen, aanvulling 18
7/5.1-9
Beveiligingstips voor beheer
DOWN zijn gegeven. Daarna ziet u dat driemaal het uitroepteken wordt gebruikt om aan te geven dat ze iets niet mogen. Gebruik van de opdracht /usr/bin/passwd is voor deze gebruikers niet mogelijk, wel mogen ze het commando passwd gebruiken als argument dat een tekenreeks wordt gegeven die uit kleine letters en/of hoofdletters bestaat waarachter nog meer willekeurige tekst mag worden gegeven. Het enige wat dan weer niet is toegestaan, is het commando passwd te gebruiken om het wachtwoord van de gebruiker root te wijzigen of om het account van de gebruiker root op slot te gooien. Naast de aanduiding van de naam van de gebruiker is er nog veel meer mogelijk om aan te geven hoe iemand iets wel of niet mag doen. We hebben het bijvoorbeeld nog niet gehad over de naam van de computer van waaraf de gebruiker in kwestie het commando geeft. In dit voorbeeld wordt overal gewerkt met ALL om aan te geven dat de gebruiker zijn opdrachten vanaf alle hosts mag geven. In plaats daarvan kunt u ook aangeven dat opdrachten alleen vanaf een bepaalde hostnaam, een bepaald IP-adres of een bepaald netwerk mogen worden gegeven – of juist niet. Zo zorgt een regel als BEHEERDERS
192.168.0.0/24=SHUTDOWN
ervoor dat gebruikers die gedefinieerd zijn als beheerders alleen de commando’s die onder shutdown zijn gedefinieerd mogen uitvoeren wanneer ze dit doen op een computer die voorkomt in het netwerk 192.168.0.0. Uiteraard is ook het omgekeerde mogelijk en kunt u met deze optie aangeven dat de beheerders hun SHUTDOWN-opdrachten juist niet mogen uitvoeren wanneer ze van dit netwerk afkomstig zijn. In dat geval plaatst u een uitroepteken voor het adres of de naam in kwestie.
7/5.1-10
Novell Netwerkoplossingen, aanvulling 18
Security
Met het voorgaande hebben we nog niet alle mogelijkheden besproken die in /etc/sudoers kunnen worden ingesteld – u zou er echter voor de meeste gevallen een werkende configuratie mee moeten kunnen maken.
In het configuratiebestand sudoers wordt geregeld welke gebruikers wat mogen doen met root-permissies.
7/5.1.6 Sudo en wachtwoorden Als u als sudo-gebruiker een opdracht uitvoert waarvoor u met behulp van het sudo-mechanisme rechten hebt gekregen, wordt gevraagd of u een wachtwoord wilt invoeren. Dit is niet uw eigen wachtwoord, maar het wachtwoord van de gebruiker root. U begrijpt dat dit niet echt slim is: wanneer een gebruiker immers vanuit een sudo-sessie het wachtwoord van de gebruiker root in weet te vullen, kan hij ook inloggen als root en dat is niet de bedoeling. Om die reden raden wij u aan om in elke regel die u in het sudoers-bestand definieert voor de commando’s die mogen worden uitgevoerd, de aanduiding NOPASSWD te gebruiken. Hiermee zorgt u ervoor dat de gebruiker in kwestie
Novell Netwerkoplossingen, aanvulling 18
7/5.1-11
Beveiligingstips voor beheer
zonder eerst een wachtwoord in te voeren direct het commando in kwestie mag gebruiken – wel zo handig. 7/5.1.7 Een reserve-systeembeheerder Leuk dat u op deze wijze normale gebruikers extra permissies kunt geven; als het gaat om het werken als de gebruiker root is er nog iets dat belangrijk is. Voor noodgevallen zou u namelijk willen dat er ook reserve-systeembeheerders zijn. Er zijn twee manieren om dit te doen: de elegante manier en de iets minder elegante manier. Als u het op de nette manier wilt regelen, maakt u iedereen die als systeembeheerder moet kunnen werken, lid van de groep wheel. Neem vervolgens in /etc/sudoers de volgende regel op: %wheel
ALL=(ALL)
ALL
Deze regel zorgt ervoor dat alle gebruikers die lid zijn van de groep wheel het commando sudo kunnen uitvoeren om alle commando’s uit te voeren waarvoor root-privileges nodig zijn. Op OES – Linux is deze taak overigens redelijk eenvoudig uit te voeren, de voorbeeldregels zijn al standaard in /etc/sudoers opgenomen. Er is ook een andere, iets minder elegante werkwijze om ervoor te zorgen dat er reserve-root-gebruikers zijn: maak gewoon een gebruiker aan op de gebruikelijke werkwijze en zorg ervoor dat het UID van deze gebruiker is ingesteld op UID 0. Let erop dat er soms wel verwarring kan ontstaan: aangezien bijvoorbeeld in de inodes waarin bestandsinformatie wordt opgeslagen geen namen van gebruikers maar UID’s vermeld staan, kan het best gebeuren dat ineens uw reserve-root eigenaar is van alle bestanden op het systeem wanneer u deze met ls-l bekijkt, maar dat maakt niet veel uit.
7/5.1-12
Novell Netwerkoplossingen, aanvulling 18
Security
7/5.1.8 Een andere groep instellen Naast de mogelijkheid tijdelijk de identiteit aan te nemen van een andere gebruiker, is het ook mogelijk tijdelijk een andere groep in te stellen als effectieve groep. Standaard wordt hiervoor de groep gebruikt die in /etc/passwd als primaire groep staat ingesteld. Wilt u echter tijdelijk een andere groep als primaire groep instellen? Dan kan dat door gebruik te maken van de opdracht newgrp of sg. Wilt u vervolgens uw oorspronkelijke primaire groep weer terug? Dan kan dat door de opdracht exit te gebruiken of gewoon nogmaals het commando newgrp te gebruiken. Let wel even op: om dit te kunnen doen, moet u wel lid zijn van de groep die u als effectieve groep wilt instellen. Als u geen lid bent van de betreffende groep, kunt u hem alleen als effectieve groep instellen wanneer u het groepswachtwoord kent. U kunt als beheerder een groep van een wachtwoord voorzien door gebruik te maken van de opdracht passwd -g. Misschien is op het eerste gezicht niet helemaal duidelijk wat de relatie is tussen het werken als beheerder en het instellen van een andere groep. Stel u voor dat u als normale gebruiker de primaire groep hebt ingesteld op de groep users. Om uw taken als beheerder te kunnen uitvoeren, bent u lid van de groep wheel. Wanneer u deze groep als effectieve groep hebt ingesteld, kunt u door gebruik te maken van het commando sudo alle opdrachten als root uitvoeren die u maar wilt.
Novell Netwerkoplossingen, aanvulling 18
7/5.1-13
Beveiligingstips voor beheer
U kunt gebruikmaken van de groep wheel om reserve-systeembeheerders te definiëren.
7/5.1.9 Tot slot Als u na het lezen van deze paragraaf nog steeds de gewoonte hebt al uw werk als root te doen, is er toch echt iets mis. Zoals u hebt gelezen, zijn er heel veel manieren om ervoor te zorgen dat u tijdelijk root-rechten krijgt. U kunt gebruikmaken van su om tijdelijk root te worden, het is mogelijk met su -c één commando als root uit te voeren en met sudo kunt u een lijst commando’s definiëren waar u een of meer gebruikers rechten op geeft. Mogelijkheden genoeg dus!
7/5.1-14
Novell Netwerkoplossingen, aanvulling 18
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 1
Security
7/5.2
Firewall
Werken met iptables
Als u een server inricht, moet u er op die server ook voor zorgen dat hij beschermd wordt tegen de boze buitenwereld. Hiervoor moet in elk geval een firewall actief zijn op het netwerk waarop de server voorkomt en die firewall moet alles tegenhouden wat niet expliciet is toegestaan. Helaas echter komen veel bedreigingen voor de beveiliging van het netwerk niet van buitenaf, maar van binnenuit. Om die reden is het aan te raden naast het netwerk in het algemeen ook uw individuele servers te voorzien van firewallsoftware. Linux komt met iptables, een uitstekende firewall die er op kernelniveau voor zorgt dat alle ongewenste verkeer wordt tegengehouden. Dat iptables een kernel-firewall is, heeft belangrijke voordelen. De grootste hiervan is snelheid: door zijn werking in de kernel werkt iptables razendsnel. Als u zich zorgen maakt over de beveiliging van uw Linux-servers, OES Linux-servers of Xenhosts, is iptables een uitstekende keuze. In deze paragraaf leert u hoe u het kunt configureren. 7/5.2.1 Inleiding Waar u het op andere besturingssystemen soms met zeer schamel gereedschap moet doen, komt Linux met een volledig uitgeruste firewall. Netfilter is de naam van de in de kernel geïntegreerde firewallfunctionaliteit, die vanaf de 2.4-kernels gebruikt worden. Iptables is de naam van de opdracht waarmee u deze firewall ook daadwerkelijk kunt definiëren. Voorbereiding Voordat u daadwerkelijk opdrachten gaat typen om de firewall in te stellen, moet er eerst iets anders gebeuren. U hebt een plan nodig. Zomaar lukraak aan het werk gaan heeft namelijk totaal geen zin: de kans is namelijk groot
Novell Netwerkoplossingen, aanvulling 24
7/5.2-1
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 2
Beveiligingstips voor beheer
dat uw firewall zijn doel totaal voorbijschiet. Maak daarom voordat u begint een schema en leg daarin precies vast wat er moet gebeuren. Zorg er bovendien voor dat u in dit schema verwijst naar de netwerkkaarten in uw server. Zit er maar één netwerkkaart in? Dan is het natuurlijk geen issue. Als er echter twee netwerkkaarten in zitten, ligt het voor de hand dat een van deze kaarten aan het interne netwerk verbonden is en de andere aan het externe netwerk. Geef per service aan op welk netwerk de service bereikbaar moet zijn en geef daarbij aan of u voor de betreffende service toe wilt staan dat hij bereikt wordt (voor de hand liggend op een server) of dat er vanaf uw server verkeer op een bepaalde poort naar buiten verstuurd wordt. Een en ander resulteert in een tabel die er bijvoorbeeld uitziet als onderstaande tabel: Interface privé, publiek publiek publiek publiek, privé publiek, privé
Service SSH HTTP FTP ping DNS
Richting inkomend, uitgaand inkomend inkomend uitgaand uitgaand, inkomend
In bovenstaand voorbeeld ziet u slechts een suggestie van hoe een firewall-configuratiematrix eruit komt te zien. Op een druk gebruikte server zult u waarschijnlijk veel meer details willen. Zo zou u bijvoorbeeld op de internet-netwerkinterface aan kunnen geven dat SSH alleen bereikbaar is vanaf bepaalde IP-adressen. Daarnaast wilt u waarschijnlijk voor services als HTTP en FTP ook aangeven dat er verkeer naar deze services teruggestuurd mag worden. 7/5.2.2 Bouwblokken van iptables: tables Het uitgangspunt van iptables is dat de regels waaruit een firewall bestaat zijn ingedeeld in drie tabellen; de zoge-
7/5.2-2
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 3
Security
Belangrijkste tabellen
naamde tables. Deze tabellen worden gebruikt om onderscheid te maken tussen verschillende soorten functionaliteit. De belangrijkste tabellen worden hieronder genoemd: • filter; • nat; • mangle; In elk van deze tabellen vindt u een aantal chains. Deze chains vormen de verzamelingen regels waaruit de firewall is opgebouwd en ze bepalen daadwerkelijk wat er in een tabel gebeurt. Als beheerder van een iptables-firewall zult u in de praktijk dan ook voornamelijk chains moeten configureren. De filter-table Het doel van de filter-table is het filteren van verkeer. De filter-table bestaat uit drie ingebouwde chains. Let overigens op de notatie van de chains – die is altijd in hoofdletters: • INPUT • OUTPUT • FORWARD De INPUT-chain wordt gebruikt om binnenkomende pakketjes te filteren, de OUTPUT-chain wordt gebruikt voor het verwerken van pakketjes die op de lokale machine gedefinieerd zijn en naar buiten verstuurd moeten worden, en de FORWARD-chain verwerkt alle pakketjes die door de firewall gerouteerd worden. Verderop in deze paragraaf leest u hoe u deze table kunt configureren. De nat-table Het belangrijkste doel van de nat-table is het mogelijk te maken dat nodes zonder geregistreerd IP-adres toch het
Novell Netwerkoplossingen, aanvulling 24
7/5.2-3
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 4
Beveiligingstips voor beheer
internet op kunnen. Deze table is de laatste jaren meer in onbruik geraakt omdat veel routers deze functionaliteit standaard ook al in huis hebben. Ook de nat-table bestaat uit drie chains: • PREROUTING • OUTPUT • POSTROUTING Twee soorten NAT
Door middel van de nat-table worden twee soorten NAT ondersteund. Om te beginnen is dit het veelgebruikte masquerading. Dit is de vorm van NAT waarin hosts op het privénetwerk internet op kunnen door gebruik te maken van het IP-adres van de firewall. Computers op internet zien in dat geval niets anders dan de firewall en zijn zich er niet van bewust dat er achter die firewall een volledig netwerk voorkomt. Daarnaast is het ook mogelijk het omgekeerde te doen. Dit betekent dat u nodes op het interne netwerk met de nat-table bereikbaar kunt maken voor de buitenwereld door er een geregistreerd IP-adres aan toe te wijzen. Dit verschijnsel wordt ook aangeduid als statisch NAT. Dit betekent dat u aan de interface van de router een tweede IP-adres toekent en er door middel van de nat-table voor zorgt dat alles wat op dat secundaire IP-adres binnenkomt, wordt doorgestuurd naar de betreffende host op het privénetwerk. Van de drie regels wordt de PREROUTING-chain gebruikt om pakketjes te behandelen zodra ze binnenkomen, dat wil zeggen nog voordat het routingproces ermee aan het werk kan. De OUTPUT-chain wordt gebruikt om pakketjes te behandelen die door het lokale systeem gegenereerd worden en de POSTROUTING-chain tot slot wordt gebruikt om pakketjes te behandelen voordat ze het systeem verlaten, maar nadat het routingproces ermee aan het werk is geweest. Inkomend verkeer wordt dus altijd door de PRE-
7/5.2-4
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 5
Security
ROUTING-chain bekeken. Of het vervolgens de OUTPUTchain ingaat, of de POSTROUTING-chain, is afhankelijk van de uiteindelijke bestemming van de pakketjes.
SuSE Linux biedt vanuit YaST2 de mogelijkheid om op eenvoudige maar weinig gedetailleerde wijze een firewall in elkaar te klikken. Ook andere distributies bieden soortgelijke functionaliteit.
De mangle-table De mangle-table tot slot bestaat uit twee ingebouwde chains: • PREROUTING • OUTPUT De PREROUTING-chain behandelt alle inkomende pakketjes voordat ze gerouteerd worden; de OUTPUT-chain behandelt uitgaande pakketjes voordat ze gerouteerd worden. De mangle-table wordt alleen in speciale gevallen gebruikt, bijvoorbeeld als speciale services, zoals Quality of Service (QoS), gebruikt worden om pakketjes een hogere prioriteit
Novell Netwerkoplossingen, aanvulling 24
7/5.2-5
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 6
Beveiligingstips voor beheer
te geven. Om die reden wordt deze table hier niet uitputtend behandeld. 7/5.2.3 Chains definiëren De basisbouwblokken van iptables zijn de chains. De chains worden gebruikt om onderscheid te maken tussen verschillende soorten verkeer. Bij de definitie van chains moet u aangeven in welke table een chain thuishoort. Als u dit niet doet, wordt een nieuw gedefinieerde table automatisch toegewezen aan de default table ‘filter’. Dit is geen slecht idee, want meestal is de filter-table ook de enige table die echt gebruikt wordt. Om een chain aan een specifieke andere table toe te wijzen, maakt u gebruik van de optie -t.
Policy
Rules Bij het definiëren van een chain wordt gebruikgemaakt van verschillende rules. Pakketjes doorlopen een chain net zolang tot ze een rule tegenkomen die een treffer (match) oplevert. Op dat moment verlaat het pakketje de chain en wordt het al dan niet toegelaten. Als geen enkele regel een match oplevert voor het betreffende pakketje, wordt de laatste regel in het verhaal toegepast. Deze regel staat ook bekend als de policy. In het Nederlands mag u dit gerust vertalen met ‘standaardbeleid’. Dit is dus de standaardregel die wordt toegepast voor alle pakketjes waarvoor geen specifieke rule gevonden kon worden. Bij de definitie van chains is het van groot belang altijd te beginnen met de definitie van policies. Voor de rules kan gebruikgemaakt worden van verschillende soorten acties. Elke rule heeft een standaardactie. De meest gebruikte acties zijn: • ACCEPT: het pakketje wordt doorgelaten.
7/5.2-6
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 7
Security
•
•
•
DROP: het pakketje wordt gedropt zonder dat een bericht teruggestuurd wordt naar de afzender van het pakketje. Dit is een goede keuze als het pakketje ongewenst is. LOG: er wordt een bericht gestuurd naar het standaard loggingmechanisme. Alleen als de logactie gebruikt wordt, wordt de chain niet direct verlaten. In alle andere gevallen gebeurt dit wel. REJECT: het pakketje wordt niet toegelaten, maar in dit geval wordt wél een melding teruggestuurd naar de afzender van het pakketje.
Op basis van bovenstaande informatie kunt u de filtertable al vullen met de meest essentiële informatie: de policies. U zou een firewall kunnen maken waarop alles toegestaan is, tenzij het expliciet verboden is. Dit vinden wij echter geen bijzonder goed idee. Het is gebruikelijk in een firewall alles standaard tegen te houden, tenzij het expliciet is toegestaan. Om dit te bereiken moet u voor alle standaard chains in de filter-table de policy instellen op DROP. Dit doet u met de volgende opdrachten: iptables -P FORWARD DROP iptables -P INPUT DROP iptables -P OUTPUT DROP
Nu de policies ingesteld zijn kunt u verder en de overige rules definiëren. Hiervoor maakt u gebruik van de volgende algemene opdrachtstructuur: iptables <positie in de chain> <matching> In de volgende paragraaf leest u meer over deze verschillende elementen.
Novell Netwerkoplossingen, aanvulling 24
7/5.2-7
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 8
Beveiligingstips voor beheer
Flags, extensions en actions Als u net kennismaakt met iptables komt de opdracht als behoorlijk ingewikkeld over. Als u echter eenmaal doorhebt hoe de opdracht in elkaar zit, valt het best mee. Iptables werkt globaal met drie soorten parameters. Om te beginnen zijn er de flags. Hiermee vertelt u wat voor soort actie er uitgevoerd moet worden. Bij het toevoegen van rules aan een chain hebben flags een zeer belangrijke rol: ze bepalen namelijk waar in de chain een rule ingevoerd moet worden. Voor dit doel worden de volgende vier flags gebruikt: • -A: voeg de regel toe aan het einde van een chain; • -D: verwijder een regel uit de chain; • -R: vervang een regel door een nieuwe; • -I: voeg een regel op een zeer specifieke plaats in de chain toe.
Voorbeeld
7/5.2-8
Naast deze flags die bepalen waar in de chain een regel terechtkomt, is er ook een aantal meer algemene flags die bij de opdracht gebruikt kan worden. Zo is er bijvoorbeeld -F, waarmee alle regels uit een chain weggegooid worden, of -L, die gebruikt kan worden om een overzicht te genereren van alle regels die in een chain aanwezig zijn. Hieronder ziet u hoe de uitvoer van de opdracht iptables -L eruit kan zien. Dit voorbeeld toont de standaard firewallconfiguratie die op een OpenSuSE-systeem gebruikt wordt (als u er tenminste voor gekozen hebt de firewall daarop aan te zetten). Omdat het leerzaam is een voorbeeld uit de praktijk te bestuderen, vindt u hieronder de onverkorte versie. U ziet in dit voorbeeld dat de regels ingesteld worden voor de standaard chains, maar dat daarnaast ook een aantal extra chains is aangemaakt waarin additionele regels opgenomen worden:
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 9
Security
SFO:~ # iptables -L Chain INPUT (policy DROP) target
prot opt source
destination
ACCEPT
0
--
anywhere
anywhere
ACCEPT
0
--
anywhere
anywhere
state RELATED,ESTABLISHED input_ext
0
--
anywhere
anywhere
LOG
0
--
anywhere
anywhere
limit: avg 3/min burst 5 LOG level warning tcp-options ipoptions prefix `SFW2-IN-ILL-TARGET ‘ DROP
0
--
anywhere
anywhere
Chain FORWARD (policy DROP) target
prot opt source
destination
ACCEPT
0
--
anywhere
anywhere
LOG
0
--
anywhere
anywhere
limit: avg 3/min burst 5 LOG level warning tcp-options ipoptions prefix `SFW2-FWD-ILL-ROUTING ‘ Chain OUTPUT (policy ACCEPT) target
prot opt source
destination
ACCEPT
0
--
anywhere
anywhere
ACCEPT
0
--
anywhere
anywhere
state NEW,RELATED,ESTABLISHED LOG
0
--
anywhere
anywhere
limit: avg 3/min burst 5 LOG level warning tcp-options ipoptions prefix `SFW2-OUT-ERROR ‘ Chain forward_ext (0 references) target
prot opt source
destination
Chain input_ext (1 references) target
prot opt source
destination
ACCEPT
udp
anywhere
--
anywhere
PKTTYPE = broadcast udp dpt:netbios-ns
Novell Netwerkoplossingen, aanvulling 24
7/5.2-9
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 10
Beveiligingstips voor beheer
ACCEPT
udp
--
anywhere
anywhere
PKTTYPE = broadcast udp dpt:netbios-dgm ACCEPT
udp
--
anywhere
anywhere
PKTTYPE = broadcast udp dpt:ntp DROP
0
--
anywhere
anywhere
anywhere
anywhere
anywhere
anywhere
anywhere
anywhere
PKTTYPE = broadcast ACCEPT
icmp --
icmp source-quench ACCEPT
icmp --
icmp echo-request ACCEPT
icmp --
state RELATED,ESTABLISHED icmp echo-reply ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp destination-unreachable ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp time-exceeded ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp parameter-problem ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp timestamp-reply ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp address-mask-reply ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp protocol-unreachable ACCEPT
icmp --
anywhere
anywhere
state RELATED,ESTABLISHED icmp redirect LOG
tcp
--
anywhere
anywhere
limit: avg 3/min burst 5 tcp dpt:microsoft-ds flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ipoptions prefix `SFW2-INext-ACC-TCP ‘ ACCEPT
tcp
--
anywhere
anywhere
tcp dpt:microsoft-ds LOG
tcp
--
anywhere
anywhere
limit: avg 3/min burst 5 tcp dpt:netbios-ssn
7/5.2-10
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 11
Security
flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ipoptions prefix `SFW2-INext-ACC-TCP ‘ ACCEPT
tcp
--
anywhere
anywhere
anywhere
anywhere
tcp dpt:netbios-ssn LOG
tcp
--
limit: avg 3/min burst 5 tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ipoptions prefix `SFW2-INext-ACC-TCP ‘ ACCEPT
tcp
--
anywhere
anywhere
--
anywhere
anywhere
--
anywhere
anywhere
anywhere
anywhere
anywhere
anywhere
tcp dpt:ssh ACCEPT
udp
udp dpt:bootpc ACCEPT
udp
udp dpt:netbios-dgm ACCEPT
udp
--
udp dpt:netbios-ns ACCEPT
udp
--
udp dpt:ntp reject_func
tcp
--
anywhere
anywhere
tcp dpt:ident state NEW LOG
0
--
anywhere
anywhere
limit: avg 3/min burst 5 PKTTYPE = multicast LOG level warning tcp-options ip-options prefix `SFW2-INext-DROP-DEFLT ‘ DROP
0
--
anywhere
anywhere
anywhere
anywhere
PKTTYPE = multicast LOG
tcp
--
limit: avg 3/min burst 5 tcp flags:FIN,SYN,RST,ACK/SYN LOG level warning tcp-options ip-options prefix `SFW2-INextDROP-DEFLT ‘ LOG
icmp --
anywhere
anywhere
limit: avg 3/min burst 5 LOG level warning tcp-options ipoptions prefix `SFW2-INext-DROP-DEFLT ‘ LOG
udp
--
anywhere
anywhere
limit: avg 3/min burst 5 LOG level warning tcp-options ipoptions prefix `SFW2-INext-DROP-DEFLT ‘
Novell Netwerkoplossingen, aanvulling 24
7/5.2-11
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 12
Beveiligingstips voor beheer
LOG
0
--
anywhere
anywhere
limit: avg 3/min burst 5 state INVALID LOG level warning tcp-options ip-options prefix `SFW2-INext-DROP-DEFLT-INV ‘ DROP
0
--
anywhere
anywhere
Chain reject_func (1 references) target
prot opt source
destination
REJECT
tcp
anywhere
--
anywhere
reject-with tcp-reset REJECT
udp
--
anywhere
anywhere
reject-with icmp-port-unreachable REJECT
0
--
anywhere
anywhere
reject-with icmp-proto-unreachable
Elk iptables-commando maakt gebruik van flags. U moet immers op zijn minst aangeven of u regels toe wilt voegen of juist wilt verwijderen. Vervolgens moet verwezen worden naar de chain waarin u aan het werk wilt. Daarna komen de opties. Deze worden gebruikt om verdere specificatie aan te brengen. Belangrijke opties bijvoorbeeld zijn die waarmee de richting aangegeven wordt. Een veelgebruikte optie die toegepast kan worden, is die waarin u de source- en destination-adressen aangeeft. Daarnaast kunt u ook aangeven op welke netwerkkaart een regel betrekking heeft. Bij deze opties kunt u vervolgens extensions aangeven. Hiermee kunt u het gedrag van een optie verder specificeren. Denk bijvoorbeeld aan source- en destination-poortadressen die gebruikt moeten worden. De specificatie van deze adressen is een extension (letterlijk: uitbreiding) op de gebruikte opties. Tot slot zijn er vervolgens de actions. Deze worden altijd voorafgegaan door de schakeloptie -j en bepalen wat er met een pakketje moet gebeuren. De algemene syntaxis van iptables komt er dus samengevat als volgt uit te zien:
7/5.2-12
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 13
Security
iptables [-flags] [chain] [options [extensions] ] [ACTION]
In de volgende twee opdrachten ziet u voorbeelden van twee eenvoudige regels waarin al deze ingrediënten voorkomen: iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
Als eerste ziet u de opdracht zelf. Vervolgens wordt gebruikgemaakt van de flag -A waarmee de rules aan het einde van de chain ingevoerd worden. Deze flags hebben beide als argument de naam van de chain waarin de regel geplaatst wordt. Vervolgens zijn er de opties: in dit geval -i, waarmee verwezen wordt naar de inputnetwerkkaart, en daarnaast -o, die verwijst naar de netwerkkaart waarop de pakketjes naar buiten gaan. Hier ziet u dat dit in beide gevallen betrekking heeft op de loopback-interface. Tot slot wordt de action -j ACCEPT gebruikt. Concreet zorgen deze twee regels ervoor dat alle ingaande en uitgaande pakketjes op de loopback-interface geaccepteerd worden. Gebruik hiervan is noodzakelijk nadat u als policy alles dichtgezet hebt; basiszaken als X-windowing doen het nu tenminste weer. Voordat we een gedetailleerd overzicht geven van alle ingrediënten vindt u hieronder eerst nog een viertal regels waarmee u ervoor zorgt dat alle uitgaande pakketjes naar SSH en HTTP geaccepteerd worden. Ook alle pakketjes die deel uitmaken van een bevestigde sessie worden geaccepteerd. Alle andere pakketjes worden door de policy (hier niet zichtbaar) gedropt, maar voordat ze gedropt worden, wordt wel eerst een bericht geschreven naar het logmechanisme. Verderop leert u meer over de wijze waarop deze rules opgebouwd zijn:
Novell Netwerkoplossingen, aanvulling 24
7/5.2-13
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 14
Beveiligingstips voor beheer
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -j LOG illegal incoming packet: “
--log-prefix
“Dropped
Op de volgende pagina’s krijgt u een overzicht van wat er aan flags, options, extensions en actions gebruikt kan worden. We beperken ons tot de belangrijkste opties; voor een volledig overzicht kunt u de man-pagina van iptables raadplegen. Flag -t table
-A, --append
-D, --delete
-F, --flush -I, --insert -L, --list
7/5.2-14
Beschrijving Specificeert in welke table een rule toegepast moet worden. Als deze flag niet gebruikt wordt, wordt de standaard filter-table gebruikt. Voegt een of meer rules toe aan de gespecificeerde table. Als argument moet aangegeven worden op welke chain dit commando uitgevoerd moet worden en welke regel er aan toegevoegd moet worden. Verwijdert een of meer rules uit de aangegeven table. Als argument moet aangegeven worden in welke chain gewerkt wordt en welke regel uit de chain bewerkt moet worden. U kunt verwijzen naar de betreffende regel door middel van een regelnummer (gebruik de optie -L voor een overzicht van alle regelnummers). Verwijdert alle regels uit een chain. Voeg een regel toe aan een chain. De syntaxis hiervoor is iptables -I chain regelnummer regel. Toont alle regels. Bij deze optie kan aangegeven worden dat alleen regels uit één bepaalde chain getoond moeten worden. Als dit niet gebeurt, worden alle regels uit alle chains getoond.
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 15
Security
Flag -N, --new-chain
Beschrijving Definieer een nieuwe chain. U mag zelf bepalen welke naam die chain moet krijgen. Uiteraard moet deze naam wel uniek zijn. -P, --policy Wordt gebruikt om de policy te definiëren. De policy is de standaardregel die in een van de standaard chains gebruikt wordt. Er kunnen geen policies ingesteld worden voor custom-chains. Een policy heeft altijd ofwel de DROP-, ofwel de ACCEPT-action. -R, --replace Gebruik deze optie om een regel te vervangen. De syntaxis van deze optie is -R chain regelnummer regelspecificatie. -X, --delete-chain Verwijdert een custom-chain. Dit kan alleen als er geen regels meer in de chain voorkomen. -Z, --zero Zet alle counters waarin bijgehouden wordt hoeveel pakketjes / bytes door een bepaalde regel verwerkt zijn op nul. -E, --rename-chain Geeft een andere naam aan een van de custom-chains. Kan niet worden toegepast op een standaard chain. In het voorgaande hebt u een overzicht gevonden van de flags die u kunt gebruiken. Deze flags definiëren alleen nog maar op welke positie in de chain iets moet gebeuren. De werkelijke actie wordt, zoals u hebt gelezen, uitgevoerd door de options. Hier wordt namelijk heel concreet aangegeven aan welke eigenschappen een pakketje moet voldoen om voor verwerking door een regel in aanmerking te komen. U zult vooral heel vaak opties zien waarmee de richting van het verkeer aangegeven wordt. In onderstaande tabel vindt u een overzicht van alle opties die u kunt gebruiken.
Novell Netwerkoplossingen, aanvulling 24
7/5.2-15
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 16
Beveiligingstips voor beheer
Optie -d [!] adres[/mask], --destination
[!] -f, --fragment
-h
7/5.2-16
Beschrijving Hiermee wordt aangegeven wat het adres is waar een pakketje naartoe gestuurd moet worden. Als adres mag een IP-adres van een node gegeven worden. Het is ook mogelijk een IP-netwerkadres te gebruiken, maar in dat geval moet u ook het subnetmasker invoeren; bijvoorbeeld 193.173.100.0/24 om te verwijzen naar het netwerk 193.173.100.0. Het is ook mogelijk te verwijzen naar namen, maar die moeten dan wel door middel van een hosts-file of DNS vertaald kunnen worden in een IP-adres. Als u een regel wilt maken waarin verwezen wordt naar alle IP-adressen, gebruikt u de aanduiding 0/0 of 0.0.0.0/0. Met het uitroepteken is het mogelijk te verwijzen naar adressen die juist niet behandeld moeten worden. Zoals u in het voorbeeld ziet, komt het uitroepteken in dat geval achter de optie -d en voor het adres te staan. Soms worden pakketjes in meerdere delen, de zogenaamde fragments, verstuurd. Als dit het geval is, komt in deze fragments geen adresinformatie meer voor. Als u in een regel wilt verwijzen naar deze fragments, gebruikt u de optie -f: zo weet u zeker dat alle fragmenten waaruit een pakketje bestaat, worden meegenomen. Door ook voor fragmentfilters te schrijven zorgt u ervoor dat het onmogelijk gemaakt wordt voor een hacker om op basis van incomplete pakketjes informatie aan uw systeem te onttrekken. Geeft hulp bij het gebruik.
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 17
Security
Optie -i [!] interface, --in-interface
-o [!] interface, --out-interface
-j target, --jump
Beschrijving Specificeert de interface waarop de pakketjes binnenkomen. Deze optie is alleen nuttig voor de INPUT-, PREROUTING- en FORWARD-chains, aangezien alleen deze chains betrekking hebben op de inkomende interface. Als argument moet u de naam van de interface geven: eth0, ppp0, lo enzovoort. In deze naamgeving kunt u gebruikmaken van een + als wildcard; eth+ verwijst dus naar alle eth-interfaces. Let er vooral goed op dat het weglaten van deze interface betekent dat de regel van toepassing is op elke interface; dit zou eenvoudig tot ongewenst gedrag kunnen leiden. Op een server echter die maar één netwerkkaart heeft en waarop u iptables gebruikt als een firewalloplossing om alleen die server te beschermen, kan dit geen kwaad. Maar vergeet in dat geval niet om uitzonderingen te definiëren voor de loopbackinterface. (iptables -A INPUT -i lo -j ACCEPT en iptables -A OUTPUT -o lo -j ACCEPT). Met deze optie wordt verwezen naar de naam van de interface waarop de pakketjes naar buiten gestuurd worden. Vanwege de aard van de chains heeft deze optie alleen nut in de OUTPUT-, POSTROUTING- en FORWARD-chains. Zie ook de opmerkingen bij de optie -i. Met deze zeer belangrijke optie wordt aangegeven wat er moet gebeuren op het moment dat een rule een treffer oplevert. U verwijst hiermee naar een van de targets (ACCEPT, DROP, REJECT enzovoort) die later in dit hoofdstuk beschreven worden. Als u deze optie vergeet, gebeurt er niets met een pakketje dat voldoet aan de voorwaarden van een regel: alleen de teller dat er een treffer is geweest wordt opgehoogd. Vergeet deze optie dus niet!
Novell Netwerkoplossingen, aanvulling 24
7/5.2-17
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 18
Beveiligingstips voor beheer
Optie -n, --numeric
Beschrijving Zorgt ervoor dat iptables niet probeert IP-adressen in namen te vertalen als het een overzicht geeft van alle aanwezige regels. Dit komt de snelheid aanzienlijk ten goede. -p [!] protocol, Wordt gebruikt om te verwijzen naar het protocol. --protocol waarop de regel betrekking heeft. Elke naam of elk protocolnummer dat gespecificeerd is in /etc/protocols, kunt u hier gebruiken. Als u deze optie niet gebruikt, geldt de regel voor alle protocollen op het systeem. Gebruik bijvoorbeeld de optie -p tcp om aan te geven dat een regel uitsluitend betrekking heeft op TCP-verkeer. -s [1] address[/mask], Deze optie wordt gebruikt om te verwijzen naar het --source source-address in een pakketje. Gebruik deze regel om ervoor te zorgen dat een regel van toepassing is voor bepaalde computers binnen uw netwerk -v, --verbose Bij het tonen van een lijst van alle regels zorgt deze optie ervoor dat er wat extra informatie over de regels getoond wordt. -x, --exact Laat het precieze en niet het afgeronde aantal pakketjes en bytes zien als getoond wordt hoeveel pakketjes door een bepaalde regel afgehandeld zijn. --line-numbers Wordt in combinatie met de optie -L gebruikt om nummers voor elke regel te tonen. -m, match_extension Verwijst naar een match-extension. In de volgende paragraaf kunt u lezen wanneer u hier gebruik van kunt maken. Iptables-extensions In het voorgaande hebt u gelezen hoe u in het algemeen een regel kunt definiëren. Om ervoor te zorgen dat de regel verder verfijnd wordt maakt u gebruik van matchextensions. Dit zijn uitbreidingen op de bestaande functionaliteit van iptables. Elk van deze extensies wordt aan-
7/5.2-18
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 19
Security
Soorten matchextensions
geroepen door een bepaalde kernelmodule. Dit heeft een enorm stuk flexibiliteit tot gevolg; door een nieuwe kernelmodule te schrijven, zou u er dus voor kunnen zorgen dat er nog meer match-extensions beschikbaar komen. Dat is gelijk ook de reden waarom de match-extensions gescheiden zijn van de options. Er zijn twee soorten match-extensions. Om te beginnen zijn er de match-extensions die gerelateerd zijn aan een protocol. Deze worden altijd aangeroepen met een protocolspecificatie zoals -p tcp. Daarnaast zijn er de overige, meer algemene matchextensions. Deze worden aangeroepen met de speciale optie -m. De populairste match-extension is de aanroep van state. Hiermee kan in een pakketje gekeken worden naar TCP-flags (een state bestaat alleen als een sessie opgebouwd is en is daarom niet van toepassing voor UDP). Door dit te doen kunt u bepalen of een pakketje een initiatie is van een nieuwe sessie, of een antwoord op een pakketje dat eerder in een sessie verstuurd is. We herhalen de vier regels die u eerder in dit hoofdstuk al gezien hebt en waarin juist van deze functionaliteit gebruikgemaakt wordt:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT iptables -A INPUT -j LOG --log-prefix “Dropped illegal incoming packet: “
In het bovenstaande ziet u dat in de eerste regel gekeken wordt of een pakketje deel uitmaakt van een sessie die al bestaat, of dat het pakketje gerelateerd is aan een bepaalde sessie. Vervolgens ziet u dat voor alleen TCP-
Novell Netwerkoplossingen, aanvulling 24
7/5.2-19
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 20
Beveiligingstips voor beheer
poorten 22 en 80 pakketjes geaccepteerd worden waarmee een sessie tot stand gebracht wordt. Gebruik van de state match-extension is zeer belangrijk: deze extension maakt het namelijk mogelijk om in een sessie waarbij dezelfde poort als source- en destination-poort geldt, het verkeer toch maar in één richting toe te staan. De state matchextension zorgt ervoor dat uw mailserver en uw client kunnen communiceren over poort 25, maar dat op de server alleen de nieuwe sessies zijn toegestaan en op de client alleen maar pakketjes die deel uitmaken van een bestaande sessie. In onderstaande tabel vindt u een overzicht van alle soorten match-extensions. In de eerste kolom ziet u de protocolspecificatie en het type match-extension. Deze kolom toont hoe u de betreffende match-extension aan moet roepen. In de tweede kolom ziet u de exacte match-extension waar het om gaat en in de derde kolom wordt de betekenis verder uitgewerkt. Specificatie -p tcp
Match extension --sport [!] [port[:port] ], --source-port
--dport [!] [port[:port]], --destination-port --tcp-flags [!] mask comp
7/5.2-20
Beschrijving Wordt gebruikt om de sourcepoort of reeks source-poorten te specificeren. Om een reeks op te geven gebruikt u bijvoorbeeld 1234:1240. Wordt gebruikt om de destination-poort of reeks destination-poorten op te geven. Hiermee kunt u opgeven welke TCP/IP-flags bekeken moeten worden. Als mask specificeert u alle flags die bekeken moeten worden; als comp specificeert u die flags waarop gefilterd moet worden.
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 21
Security
Specificatie
-p udp
-p icmp
-m mac
Match extension [!] –syn
Beschrijving Staat gelijk aan --tcp-flags SYN,RST,ACK SYN, waar gekeken wordt naar pakketjes waarin SYN aanstaat en RST en ACK niet. Dergelijke pakketjes worden gebruikt om een TCP-connectie op te bouwen. Ze kunnen echter ook misbruikt worden in een SYNattack. --tcp-option [!] nummer Kijkt naar een specifieke TCPoptie. --sport [!] [port[!port]], Gelijk aan de overeenko--source-port mende optie bij -p tcp. --dport [!] [port[:port]], Gelijk aan de overeenko--destination port mende optie bij -p tcp. --icmp-type [!] type[/code] Kan gebruikt worden om te filteren op een specifiek type ICMP-pakketje. Gebruik de opdracht iptables -p icmp -h om een overzicht te krijgen van alle typen ICMP-pakketjes waarop gefilterd kan worden. --mac-source [!] adres Hiermee kunt u filteren op inkomende MAC-pakketjes. Aangezien deze optie alleen werkt bij inkomende pakketjes, heeft het dus alleen zin er gebruik van te maken in de PREROUTING- en de INPUT-chains.
Novell Netwerkoplossingen, aanvulling 24
7/5.2-21
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 22
Beveiligingstips voor beheer
Specificatie -m limit
-m multiport
7/5.2-22
Match extension
Beschrijving Deze match-extension kunt u gebruiken om het aantal van een bepaald soort pakketje te beperken. Deze optie is bijvoorbeeld nuttig om DoSattacks te voorkomen; hiermee wordt een server immers bestookt met constant hetzelfde pakketje. Zonder verdere specificatie wordt het aantal pakketjes van een bepaalde soort met deze optie beperkt tot drie per uur. --limit aantal Hiermee kunt u de matchextension -m limit verder specificeren. De opties zijn n/s, n/m, n/h en n/d, waarbij n een getal is en /s, /m, /h en /d bepalen of het gaat om een aantal pakketjes per seconde, minuut, uur of dag. --limit-burst aantal Stelt een maximaal aantal pakketjes in dat in een burst voor mag komen, waarna de limit wordt toegepast. De standaardwaarde is 5. --source-port port[,port[,…]] Deze extensiemodule wordt gebruikt om tot 15 sourcepoorten op te kunnen geven. --destination-port port Zie voorgaande regel, maar [,port[,…]] dan voor destination-poorten.
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 23
Security
Specificatie -m mark
Match extension --mark waarde[/masker]
-m state
--state state
-m unclean
-m tos
--tos tos
Novell Netwerkoplossingen, aanvulling 24
Beschrijving Kan alleen gebruikt worden in de MANGLE-table en heeft betrekking op iproute2. Deze optie heeft een beperkte toepasbaarheid. Wordt gebruikt om de status van een pakketje te bekijken. Deze kan ingesteld staan op INVALID (het pakketje maakt geen deel uit van een connectie), ESTABLISHED (pakketje maakt deel uit van een connectie), NEW (pakketje poogt een nieuwe connectie op te bouwen) en RELATED (pakketje bouwt een nieuwe connectie op die gerelateerd is aan een reeds bestaande connectie). Dit is een experimentele module waarin gekeken wordt naar ongebruikelijke pakketjes. Denk bijvoorbeeld aan TCP-pakketjes met een ongebruikelijke optie als FIN. Ook wordt gekeken naar andere ongeldige pakketjes. Wordt gebruikt om te kijken naar een waarde die in het TOS-veld is ingesteld. Gebruik de opdracht iptables -m tos -h voor een volledig overzicht van deze waarden.
7/5.2-23
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 24
Beveiligingstips voor beheer
Specificatie -m owner
Match extension --uid-owner UID
--gid-owner gid --pid-owner pid
--sid-owner sessionid
Beschrijving Deze match-extension zoekt naar de eigenaar van een pakketje. Deze eigenaar wordt bepaald op basis van de eigenaar van het proces dat het pakketje gegenereerd heeft en kan dientengevolge alleen gebruikt worden voor pakketjes die op de lokale machine gegenereerd zijn en via de OUTPUT-chain naar buiten gaan. Zoekt naar de overeenkomstige GID van de owner. Zoekt naar het process-ID van het proces dat het pakketje gegenereerd heeft. Zoekt naar de overeenkomstige session-ID die aan een pakketje verbonden is.
Iptables-actions Tot nu toe hebben we alleen nog gekeken naar de criteria waar u in een pakketje op moet letten. Waar het bij een firewall natuurlijk allemaal om gaat, is dat er zodra er een match ontstaat, ook een bepaalde actie wordt uitgevoerd. Iptables biedt hiervoor een behoorlijk aantal opties. In onderstaande tabel vindt u hier een volledig overzicht van. Elk van deze acties wordt in het IPTABLES-commando voorafgegaan door de optie -j.
7/5.2-24
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 25
Security
Action ACCEPT DROP REJECT [--rejectwith option]
MASQUERADE [--to-ports port [-port]]
REDIRECT [[to-ports port [-port]]
Beschrijving Laat het pakketje door. Laat het pakketje vallen zonder dat er een bericht teruggestuurd wordt naar de afzender van het pakketje. Laat het pakketje vallen, maar zorgt ervoor dat er wel een ICMP-bericht teruggestuurd wordt naar de afzender van het pakketje. Standaard wordt het ICMP-bericht icmpport-unreachable teruggestuurd. Als u gebruikmaakt van --reject-with, is het ook mogelijk zelf op te geven welke ICMP-foutmelding gegenereerd moet worden. Hiervoor kunt u kiezen uit: • icmp-net-unreachable • icmp-host-unreachable • icmp-port-unreachable • icmp-proto-unreachable • icmp-net-prohibited • tcp-reset • icmp-host_prohibited Deze action kan alleen gebruikt worden in de nat/POSTROUTING-chain. Gebruik deze optie daarnaast alleen als het masquerade-adres dynamisch door middel van DHCP uitgedeeld wordt. Bij gebruik van statische adressen moet u gebruikmaken van SNAT. Deze optie zorgt ervoor dat iptables zich als klassieke NAT-router gaat gedragen: alle pakketjes die naar buiten verstuurd worden, worden verstuurd met als afzender het geregistreerde IP-adres van de NAT-router. Ook deze action kan alleen gebruikt worden in de nattable en wel in de PREROUTING- en de OUTPUT-chains. Met deze action zorgt u ervoor dat de betreffende pakketjes doorgestuurd worden naar de lokale machine. Eventueel kunt u hierbij opgeven dat de redirection plaats moet vinden naar gespecificeerde poorten.
Novell Netwerkoplossingen, aanvulling 24
7/5.2-25
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 26
Beveiligingstips voor beheer
Action RETURN
QUEUE
LOG [--log-level level] [--log -prefix string] --log-tcp-sequence --log-tcp-options --log-ip-options
TOS [--set-tos tos]
DNAT --to -destination ipaddr [ipaddr][:port:port]
7/5.2-26
Beschrijving Als deze actie voorkomt in een door uzelf aangemaakte custom-chain, is het resultaat dat het pakketje doorgestuurd wordt naar de volgende regel in de betreffende chain. Als de actie in een van de standaard chains voorkomt, zorgt deze actie ervoor dat de default-policy wordt uitgevoerd. Deze geavanceerde optie zorgt ervoor dat pakketjes doorgestuurd kunnen worden naar een specifieke toepassing. Om dit te kunnen doen moet u gebruikmaken van de module ip_queue. Deze optie zorgt ervoor dat het betreffende pakketje gelogd wordt naar de standaard logfunctie, in de meeste gevallen syslogd. Met de optie --log-level wordt ingesteld welk loglevel hiervoor gebruikt moet worden. Dit verwijst naar standaard loglevels zoals die in het syslogd-mechanisme gebruikt moeten worden. Om voorafgaand aan een gelogde regel een bepaalde string te tonen kunt u gebruikmaken van de optie --log-prefix. De overige drie specificaties kunt u gebruiken om respectievelijk tcpsequence-nummers, tcp-opties en ip-opties te loggen. Deze actie is alleen toepasbaar in de mangle-tabel. Met deze actie kunt u het TOS-veld in de IP-header instellen op een bepaalde waarde. Zie voor meer informatie de opdracht iptables -j TOS -h. Deze actie kunt u alleen gebruiken in de nat/PREROUTING- en nat/OUTPUT-chains. De actie zorgt ervoor dat het destination IP-adres in een pakketje vertaald moet worden in een ander IP-adres, eventueel in een reeks IPadressen. Ook is het mogelijk te vertalen naar een specifiek poortadres. Om dit laatste te bewerkstelligen moet u in de regel echter wel gebruikmaken van de optie -p tcp of de optie -p udp om een match op een bepaalde poort te definiëren. De hier gebruikte techniek staat ook bekend als poort-forwarding.
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 27
Security
Action SNAT —to-source ipaddr[-ipaddr] [:port:port] MIRROR MARK [--setmark mark] Custom-chain
Beschrijving Deze regel is alleen toepasbaar in nat/POSTROUTING. De actie specificeert dat het source IP-adres vertaald moet worden in een ander IP-adres. Eventueel kunnen hier ook poortadressen bij gebruikt worden. Dit is een experimentele actie waarbij source en destination IP-adressen omgedraaid worden. Hiermee kunt u in de mangle-table de mark-waarde van een pakket instellen. Zorgt ervoor dat een zelf aangemaakte chain met de gespecificeerde naam wordt aangeroepen. 7/5.2.4 Iptables in de praktijk In het voorgaande hebt u gelezen dat er zeer veel opties zijn om gebruik te maken van iptables. Omdat wij ons voor kunnen stellen dat u door de bomen even het bos niet meer ziet, zullen we nu bespreken hoe u een en ander het beste in de praktijk kunt toepassen. Om te beginnen moet u ervoor zorgen dat er een policy wordt ingesteld voor een aantal chains. Dit is de standaardregel die het standaardgedrag voor iptables bepaalt. Alleen als er expliciet een uitzondering gedefinieerd is, wordt er van deze standaard policy afgeweken. Vooral als u iptables gebruikt om te bepalen welke pakketjes wel en welke pakketjes niet doorgestuurd mogen worden, is het aan te raden de policy zo in te stellen dat alle verkeer wordt tegengehouden. De volgende twee regels zorgen ervoor dat in de filter-table het standaardgedrag voor zowel de FORWARD- als de INPUT-chains wordt ingesteld op DROP. iptables -P FORWARD -j DROP iptables -P INPUT -j DROP
Novell Netwerkoplossingen, aanvulling 24
7/5.2-27
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 28
Beveiligingstips voor beheer
Houd er overigens rekening mee dat veel beheerders ook heel graag de OUTPUT-chain de DROP-policy geven. Zo zorgt u ervoor dat een per ongeluk geïnstalleerde Trojaan niet in staat is ongecontroleerd berichten te gaan versturen. Met de standaard policy ingesteld op DROP weet u in elk geval zeker dat u veilig bent. Dit is een goede basis om verder te bouwen aan de iptables-firewall. In het volgende voorbeeld zullen we bespreken hoe u iptables zo in kunt stellen dat een router op basis van iptables alleen FTPpakketjes van het interne netwerk doorlaat naar buiten. Verder gebeurt er niets anders. Dit is misschien niet het meest realistische scenario, maar toont wel heel aardig hoe u een iptables-firewall op moet zetten. Daarnaast is het aardig dat voor het gebruik van FTP twee poorten opengezet moeten worden: er is immers een FTP-commando- en een FTP-datapoort. iptables -P FORWARD -j DROP iptables -P INPUT -j DROP iptables -P OUTPUT -j DROP iptables -A FORWARD -s 192.168.1.0/24 -d 0/0 -m multiport -p tcp --dport ftp,ftp-data -j ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -p tcp --sport ftp-data -j ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -p tcp --sport ftp ! —syn -j ACCEPT iptables -A FORWARD -j LOG --log-prefix “iptables FORWARD:
“
De regels beginnen ermee dat de policy voor elke chain wordt ingesteld op DROP. Hierop wordt vervolgens een uitzondering gedefinieerd in de FORWARD-chain. In de eerste regel in de FORWARD-chain wordt bepaald dat alle FTP- en FTP-datapakketjes die uit het source-netwerk 192.168.1.0 komen, mogen worden doorgelaten. De volgende twee regels definiëren dat zowel FTP-data als FTP-pakketjes
7/5.2-28
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 29
Security
teruggestuurd mogen worden. Op de normale FTP-pakketjes die vanaf het externe netwerk terugkomen, wordt echter nog wel een uitzondering gemaakt: als het TCP SYN-flag aanstaat, wordt het pakketje niet doorgelaten. In dat geval is het namelijk een pakketje dat probeert een sessie te initiëren en dat is niet toegestaan. Vanaf het externe netwerk mogen alleen pakketjes teruggestuurd worden als antwoord op verzoeken die vanaf het lokale netwerk afkomstig zijn. Tot slot wordt voor alle overige pakketjes in de FORWARD-chain een entry weggeschreven in het logbestand. De reden waarom deze laatste regel alleen geldt voor alle overige pakketjes is voor de hand liggend: als een pakketje immers een regel tegenkomt waaraan voldaan wordt, wordt er niet verder gekeken of er nog meer regels zijn waaraan voldaan wordt. Dit betekent dat alle FTP-pakketjes al afgehandeld zijn op het moment dat een pakketje bij de laatste regel komt. Houd er rekening mee dat deze laatste regel er waarschijnlijk voor zorgt dat er gigantisch veel informatie weggeschreven wordt naar de logbestanden! (Voor een hacker zou het een leuke uitdaging zijn om dit als DoS-attack te gebruiken.) Tip
Kan het ook makkelijk? Configuratie van een iptables-firewall is bepaald niet eenvoudig. Gelukkig hoeft het niet op deze manier. Het voordeel echter van deze werkwijze is dat u het hele proces in de hand hebt en exact in kunt stellen wat u wel en wat u niet toe wilt staan. U kunt echter ook uw firewall toevertrouwen aan de grafische beheersgereedschappen die voor dit doel met de verschillende distributies meegeleverd worden. Bijvoorbeeld met SuSE’s YaST klikt u eenvoudig een firewallconfiguratie bij elkaar; ook in Red Hat/Fedora hoeft het niet moeilijk te zijn en kunt u met de systemconfig-security-interface eenvoudig een configuratie opbouwen.
Novell Netwerkoplossingen, aanvulling 24
7/5.2-29
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 30
Beveiligingstips voor beheer
Vrijwel elke distributie biedt mogelijkheden om zonder al te veel problemen een firewall in te richten.
Bovenstaande regels zorgen ervoor dat iptables alle FTPpakketjes van het interne netwerk doorlaat naar het externe netwerk en dat het ook mogelijk is dat er antwoord komt op deze pakketjes. Maar hoe zit het nu met FTP-pakketjes die gegenereerd worden vanaf de lokale machine? Welnu, deze worden niet doorgelaten. Het verkeer op de lokale machine wordt immers bepaald door de INPUT- en OUTPUT-chains in de filter-table. Om de lokale machine FTP-pakketjes te laten versturen hebt u een uitbreiding op de regels nodig. De nu volgende regels dienen als uitbreiding op het voorgaande voorbeeld. We gaan er daarbij overigens van uit dat de lokale machine op de externe interface gebruikmaakt van IP-adres 193.173.97.1 iptables -A OUTPUT -o eth0 -s 193.173.97.1 -d 0/0 -m multiport -p tcp --dport ftp,ftp-data -j ACCEPT iptables -A OUTPUT -j LOG —log-prefix “iptables OUTPUT:
“
iptables -A INPUT -i eth0 -s 0/0 -d 193.173.97.1 -p tcp --sport ftp-data -j ACCEPT iptables -A INPUT -I eth0 -s 0/0 -d 193.173.97.1 -p tcp --sport ftp ! —syn -j ACCEPT
7/5.2-30
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 31
Security
iptables -A INPUT -j LOG --log-prefix “iptables INPUT:
“
U ziet dat bovenstaande regels eigenlijk grotendeels gelinkt zijn aan de regels voor de FORWARD-chain. Het enige verschil is dat het nu om een intern proces gaat. Dat betekent dat er niet gewerkt wordt met de FORWARDchain, maar met OUTPUT voor uitgaande pakketjes en met INPUT voor alles wat binnenkomt. Alles bij elkaar kunt u er met bovenstaande regels efficiënt voor zorgen dat er geen pakketjes verstuurd kunnen worden, met uitzondering van FTP-pakketjes. Het kan echter veel eenvoudiger, vooral voor wat betreft de pakketjes die als antwoord terugkomen. Als u gebruikmaakt van connection-tracking door de twee hiervoor noodzakelijke kernelmodules te laden, kunt u gewoon kijken naar pakketjes met een status (--state) van ESTABLISHED of RELATED. Dat komt er als volgt uit te zien: modprobe ip_conntrack modprobe ip_conntrack_ftp iptables -P FORWARD -j DROP iptables -P INPUT -j DROP iptables -P OUTPUT -j DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state NEW -s 192.168.1.0/24 -d 0/0 -p tcp --dport ftp -j ACCEPT iptables -A FORWARD -m limit -j LOG --log-prefix ïptables FORWARD:
“
iptables -A OUTPUT -o eth0 -s 193.173.97.1 -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state NEW -o eth0 -s 193.173.97.1 -d 0/0 -p tcp --dport ftp -j ACCEPT
Novell Netwerkoplossingen, aanvulling 24
7/5.2-31
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 32
Beveiligingstips voor beheer
iptables -A OUTPUT -m limit -j LOG --log-prefix “iptables OUTPUT:
“
iptables -A INPUT -I eth0 -s 0/0 -d 193.173.97.1 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m limit -j LOG —log-prefix “iptables INPUT:
“
Let erop dat naast de nieuwe functie van connectie-tracking hier ook een maximum gesteld wordt aan het aantal regels dat in de logbestanden zal verschijnen. Hiervoor wordt gebruikgemaakt van de match-extension -m limit. Deze match-extension zorgt ervoor dat er van elke pakketsoort maximaal drie logs per uur plaatsvinden. U hebt tot nu toe gelezen over de wijze waarop u een eenvoudige router met iptables kunt beveiligen. In het dagelijks leven zult u echter vooral routers tegenkomen met NAT. Dit zorgt ervoor dat op het privénetwerk gebruikgemaakt wordt van adressen uit de private address range. Deze privéadressen worden door de NAT-router vertaald, zodat elke node uit het lokale netwerk internet op kan door gebruik te maken van het IP-adres van de NAT-router. NAT is echter meer dan dat. Als u de beschikking hebt over meerdere geregistreerde IP-adressen, is het ook mogelijk om nodes die op het lokale netwerk voorkomen bereikbaar te maken op een van deze geregistreerde IP-adressen.
7/5.2-32
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 33
Security
Dit netwerk moet geconfigureerd worden met iptables.
In bovenstaande afbeelding ziet u het voorbeeldnetwerk dat we gaan configureren met iptables. Wat hier opvalt, is dat het netwerk uit twee componenten bestaat. Om te beginnen is er een aantal nodes dat alleen maar contact op hoeft te kunnen nemen met nodes op internet, maar niet vanaf internet bereikbaar hoeft te zijn. Daarnaast zijn er twee servers op het interne netwerk die wel vanaf internet bereikt moeten kunnen worden. Om dit laatste voor elkaar te krijgen is het absoluut noodzakelijk dat u beschikt over meerdere geregistreerde IP-adressen. U kunt een dergelijk netwerk configureren met onderstaande configuratie. modprobe iptable_nat modprobe ip_nat_ftp modprobe ip_conntrack modprobe ip_conntrack_ftp iptables -P INPUT -j DROP iptables -P FORWARD -j DROP iptables -P OUTPUT -j DROP iptables -t nat -A PREROUTING -d 193.173.97.2 -j DNAT --to-destination 192.168.1.2
Novell Netwerkoplossingen, aanvulling 24
7/5.2-33
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 34
Beveiligingstips voor beheer
iptables -t nat -A PREROUTING -d 193.173.97.3 -j DNAT --to-destination 192.168.1.3 iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 193.173.97.2 iptables -t nat -A POSTROUTING -s 192.168.1.3 -j SNAT --to-source 193.173.97.3 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 192.168.1.0/24 -d 0/0 -m state --state NEW -j ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.2 -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport www -j ACCEPT iptables -A FORWARD -s 0/0 -d 192.168.1.3 -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport ftp -j ACCEPT iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -I eth0 -s 192.168.1.0/24 -d 192.168.1.1 -m state --state NEW -j ACCEPT
Veel van de regels in bovenstaand voorbeeld zult u herkennen. Nieuw zijn de regels waar gewerkt wordt in de nat-table (-t nat). De eerste twee regels zorgen ervoor dat alle pakketjes die binnenkomen op IP-adres 193.173.97.2 en 3 vertaald worden naar de overeenkomstige private IPadressen. Vervolgens zijn er twee regels (de POSTROUTING-regels) waarin het omgekeerde gebeurt. Dit is noodzakelijk om ervoor te zorgen dat pakketjes die afkomstig zijn van de WWW- en FTP-server op het private-netwerk door de IP-tables router verstuurd worden met de juiste source-adressen. Als dit niet zou gebeuren, zouden ze immers met de source-adressen uit het netwerk 192.168.1.0 het internet op gaan en dientengevolge
7/5.2-34
Novell Netwerkoplossingen, aanvulling 24
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 35
Security
onbereikbaar zijn. Vervolgens zorgt de derde POSTROUTING-regel in de nat-table ervoor dat alle pakketjes die afkomstig zijn van alle andere nodes op het private-netwerk naar buiten gaan met het IP-adres van de iptablesrouter. Aangezien hier gebruikgemaakt wordt van een statisch IP-adres (het adres 193.173.97.1), geldt hier de action SNAT. Zou het niet om een statisch IP-adres op de iptables-router gaan, maar om een dynamisch adres dat verkregen is van een DHCP-server, dan moet hier in plaats van SNAT gebruikgemaakt worden van de action MASQUERADE. Doordat naar de status van een pakketje gekeken wordt, is het niet nodig om nog aparte regels te definiëren die ervoor zorgen dat de antwoorden vanaf internet ook teruggestuurd mogen worden naar deze nodes; dit gebeurt automatisch door te kijken naar de status ESTABLISHED en RELATED. Tip
Automatisch laden bij herstarten Leuk dat u op de opdrachtregel met de nodige commando’s een firewall in elkaar kunt tikken. Maar als uw server een keer opnieuw op moet starten (iets wat overigens op de gemiddelde Linux-server vrij zeldzaam is), wilt u waarschijnlijk dat de firewall-chains met hun regels automatisch opnieuw ingelezen worden. Om dit op de veiligst denkbare manier te doen moet u diepgaande kennis hebben van de opstartprocedure die op uw distributie gebruikt wordt. Een acceptabel alternatief is op uw distributie in de directory /etc/rc.d/init.d (op sommige distributies /etc/init.d) een bestand aan te maken met de naam boot.local en daar alle regels in te zetten. Op deze manier is uw server weliswaar ongeveer een minuut niet beschermd, maar dit is wel een methode die altijd werkt en daarom bevelen we u deze methode toch aan.
Novell Netwerkoplossingen, aanvulling 24
7/5.2-35
deel 7_5_2-AV24.qxp:deel 7_6-AV20
27-06-2007
15:54
Pagina 36
Beveiligingstips voor beheer
IP-aliassen
Misschien denkt u dat u er nu bent: dat is niet helemaal het geval. De iptables-router is op dit moment namelijk nog niet geconfigureerd om te luisteren naar de IP-adressen 193.173.97.2 en 193.173.97.3. Dit is eenvoudig op te lossen door gebruik te maken van IP-aliassen. Dit betekent dat een tweede IP-adres aan een interface wordt toegewezen. U verwijst dan alleen niet naar eth1, maar naar eth1:0 en eth1:1 enzovoort. Om bovenstaand voorbeeld compleet te maken moet u hiervoor nog de volgende commando’s uitvoeren: ifconfig eth1:0 193.173.97.2 ifconfig eth1:1 193.173.97.3
Deze commando’s zorgen er voor dat eth1 niet langer naar slechts één IP-adres luistert, maar naar drie verschillende IP-adressen. 7/5.2.5 Samenvatting In deze paragraaf hebt u kennisgemaakt met een stukje basiskennis dat nodig is om een Linux-server in te richten, de firewall. Veel Linux-distributies zorgen er automatisch tijdens de installatie al voor dat een firewall aangezet en geconfigureerd wordt, maar als dat niet gebeurd is, kunt u het op basis van de informatie die gegeven is zelf handmatig regelen. Wij raden u aan er op dit moment voor te zorgen dat de standaardpolicy zo staat ingesteld dat alle netwerkverkeer gedropt wordt en alleen verkeer op de loopback-interface is toegestaan. U bent dan namelijk volkomen veilig. Met dit als uitgangspunt zorgt u er na configuratie van de services die u wel nodig hebt voor dat alleen voor die services poorten opengezet worden.
7/5.2-36
Novell Netwerkoplossingen, aanvulling 24