Gentoo Logo

[ << ] [ < ] [ Home ] [ > ] [ >> ]


12. Firewalls

Inhoud:

12.a. Een firewall

Mensen denken vaak dat een firewall de beste veiligheid garandeerd, maar ze zijn fout in de meeste gevallen kan een fout-geconfigureerde firewall minder veiligheid geven dan geen hebben. Een firewall is ook een software en zou moeten op de zelfde manier behandeld worden als een ander, omdat het hoogstwaarschijnlijk fouten bevat.

Dus denk, voor je een firewall implementeerd in je systeem! Heb je echt een nodig? Als denkt dat je een nodig hebt, schrijf een beleid van wat het moet doen, hoe het moet werken, welke soort firewall je nodig hebt en wie het moet onderhouden. Maar allereerst lees deze firewall-gids.

Firewalls worden gebruikt voor twee doelstellingen.

  • Om gebruikers wormvrij/aanvalvrij te houden
  • Om gebruikers toegang te beperken tot het intern netwerk

Er zijn slechts 3 soorten van firewalls:

  • Pakket filters (Packet filtering)
  • (Circuit relay)
  • (Application gateway)

Een firewall zou moeten werken op een machine speciaal gemaakt voor deze service en geen andere (of sshd als enige) en beveiligd zoals aangeraden in deze gids.

12.b. Pakket filters (Packet filtering)

Alle netwerk trafiek wordt verzonden in de vorm van pakketten. Grote aantallen van trafiek worden opgedeeld in kleinere pakketen in de vorm van pakketten voor het makkerlijker te kunnen behandelen. Daarna worden die terug aaneengeschakeld als ze aangekomen zijn op de bestemming. In het pakket-kop van ieder bestand zit informatie van waar en hoe het zou moeten afgeleverd zijn. Deze informatie is exact wat een pakket filter firewall gebruikt. Filteren gebeurd op basis van :

  • Toestaan of verwerpen pakketten op basis van bestemming/bron IP adres
  • Toestaan of verwerpen pakketten op basis van bestemming/bron IP poort
  • Toestaan of verwerpen pakketten op basis van het gebruikte protocol
  • Toestaan of verwerpen pakketten op basis van bepaalde opties binnenin een protocol

Met andere woorden, Het filteren is gebaseerd op de data in de kop van het pakket en niet op de inhoud.

zwakheden:

  • Adres informatie in een pakket kan een vals IP adres bevatten van de zender (of een gespoofd adres zoals we dat noemen).
  • Data of aanvragen binnen een toegestaan pakket kan ongewenste data dat de aanvaller kan gebruiken om het gebruiken van gekende virussen in een dienst of achter een firewall.
  • Meestal alleenstaand falingspunt

voordelen:

  • Simpel en gemakkelijk in te voegen
  • Kan waarschuwingen geven over een mogelijke aanval voor het gebeurd (bv. door het detecteren van poort-scans)
  • Goed voor het stoppen van SYN aanvallen

Voorbeelden van gratis pakket filters voor Linux:

Nota: Het is aangeraden dat je IPtables gebruikt. Ipchains is verouderd.

12.c. Circuit relay

Een circuit level gateway is een firewall die verbindingen valideerd vooralleer het data uitwisselen toelaat. Dit betekend dat het niet alleen toelaat of wijgert pakketten gebaseert op de pakket-kop maar controleert als de connectie tussen zender en ontvanger goed is gebeurt volgend vooropgestelde regels. Daarna opent de firewall pas een sessie en laat het toe data uit te wisselen. Filteren gebeurd op basis van :

  • Bron/bestemming IP adres
  • Bron/bestemming port
  • Duur van de overdracht
  • Protocol
  • Gebruiker
  • Wachtwoord

Al het verkeer is gevalideerd en in de gaten gehouden en ongewenst verkeer kan worden geweigerd.

zwakheden:

  • Is actief op het Transport Layer en kan enige wijzigingen van programma's, die normaal transporteer functies verstrekken, teweeg brengen.

12.d. Application Gateway

