TCPD en Firewalls met IPFWADM

ArticleCategory: [Kies een categorie voor je artikel]

System Administration

AuthorImage:[Hier komt een kleine foto van jou]

[Foto van de Auteur]

TranslationInfo:[Info over schrijver(s) en vertaler(s)]

original in es Javi Polo

es to en Miguel A. Sepulveda

en to nl L. Saarloos

AboutTheAuthor:[een korte biografie over de auteur]

Ik ben 18 jaar en een "high-school student with Catalan pending for September". Mijn passie is computer wetenschappen, ik hoop dat ik toegelaten wordt tot de UIB zodat ik een graad in Telecomunicatie, Bouwkunde en Computerwetenschappen kan halen. Ik hou van hardcore muziek en ik speel in een band genaamd Niko-Chan's Kingdom. Meer is er eigenlijk niet te vertellen, ik heb een lieve vriendin genaamd Xiska 0:) 

Abstract:[een kleine samenvatting/beschrijving van het artikel]

Dit artikel beschrijft kort hoe inetd services geconfigureerd kunnen worden voor een betere veiligheid op je systeem. We richten ons hier op de tool IPFWADM om de inetd services te beheren en te configureren.

ArticleIllustration:[Titel-illustratie van het Artikel]

[Illustratie]

ArticleBody:[Het eigenlijke artikel: zet hier teks en HTML codes]

Om te beginnen moeten we begrijpen wat inetd is. Inetd is een daemon die de services beheert die je systeem biedt aan andere hosts die verbonden zijn met het netwerk. Het is mogelijk dat op bepaalde systemen inetd niet geconfigureerd om deze services allemaal te beheren, dus het eerste wat we doen is naar /etc/inetd.conf gaan en controleren dat de services inderdaad door inetd beheerd kunnen worden . Het eerste advies dat gegeven moet worden is dat er niet meer services geactiveerd moeten worden dan we echt nodig hebben, dit is de beste beveiliging tegen aanvallen die gebruik maken van bugs in daemons die we nooit gebruiken. Ik ga er van uit dat de lezer een inetd.conf-bestand bij de hand heeft, dus laat ik beginnen met uitleggen wat een aantal dingen betekenen.
Bijvoorbeeld, de regel:

ftp stream tcp nowait root
/usr/sbin/tcpd in.ftpd -l -a
Het eerste woord is de naam van de service die aangeboden wordt (hier "ftp", we kunnen in /etc/services opzoeken met welke poort deze service verbonden is).

Het tweede veld is het type socket dat geopend wordt, dit kan zijn: stream (zoals in dit voorbeeld), dgram, raw, rdm en seqpacket.

Het volgende veld is het protocol dat gebruikt wordt. Deze zijn bepaald in het bestand /etc/protocols, TCP van ons voorbeeld zou daar al tussen moeten staan.

Na het protocol komt het veld wait/nowait. Dit zou altijd nowait moeten zijn behalve voor datagram (dgram) sockets. Voor het laatste type van sockets moeten we nowait aangeven als de server multiple threads ondersteunt of wait als de server alleen single threads ondersteund. De reden hiervoor is dat multithreaded systemen, wanneer ze een verzoek krijgen, een nieuw process opstarten en dan de socket weer vrijgeven zodat inetd verder kan gaan met het luisteren naar andere verzoeken. Die nieuwe verzoeken hoeven dus nooit te wachten (nowait). In het geval van een singlethreaded server hebben we met dezelfde socket te maken en kan er niet een apart proces gestart worden voor elke verbinding. Daarnaast is er nóg een mogelijkheid: we kunnen ook schrijven nowait.50 -- 50 betekent het maximum aantal daemons dat gestart mag worden (of het maximale aantal verzoeken dat geaccepteerd kan worden, afhankelijk van het uitgangspunt) in 1 minuut. Standaard is 40.

Het vijfde veld geeft aan op welke user de daemon draait, in ons voorbeeld draait ftp met userid root.

