. 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:
-
-A geef accounting rules
-
-I geef rules voor inkomende pakketjes
-
-O geef rules voor uitgaande pakketjes
-
-F geef rules voor het doorsturen van pakketjes
-
-M is voor het beheren van IP masquarading
In dit artikel ga ik verder alleen in op de parameters -I en -O. Beiden
gebruiken dezelfde syntax.
De opties voor deze parameters zijn:
-
-a voeg een of meer regels toe aan het einde van de lijst
-
-i voeg een of meer regels toe aan het begin van de lijst
-
-d verwijder een of meer regels uit de lijst
-
-l laat de regels in de lijst zien
-
-f verwijder alle regels uit de lijst
-
-p geeft aan of pakketten geaccepteerd moeten worden (a), geweigerd (d) of
verworpen (r)
-
-c controleer welke regels doorlopen worden door een pakket
-
-h help
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:)
2000-04-25, generated by lfparser version 1.4