Het Aplicatie Gateway level is een proxy voor aplicaties, die data uitwisselt met de externe server opdat de clients beveligigd zouden zijn. Het is meestal goed weggehouden van het publieke gedeelte, geplaast achter een DMZ (geDeMilitarizeerde Zone : Het deel van een geheim netwerk dat zichtbaar is door een firewall) of een firewall die geen connecties toestaat van buitenaf. Filteren is gebaseerd op:

  • Toestaan of weigeren op basis van Bron/Bestemming IP adres
  • Gebaseerd op het pakket's inhoud
  • Raadpleeg limitaties op een bestand opleggen op basis van extensies

Voordelen:

  • Kan bestanden cachen zodat de netwerkstabiliteit verhoogd.
  • Kan gedetailleerde logs aanmaken van alle connecties
  • Schaalt goed (Sommige proxy servers kunnen de gecachte date "delen")
  • Geen toegang tot buiten (het netwerk)
  • Kan de inhoud van een bestand meteen aanpassen

Zwakheden:

  • Complexe configuratie

Application gateways zijn algemeen de veiligste ondervonden sinds ze geen root-toegang nodig hebben om op te starten en de computers "achter" die pc zijn niet bereikbaar.

Voorbeeld van een gratis application gateway:

12.e. Ipfiltering via Iptables

Om Iptables te kunnen gebruiken moet het toelaten in de kernel. Ik heb Iptables als module toegelaten in mijn kernel( de Iptables commando zal ze laden als hij die nodig heeft), en heb mijn kernel opnieuw gebouwd (maar je kunt evengoed Iptables in de kernel bakken, als je liever oadable Kernel Modules afzet in je kernel-configuratie). Voor meer informatie over hoe je je kernel moet configureren kun je terrecht op de volgende url : Iptables gids hoofdstuk 5: voorbereidingen. Na de nieuwe kernel geinstaleerd te hebben (of tijdens het hercomileren) moet je ook nog het iptables comando toevoegen aan het systeem; Dit kan simpelweg met emerge iptables.

Test nu iptables door het volgende commando uit te voeren: iptables -L. Als dit niet lukt dan is er iets mis met je configuratie.

Iptables is een stateful packet filter wat wil zeggen dat ze meer controle en veiligheid biedt dan ipchains (Linux versie 2.2) die niet stateful is. Nu vraag je je waarschijnlijk af wat stateful wil zeggen? En wat het verschil is?

We weten allemaal dat TCP uitgemaakt is als een serie pakketten. Elke pakket bevat informatie over bronadres, doeladres en een sequentienummer opdat de pakketten weer samengebracht kunnen worden. We weten tevens dat TCP connectie-georienteeerd is en UDP connectieloos. Dat zijn de "states" die gebruikt worden. Nu vraag je je waarschijnlijk af "En dan?" Wel, daar kom ik nu aan toe...

Stel je nu voor dat je een stateless firewall hebt (ipchains) en je wil niet dat externe pc's een connectie naar je interne services aanmaken; maar hoe kan je nu weten of een pakket nu behoort tot een connectie naar of een connectie van? Een stateless firewall kan geen onderscheidt tussen beide maken door te kijken naar de SYN vlag.

Veronderstel dat een hacker een bende zelfgemaakte pakketten verstuurt waarin hij de SYN vlag of andere vlaggen aangepast heeft. Dit is iets wat hackers vaak doen. Ze zenden zo pakketten langs de firewall om en passen routingtables aan of exploiteren services die op de firewall draaien maar zogezegd veilig moeten zijn. Een stateful firewall zal bijhouden welke connecties er zijn en kan gemakkelijk verifieren of een pakket tot een bestaande connectie behoort of niet. Wanneer een connectie, die zegt dat hij een deel is van een bestaande connectie, ontmaskert wordt als vals, dan kan deze aangeduid worden als "ongeldig" en kan men de bijhorende pakket weigeren. Op die manier is het dus mogelijk om "Stealth Scans" tegen te houden, aangezien deze gebruik maken van valse connecties.

Er zijn nog tientallen andere redenen waarom, maar ik denk wel dat je bovenstaande uitleg begrijpt. Eenvoudige regels maken een kleinere firewallconfiguratie mogelijk waardoor ze dus ook gemakkelijker is om te beheren.