Het zesde en verdere velden zijn de programma's die gestart worden gevolgd door parameters voor dat programma. In ons voorbeeld, de daemon tcpd wordt gestart met als argument de daemon in.ftpd en de parameters -l -a. Hiermee komen we bij het meest interessante gedeelte van deze sectie, TCPD.

Tcpd is een daemon die verzoeken filtert en afhankelijk van de respons (gebaseerd op het IP-adres van waar de aanvraag komt) wel of niet een daemon start. Deze beslissing is gebaseerd op de configuratiebestanden /etc/hosts.allow en /etc/hosts.deny.

In principe wordt /etc/hosts.deny gebruikt om aan te geven wie geen services mag gebruiken, en /etc/hosts.allow om aan te geven wie wel services mag gebruiken.
Beide bestanden zien er als volgt uit:

DAEMON: IP[: OPTION1 [: OPTION2 ]]
waar DAEMON de daemon is die gestart wordt, zoals in.ftpd van ons voorbeeld, of het kan de voorgedefinieerde constate ALL zijn, wat gevolgen heeft voor alle daemons.

IP kan een specifiek IP zijn, een URL, een verzameling IP's (of URL's), of het kan elke van de wildcards bevatten die ik in een moment zal bespreken.

Om een verzameling IP adressen aan te geven kunnen we bijvoorbeeld schrijven: `123.32.' Deze notatie specificeert alle IP adressen met de vorm 123.32.XXX.XXX; op een zelfde wijze kan een verzameling URL's gegeven worden, bijvoorbeeld `ml.org' wat neerkomt op alle subdomeinen van ml.org.

Een meer traditionele manier van een verzameling IP adressen opgeven is het gebruik maken van een IP/MASK notatie. In deze notatie is bijvoorbeeld de verzameling 127.0.0.0 tot 127.0.255.255 gelijk aan 127.0.0.0/255.255.0.0 
De wildcards zijn:
ALL alle mogelijke waarden zijn toegestaan
LOCAL Alle namen zonder een "."
UNKNOWN Elke machine wiens naam of IP adres onbekend is
KNOWN Elke machine wiens naam en IP adres bekend zin
PARANOID Alle machines van welke de naam niet overeen komt met het IP adres
De mogelijke opties zijn:
 
allow betekent dat een connectie toegestaan is aan alles wat met de entry overeen komt, onafhankelijk van de inhoud van de bestanden hosts.allow of hosts.deny. Deze optie moet altijd als laatste in een regel voorkomen.
deny Gelijk aan de vorige optie, behalve dat de connectie geweigerd wordt.
spawn start een shell commando wanneer en verzoek om een verbinding ontvangen wordt. Bijvoorbeeld: ik hoor graag een piepgeluidje elke keer als iemand mijn machine probeert binnen te komen.
twist Lijkt op de spawn-optie, behalve dat de verbinding onderbroken wordt na het uitvoeren van het shell commando. Deze optie zal ook een van de laatste in de regel moeten zijn.

De laatste twee opties maken het gebruik van de uitbreidingskarakters behorende bij tcpd mogelijk. Dit zijn:
 
%a adres van de client machine
%c informatie over de client (bijvoorbeeld in de vorm user@machine)
%d naam van de daemon
%h naam of IP adres van de client indien deze beschikbaar zijn
%n naam van de client
%p PID van de daemon
%s informatie over de server (daemon@machine of alleen daemon, hangt er van af)
%u naam van de client gebruiker
%% het karakter %

Met deze uitbreidingen en de laatste opties kun je al veel dingen doen. Bijvoorbeeld: ik ken iemand die automatisch een teardrop verstuurt als iemand probeert te telnetten naar zijn systeem :)

