[ << ]
[ < ]
[ 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:
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:
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 |
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
# 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:
- Maak je firewallsbeleid alvorens je die implementeert.
- Hou het simpel
-
Weet hoe het protocol werkt (lees de RFCs)
-
Hou in gedachten dat een firewall gewoon een stuk software is dat als root
draait.
- 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;
-
Een firewall hebben ook riskant kan zijn voor jezelf. Een slecht
geconfigureerde firewall is slechter dan geen hebben.
-
Hoe je een basis-opstelling maakt voor een gateway en een transparante
proxy
-
De sleutel tot een goede firewall is een protocols kennen die je wilt
toestaan.
-
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.
- Hoe je een SYN aanval kan voorkomen.
-
Filteren van HTTP trafiek door het verwijderen van afbeeldingen, downlaods
en/of virussen
-
Packet filters and application gateways combineren verstrekken een betere
controle.
Nu, als je echt nood hebt, creeer een firewall die you noden toekomen.
[ << ]
[ < ]
[ Home ]
[ > ]
[ >> ]
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|