Iptables biedt verschillende andere mogelijkheden, zoals rate limitaties. Deze feature is zeer handig indien je bepaalde DoS aanvallen zoals SYN aanvallen wil tegengaan. Maar wat is nu een SYN aanval?

Wel, wanneer een TCP connectie opgemaakt wordt wordt er gebruik gemaakt van een 3-wegs handdruk:

Three-way handshake

Een SYN aanval is wanneer de vijand maar 1 SYN pakket verstuurt maar niet het andere pakket waardoor de connectie niet wordt opgemaakt. Een SYN pakket moet geen geldig zender-IP-adres bevatten omdat ze geen antwoord vereist van de hacker. Dus blijft de half-open connectie hangen totdat deze timeout. Indien de hacker dus veel SYN pakketyrn verzendt met een valse zender-IP dan zal de doelpc blijven wachten op een antwoord die nooit komt. Afhankelijk van de timeout instellingen van je systeem zal de connectie gedurende 30 tot 60 seconden open blijven. Wanneer de connectielimiettabel volledig in gebruik is kan je pc geen andere connecties meer aangaan, en is je server dus onbereikbaar via het internet.

Dit is waar rate limit in het spel komt. Het is mogelijk om het aantal SYN pakketten van een bepaald bronadres te limiteren dmv -m limit --limit 1/s. Dit zal het aantal SYN pakketten per bronadres restricteren en dus de SYN floods tegengaan.

Nu wat praktische zaken...

Wanneer iptables in de kernel geladen is heeft het 5 plaatsen waarin je je regels kan plaatsen. Ze noemen INPUT, OUTPUT, FORWARD, PREROUTING en POSTROUTING. Deze lijsten worden ketens (chains) genaamd omdat ze werken als een ketting: deel per deel wordt ingegeven, elk pakket doorloopt alle regels. Indien 1 regel nyet zegt, wordt het pakket geweigerd.

Je kan je regels direct in 1 van de 5 hoofdketens plaatsen, ofwel zelf ketens maken en deze toevoegen als regel aan een bestaande keten. Laten we eens kijken hoe je dat doet:

Optie: Uitleg:
-A Append (Toevoegen)
-D Delete (Verwijderen)
-I Insert (Invoegen)
-R Replace (Vervangen)
-L List (Toon)
-F Verwijder alle regels in een of alle ketens
-Z Zet de tellers van een of alle ketens op nul
-C Test dit pakket op de keten(s)
-N Maak een eigen keten
-X Verwijder een zelfgemaakte keten
-P Verander het beleid van een keten
-E Verander de naam van de keten
-p Protocol
-s Bronadres of -mask
-d Doeladres of -mask
-i Invoer naam (netwerkinterface)
-o Uitvoer naam (netwerkinterface)
-j Spring (commando voor in een keten)
-m Uitgebreide herkenning
-n Numerieke uitvoer van IP-adressen
-t Tabel om aan te passen
-v Veel uitleg geven (Verbose)
-x Nummers uitbreiden (volledige nummers tonen)
-f Enkel 2e of verdere delen onderzoeken
-V Pakket versie
--line-numbers Geef regelnummering

Allereerst proberen we alle ICMP pakketten te blokkeren (dit als voorbeeld van het gebruik van iptables):

Codevoorbeeld 5.1: Weigeren van ping-pakketten

# iptables -A INPUT -p icmp -j DROP

Eerst definieren we de keten waar dit aan moet toegevoegd worden. Daarna specifieren we het protocol en dan de regel die moet toegevoegd worden. De regel kan ACCEPT, DROP, REJECT, LOG, QUEUE, MASQUERADE, een geladen module of een zelfgedefinieerde keten zijn. In dit geval gebruiken we DROP die alle pakketten die aan de regel voldoen zullen wegsmijten zonder dit mede te delen aan de bronpc die het pakket verstuurt heeft.

Probeer nu ping localhost uit te voeren. Je zal zien dat je geen antwoord zal verkrijgen aangezien de firewall alle ICMP-pakketten weigert die toekomen op de pc. Je zal tevens geen andere pc's kunnen pingen aangezien de ICMP antwoorden ook geweigerd worden. Laten we nu alle regels verwijderen om ICMP weer toe te laten:

Codevoorbeeld 5.2: Flushen van iptables-rules

# iptables -F

Laten we nu eens kijken naar het stateful deel in iptables. Indien we een stateful inspectie van de pakketten wensen die toekomen op eth0 kunnen we dit als volgt uitvoeren:

Codevoorbeeld 5.3: Toelaten van pakketten die al tot een bestaande connectie behoren

# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Dit zal alle pakketten, die tot een al bestaande connectie behoren, of die voldoen aan de INPUT keten, doorlaten. Je kan alle pakketten die niet in de state tabel zitten weigeren door iptables -A INPUT -i eth0 -n state --state INVALID -j DROP uit te voeren juist voor bovenstaande regel. Dit zal ervoor zorgen dat de stateful deel in iptables geactiveerd wordt door de extension state te laden. Indien je een connectie van buitenuit wil toelaten tot je pc kan je --state NEW gebruiken. Iptables bevat nog enkele andere modules voor verschillende doeleinden. Onder deze modules zijn:

Module/Regel Uitleg Uitgebreide opties
mac Afhankelijk van het MAC adres van de binnenkomende pakketten regels opstellen. --mac-source
state Stateful inspectie activeren --state (states zijn ESTABLISH ED,RELATED, INVALID, NEW)
limit Rate matching limiteren --limit, --limit-burst
owner Probeert om verschillende eigenschappen van de pakketmaker te herkennen --uid-owner userid --gid-owner groupip --pid-owner processid --sid-owner sessoinid
unclean Verschillende random controles op pakketten.

Laten we een zelfgedefinieerde keten maken en deze toepassen op een van de bestaande ketens:

Codevoorbeeld 5.4: Aanmaken van een gebruiker-gedefinieerde keten

(Maak een nieuwe keten met 1 regel)
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(Het default beleid is dat alle uitgaande traffiek toegelaten wordt.
Inkomende wordt echter geweigerd.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(Voeg ze toe aan de INPUT keten)
# iptables -A INPUT -j mychain

Door de regel toe te passen op de INPUT keten krijgen we het volgende beleid: alles wordt toegelaten wat uitgaand is, en enkel inkomende pakketten die tot een bestaande connectie behoren worden toegelaten. Dit is eigenlijk algemeen gezien een slecht idee. Een beleid zou eigenlijk alles moeten weigeren en dan expliciet enkele zaken toelaten, maar dit is gewoon een voorbeeld.

Indien je meer informatie wenst, kijk dan naar iptables documentatie (Engels).

Laten we een volledig voorbeeld bekijken. Dit voorbeeld zijn mijn firewall/gateway instellingen:

  • Connecties naar de firewall zijn enkel toegelaten via SSH (poort 22)
  • Het lokale netwerk heeft toegang tot HTTP, HTTPS en SSH (en DNS natuurlijk ook)
  • ICMP traffiek kan teveel informatie bevatten en wordt dus niet toegelaten. Natuurlijk moet er wel een beetje ICMP-traffiek mogelijk zijn.
  • Portscans moeten gedetecteerd en gelogged worden
  • SYN aanvallen dienen vermeden te worden
  • Alle andere traffiek dient geweigerd en gelogged te worden

Codevoorbeeld 5.5: /etc/init.d/firewall

#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#binnenin
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#buiten
OIP=217.157.156.144
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net procparam
}

rules() {
  stop
  ebegin "Setting internal rules"

  einfo "Setting default rule to drop"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #default regel
  einfo "Creating states chain"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
      "Bad packet from ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #ICMP traffiek
  einfo "Creating icmp chain"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
      destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #Inkomende traffiek
  einfo "Creating incoming ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #Flood beveiliging
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
      ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -p tcp --dport ssh -j ACCEPT

  #Uitgaande traffiek
  einfo "Creating outgoing ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT

  einfo "Creating outgoing dns traffic chain"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
      -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
     -j ACCEPT

  einfo "Creating outgoing http/https traffic chain"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT

  #Portscanners tegenhouden
  einfo "Creating portscan detection chain"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
      --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
      5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
      -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
      --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Pas toe en voeg ongeldige states toe aan de ketens
  einfo "Applying chains to INPUT"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -j icmp_allowed
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allowed-connection

  einfo "Applying chains to FORWARD"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -j icmp_allowed
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allowed-connection

  einfo "Applying chains to OUTPUT"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allowed-connection

  # Laat clients toe om via NAT te werken
  $IPTABLES -t nat -A POSTROUTING -o $IINTERFACE -j MASQUERADE
  eend $?
}