Opmerking: Een teardrop is een DoS (Denial of Service, of weigering van dienst, een aanval gericht op het laten rebooten of opnieuw initialiseren van een systeem. Het is gebaseerd op een bug in de defragmentatie van TCP pakketjes en de meeste Operating Systems hebben hier last van (of liever, 'hadden', aangezien bij de meeste kernels de bug verholpen is). Informatie verzonden via het InterNet maakt gebruik van het protocol TCP/IP (dit protocol wordt ook bij andere soorten netwerken gebruikt, zoals intranet). TCP/IP bestaat eigenlijk uit twee protocollen: TCP zorgt voor het opdelen van informatie in pakketten (fragmentatie) waarna deze pakketjes door het IP protocol verstuurd worden naar hun bestemming; wanneer het daar aangekomen is controleert het TCP protocol of alle pakketjes aangekomen zijn en stelt ze weer samen om tot de originele informatie te komen (defragmentatie).

De voorgenoemde aanval maakt gebruik van het feit dat veel Operating Systems de pakketjes niet controleren vóór de defragemntatie. Indien de pakktejes te klein zijn raakt de machine in de war door de tijd die nodig is om de pakktejes samen te voegen. Ik ben niet helemaal zeker van de volledige uitleg dus elke aanvulling of correctie is welkom.
Laten we verder gaan...
Voorbeelden:

#hosts.allow 

ALL: 127.0.0.1 # Localhost mag alles doen

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# Laat iemand toe via ftp, maar laat een geluidje horen

in.telnetd:  ALL: twist ( teardrop %h %h )
# stuur een teardrop terug naar iedereen die probeert binnen te komen via telnet

#fin
#hosts.deny

ALL: `.bsa.org'   # Sta niemand toe binnen te komen van domein bsa.org

in.fingerd: ALL   # De fingerd service mag door niemand gebruikt worden :)

#fin
Dit is alles wat ik te vertellen heb over tcpd, mijn kennis reikt niet verder. Ik raad je aan te experimenteren met verschillende configuraties en de manual pages te lezen (tcpd, host_acces(5)), ik ben er zeker van dat de lezer daarvan veel meer kan leren dan ik kan vertellen.
Laten we verder gaan met een discussie van de tool IPFWADM.

Een eerste vereiste is ondersteuning van IP Firewalling in de kernel (Networking -> Network firewalls + IP: firewalling ). Na compilatie en herinitialisatie van het systeem zijn we klaar om met deze tool aan de slag te gaan.

IPFWADM laat ons toe het binnenkomen en versturen van (o.a.) TCP, UDP en ICMP pakketten te beheren (deze drie zijn de enige die we hier bespreken).
Kort gezegd kan de systeembeheerder vaststellen welke pakketjes toegestaan zijn om binnen te komen, zelfs van welke IP of verzamelingen IP's, op welke poort dit mag zijn, met welk protocol, en alle mogelijke combinaties van deze mogelijkheden. We hebben dezelfde controle over uitgaande pakketjes.

ipfwadm heeft verschillende algemene parameters:

In dit artikel ga ik verder alleen in op de parameters -I en -O. Beiden gebruiken dezelfde syntax.
De opties voor deze parameters zijn:
  De "belangrijke" parameters zijn:
 
-P geeft aan voor welk protocol de regels gelden. Het protocol kan een van de volgende zijn: TCP, UDP, ICMP of all (om *elk* protocol aan te geven)
-S geeft het adres van de oorsprong van het pakket. Dit wordt gespecificeerd met: ADDRESS[/MASK][PORT] . Bijvoorbeeld, een geldig adres zou zijn 123.32.34.0/255.255.255.250 25 (dit omvat de verzameling 123.32.34.0 tot en met 123.32.34.5 op poort 25).
-D geeft de eindbestemming aan van een pakket en volgt hetzelfde formaat als -S

Dit zijn in principe alle fundamentele parameters, dus om alles van mijn eigen machine toe te laten voeg ik de volgende regel toe:
ipfwadm -I -i a -S 127.0.0.1

en om alle pakketjes te weigeren van 123.34.22.XXX :
ipfwadm -I -a d -S 123.34.22.0/255.255.255.0

en als ik ALLE toegang tot de netbios poort wil ontzeggen, behalve IP 111.222.123.221:
ipfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139
 

Ik denk dat dit alles is wat betreft mijn artikel, misschien een klein beetje aan de magere kant, maar mijn kennis is ook maar beperkt O:)