start() {
  ebegin "Starting firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} does not exists. Using default rules."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Stopping firewall"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "NAT status"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Setting panic rules"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Saving Firewall rules"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Restoring Firewall rules"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      will restore setting if exists else force rules"
  echo "stop)       delete all rules and set all to accept"
  echo "rules)      force settings of new rules"
  echo "save)       will store settings in ${FIREWALL}"
  echo "restore)    will restore settings from ${FIREWALL}"
  echo "showstatus) Shows the status"
}

Nota: Ik gebruik \ in sommige regels voor betere leesbaarheid. Het is misschien een goed idee om de regels samen te voegen in de werkelijke configuratie.

Gratis advies voor het aanmaken van firewalls:

  1. Maak je firewallsbeleid alvorens je die implementeert.
  2. Hou het simpel
  3. Weet hoe het protocol werkt (lees de RFCs)
  4. Hou in gedachten dat een firewall gewoon een stuk software is dat als root draait.
  5. Test je firewall

Indien je denkt dat iptables moeilijk te verstaan is, of veel tijd inneemt om op te stellen, maak dan gebruik van Shorewall. Dit is een front-end van iptables.

12.f. Squid

quid is een zeer sterke proxyserver en kan traffiek filteren en weigeren gebaseerd op: tijd, reguliere expressies van paden/uri's, bron en doeladressen, domeinen, browser, geidentificeerde gebruiker, mime-type, poort (protocol). En waarschijnlijk heb ik nog enkele features vergeten, maar squid is dan ook enorm uitgebreid.

In het volgende voorbeeld heb ik een bannerfilter geplaatst in plaats van een filter die gebaseerd is op pornosites. De reden hiertoe is dat Gentoo.org niet als pornosite mag gezien worden. En ik wil tevens mijn tijd niet verdoen om enkele goede pornosites voor jou op te zoeken :)

In bovenstaand geval:

  • Surfen (HTTP/HTTPS) wordt toegelaten tijdens werkuren (maandag tot vrijdag van 08 tot 17, en zaterdag van 08 tot 13 uur). Als ze hier extra lang blijven moeten ze werken. Niet surfen.
  • Downloaden is niet toegestaan (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg etc...)
  • We haten banners dus filteren we die uit en vervangen we ze met een transparante gif (hier kan je nog wel leukere zaken bedenken :)
  • Elke andere connectie van en naar het internet wordt niet toegestaan

Dit wordt in 4 gemakkelijke stappen geimplementeerd:

Codevoorbeeld 6.1: /etc/squid/squid.conf

# Binden aan een ip en poort
http_port 10.0.2.1:3128

# Default configuratie
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

# ACLs toevoegen
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255

# Wie deze proxyserver kan gebruiken
acl localnet src 10.0.0.0/255.255.0.0

# Welke poorten er toegelaten zijn
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE

# ACL gebaseerd op regexps
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"

# ACL gebaseerd op tijden/datums
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00

acl CONNECT method CONNECT

#Beheer enkel via localhost
http_access allow manager localhost
http_access deny manager

#Purge aanvragen enkel via localhost
http_access allow purge localhost
http_access deny purge

# Onbekende poorten weigeren
http_access deny !Safe_ports

# Alle poorten behalve SSL moeten niet naartoe geconnecteerd worden
http_access deny CONNECT !SSL_ports

# En nog wat enkele persoonlijke regels...

# Pagina bij banner 
deny_info NOTE_ADS_FILTERED url_ads

# En die bannerurl's dan verwijderen
http_access deny url_ads

# Alle archieven weigeren
http_access deny archives

# Enkel toegang tijdens werkuren
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends

# Al de rest weigeren
http_access deny all

Vul nu de lijst in met bestanden die de gebruikers niet mogen downloaden. Ik heb zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz and z toegevoegt.

Codevoorbeeld 6.2: /etc/squid/files.acl

\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$

Nota: Merk op dat tussen [] er telkens een hoofdletter en een kleine letter voorkomt. Dit is omdat men anders wel .AVI bestanden kan downloaden maar geen .avi...

Hierna voegen we enkele reguliere expressies toe om banners te identificeren. Je bent zelf waarschijnlijk iets creatiever dan ik hier:

Codevoorbeeld 6.3: /etc/squid/banner-ads.acl

/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif

En het laatste deel. We willen dat dit bestand getoond wordt wanneer er een banner verwijderd is. Het is niet meer dan een stukje HTML-code die een transparante 4x4 gif toont.

Codevoorbeeld 6.4: /etc/squid/errors/NOTE_ADS_FILTERED

<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif">
<TITLE>ERROR: The requested URL could not be retrieved</TITLE>
</HEAD>
<BODY>
<H1>Add filtered!</H1>

Nota: Sluit de <HTML> en <BODY> tags niet. Dit wordt vanzelf gedaan door squid.

Zoals je kan zien, squid heeft veel mogelijkheden en is heel efficient om te filteren en om als proxy ingesteld te worden. Je kunt squid zelfs alternatief gebruiken om grote netwerken te verkleinen. De configuratie die ik heb hier heb opgegeven is heel geschikt voor een klein netwerk van 1-20 gebruikers.

Maar om een packet filter (iptables) en een apcliation gateway (Squid) combineren is de beste oplossing, zelfs als Squid ergens veilig is weggestoken en niemand aan kan van buitenaf. We moeten nog altijd bereid zijn tot aanvallen van binnenaf.

Configureer nu je client browsers om de proxy server te gebruiken. De gateway zal elk contact met buitenaf weigeren tenzij ze die gebruiken.

Nota: In Mozilla kun je dit doen in Edit->Preferences->Advanced->Proxies.

Het kan ook zodanig ingesteld zijn dat je proxy als transparant wordt ingesteld : dit wil zeggen dat hij autmatisch het trafiek door de proxy stuurd.

Codevoorbeeld 6.5: Portforwarding toestaan in onze proxyserver

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128

Nota: Als de proxy aan het werken is op de packet filter; (dit is niet aangeraden), Kan dit noodzakelijk zijn dat u genoeg reserve computers hebt (gebruik REDIRECT doel in de plaats van DNAT; REDIRECT stuurt de pakketten naar de localhost).

12.g. Geleerde lessen

We hebben geleerd dat;

  1. Een firewall hebben ook riskant kan zijn voor jezelf. Een slecht geconfigureerde firewall is slechter dan geen hebben.
  2. Hoe je een basis-opstelling maakt voor een gateway en een transparante proxy
  3. De sleutel tot een goede firewall is een protocols kennen die je wilt toestaan.
  4. Dat IP verkeer niet altijd legale data bevat; bvb ICMP pakketten, wat een That IP traffic does not always contain legitimate data, e.g. ICMP packets, die een kwaadwillige inhoud kan bevatten.
  5. Hoe je een SYN aanval kan voorkomen.
  6. Filteren van HTTP trafiek door het verwijderen van afbeeldingen, downlaods en/of virussen
  7. Packet filters and application gateways combineren verstrekken een betere controle.

Nu, als je echt nood hebt, creeer een firewall die you noden toekomen.


[ << ] [ < ] [ Home ] [ > ] [ >> ]


Print

View all

Upgedate op 16 oktober 2005

De originele versie van dit document was laatst geupdate om 2 april 2010

Korte inhoud: Filter je pakketten.

Kim Nielsen
Author

John P. Davis
Editor

Eric R. Stockbridge
Editor

Carl Anderson
Editor

Jorge Paulo
Editor

Sven Vermeulen
Editor

Benny Chuang
Editor

Sune Jeppesen
Editor

Tiemo Kieft
Editor

Zack Gilburd
Editor

Dan Margolis
Editor

Dimitry Bradt
Translator

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.