[ << ]
[ < ]
[ Acasă ]
[ > ]
[ >> ]
12. Sisteme Firewall
Conţinut:
12.a. Un sistem firewall
Oamenii se gândesc adesea că un sistem firewall oferă secutatea fundamentală,
dar se înşeală. În cele mai multe cazuri, un sistem firewall configurat
incorect oferă mai puţină securitate decât în cazul în care nu ar exista deloc.
Un sistem firewall este tot o aplicaţie şi ar trebui să fie tratată ca orice
altă aplicaţie, pentru că, cel mai probabil, conţine erori.
Deci, gândiţi-vă înainte de a implementa un sistem firewall! Chiar aveţi nevoie
de unul? Dacă dvs. consideraţi că aveţi nevoie, scrieţi o politică de
securitate despre cum funcţionează, ce tip de sistem firewall este şi cine ar
trebui să opereze cu acesta. Dar, mai întâi, consultaţi acest ghid.
Sistemele firewall sunt utilizate pentru două scopuri:
- Pentru a ţine utilizatorii (viermii/atacatorii) în afară
- Pentru a ţine utilizatorii (angajaţii/copiii) în înterior
În fapt, sunt trei tipuri de sisteme firewall:
- Filtrare de pachete
- Retransmitere în circuit
- Sisteme gateway la nivelul aplicaţie
Un sistem firewall trebuie să fie o maşină dedicată ce nu rulează nici un
serviciu (sau sshd, ca fiind singurul) şi securizat în modul recomandat
în acest ghid.
12.b. Filtrarea de pachete
Tot traficul de reţea este transmis sub formă de pachete. Cantităţi însemnate
de trafic sunt împărţite în pachete mici pentru o manipulare mai uşoară şi apoi
reasamblate în momentul sosirii la destinaţie. În antet, fiecare pachet conţine
informaţii despre cum şi unde ar trebui să fie distribuit. Iar această
informaţie este exact ceea ce utilizează un sistem firewall de filtrare de
pachete. Filtrarea este bazată pe:
- Permiterea sau interzicerea pachetelor pe baza adresei IP a sursei/destinaţiei
- Permiterea sau interzicerea pachetelor pe baza portului sursei/destinaţiei
- Permiterea sau interzicerea pachetelor pe baza protocolului
- Permiterea sau interzicerea pachetelor pe baza unor opţiuni specifice unui anume protocol
Cu alte cuvinte, această filtrare este bazată pe toate datele conţinute în
antetul unui pachet şi nu pe baza conţinutului.
Slăbiciuni:
-
Informaţia adresei dintr-un pachet poate fi o adresă IP eronată (sau, cum se
spune, falsă - eng. spoofed - de la trasmiţător)
-
Datele sau cererile dintr-un pachet permis pot conţine date nedorite pe care
un atacator le poate utiliza pentru a exploata erori cunoscute din serviciile
din spatele sistemului firewall
- De obicei, poate afecta tot sistemul
Avantaje:
- Simplu şi uşor de implementat
-
Poate afişa avertismente despre unele posibile atacuri înainte de a se
întâmpla (spre ex. prin detectarea scanărilor de porturi)
- Bun în oprirea atacurilor SYN
Exemple de fitre de pachete gratuite pentru Linux:
Notă:
Este recomandat să utilizaţi iptables. Ipchains este învechit.
|
12.c. Retransmiterea în cicuit
Un gateway la nivelul circuitului este un sistem firewall ce validează
conexiunile înainte de a permite schibul de date. Aceasta înseamnă că pur şi
simplu nu permite sau interzice pachete pe baza antetului pachetului, ci
determină dacă conexiunea între cele două capete este validă, în conformitate
cu reguli configurabile, înainte de a deschide o sesiune şi a permite datelor
să fie interchimbate. Filtrarea este bazată pe:
- Adresa IP a sursei/destinaţiei
- Portul sursei/destinaţiei
- O perioadă de timp
- Protocol
- Utilizator
- Parolă
Tot traficul este validat şi monitorizat, iar traficul nedorit este oprit.
Slăbiciuni:
-
Operează în nivelul de Transport şi poate necesita modificări substanţiale
programelor ce oferă în mod normal funcţii de transport.
12.d. Sisteme gateway la nivelul aplicaţie
Sistemul gateway la nivelul aplicaţie este un proxy pentru aplicaţii,
interschimbând datele cu sistemele la distanţă cu voia clienţilor. Este
protejat de public în mod securizat în spatele unei structuri DMZ
(De-Militarized Zone - Zonă De-Militarizată: partea dintr-o reţea privată care
este vizibilă printr-un sistem firewall) sau unui sistem firewall ce nu permite
nici o conexiune din exterior. Filtrarea se bazează pe:
- Permiterea sau interzicerea pe baza adresei IP a sursei/destinaţiei
- Pe baza conţinului pachetului
- Limitarea accesului la fişiere pe baza tipului fişierului sau extensiei acestuia
Avantaje:
- Poate reţine în memoria cache fişierele, mărind performanţele reţelei
- Înregistrarea detaliată în jurnal a tuturor conexiunilor
- Este foarte scalabil (unele aplicaţii proxy pot "partaja" datele reţinute în memoria cache)
- Nu există acces direct către exterior
- Se poate chiar modifica conţinutul pachetului în timpul procesării
Slăbiciuni:
- Configurarea este complexă
Sistemele gateway la nivelul aplicaţie sunt considerate a fi cele mai sigure
soluţii deoarece nu trebuie să ruleze ca root şi sistemele gazdă din spatele
acestora nu sunt accesibile din internet.
Exemplu de sistem gateway la nivelul aplicaţie, gratuit:
12.e. Iptables
Pentru a putea utiliza iptables, trebuie să îl aveţi activat în kernel. Eu
am adăugat iptables ca module (comanda iptables le va încărca în
funcţie de necesitate) şi mi-am recompilat kernel-ul (dar poate aţi dori
să compilaţi iptables, dacă intenţionaţi să dezactivaţi Loadable
Kernel Modules, aşa cum am amintit anterior). Pentru mai multe informaţii
despre configurarea kernel-ului pentru iptables, vizitaţi Tutorial
Iptables, Capitolul 2: Prepararări. După ce aţi compilat noul kernel
(sau în timp ce compilaţi kernel-ul), trebuie să adăugaţi comanda
iptables. Rulaţi doar emerge iptables, şi ar trebui să
funcţioneze.
Acum, testaţi dacă funcţionează, rulând iptables -L. Dacă ceva
returnează eroare, atunci există o neregulă şi va trebui să verificaţi încă o
dată configuraţia.
Iptables este noul şi mult îmbunătăţitul filtru de pachete din versiunea de
kernel 2.4.x. Este succesorul filtrului de pachete anterior din versiunea de
kernel Linux 2.2.x. Una din îmbunătăţirile majore este faptul că iptables poate
efectua o filtrare dinamică, în funcţie de stare, pentru pachete. În cazul
filtrării de pachete dinamice, este posibilă păstrarea stărilor conexiunii TCP.
O conexiune TCP constă într-o serie de pachete ce conţin informaţii despre
adresa IP a sursei, adresa IP a destinaţiei, portul sursă şi un număr al
secvenţei, pentru ca pachetele să poată fi reasamblate în momentul pierderii
datelor. TCP este un protocol orientat pe conexiune, în contrast cu UDP care nu
depinde de conexiune.
Prin examinarea antetului unui pachet TCP, un filtru de pachete dinamic poate
determina dacă un pachet recepţionat face parte dintr-o conexiune deja
stabilită sau nu şi decide dacă să accepte sau să refuze pachetul.
Cu ajutorul unui filtru de pachete static, care nu determină starea conexiunii,
este posibil să se înşele acest fitru în a accepta pachete ce ar trebui să fie
refuzate, prin manipularea anteturilor TCP ale pachetelor. Aceasta se poate
efectua prin manipularea indicatorului SYN sau a altor indicatori din antetul
TCP pentru a determina un pachet cu caracter maliţios să apară ca fiind parte a
unei conexiuni deja stabilite (deoarece filtrul de pachete însuşi nu poate
determina starea conexiunii). Cu ajutorul filtrării dinamice de pachete, este
posibil refuzul acestor pachete, deoarece nu sunt parte a unei conexiuni deja
stabilite. Aceasta va opri, de asemenea, posibilitatea "scanărilor ascunse", un
tip de scanare a porturilor în care aplicaţia scanner trimite pachete cu
indicatori ce este foarte probabil să nu fie reperaţi şi înregistraţi în jurnal
de sistemul firewall decât pachetele normale SYN.
Iptables oferă mai multe funcţionalităţi precum NAT (Network Address
Translation - Translatarea Adresei de Reţea) şi limitarea ratelor de
transmisie. Limitarea ratelor de transmisie este foarte utilă în momentul
prevenirii unui anumit atac DoS (Denial of Service), precum transmiterea masivă
de pachete SYN.
O conexiune TCP este stabilită de un aşa-numit salut în trei paşi. În momentul
stabilirii unei conexiuni TCP, clientul transmite un pachet părţii server, cu
indicatorul SYN activat. Când partea server recepţionează pachetul SYN, acesta
răspunde înapoi cu un pachet SYN+ACK, clientului. Când pachetul SYN+ACK este
recepţionat de client, acest răspunde cu un al treilea pachet ACK, confirmând
conexiunea.
Un atac de tip SYN flood este efectuat prin trimiterea pachetului SYN, dar
nerăspunzând cu pachetul SYN+ACK. Clientul poate modifica un pachet cu o adresă
IP sursă falsă, pentru că nu are nevoie de răspuns. Sistemul server va adăuga o
intrare într-o coadă a conexiunilor pe-jumătate deschise când recepţionează
pachetul SYN şi va aştepta pachetul final ACK înainte de a şterge intrarea din
coadă. Coada de aşteptare are un număr limitat de intrări, şi dacă toate
intrările sunt ocupate nu mai poate deschide alte conexiuni. Dacă un pachet ACK
nu este recepţionat înainte de un timp de aşteptare, intrarea este ştearsă
automat din coadă. Timpii de aşteptare variază, de obicei, între 30-60 secunde
sau chiar mai mult. Clientul iniţiază atacul prin falsificarea multor pachet
SYN cu adrese IP sursă diferite şi le transmite către o adresă IP ţintă cât mai
repede posibil, astfel determinând umplerea cozii de conexiuni pe-jumătate
deschise şi astfel, prevenind ca alţi clienţi să stabilească o conexiune
legitimă cu server-ul.
Aici intervine limitarea ratei de transmisie la îndemână. Este posibil să
limităm rata de transmisie a pachetelor SYN acceptate prin utilizarea -m
limit --limit 1/s. Aceasta va limita numărul de pachete SYN acceptate la
unul pe secundă, astfel restrictionând transmiterea masivă de pachete SYN
resurselor noastre.
Notă:
Altă opţiune în prevenirea atacurilor SYN sunt cookie-urile SYN, ce permit sistemului
să răspundă cu pachete SYN fără a umple spaţiul cozii de conexiuni.
Cookie-urile SYN pot fi activate în configuraţia kernel-ului Linux, dar sunt la
nivel experimental în acest moment.
|
Acum, câte ceva practic!
Când iptables este încărcat în kernel, el deschide 5 legături unde vă puteţi
plasa regulile. Aceastea sunt denumite INPUT, OUTPUT,
FORWARD, PREROUTING şi POSTROUTING. Fiecare din acestea
este denumit lanţ şi conţine o listă de reguli. Fiecare regulă specifică faptul
că, dacă antetul unui pachet are un conţinut, atunci iată ce se face cu
pachetul. Dacă regula nu se potriveşte pachetului, următoarea regulă din lanţ
este analizată.
Vă puteţi plasa regulile direct în cele 5 lanţuri, sau să creati noi lanţuri şi
să le adăugaţi ca regulă într-un lanţ deja existent. Iptables suportă
următoarele opţiuni.
| Opţiune: |
Descriere: |
| -A |
Adăugare |
| -D |
Ştergere |
| -I |
Introducere |
| -R |
Înlocuire |
| -L |
Afişare |
| -F |
Ştergerea tuturor regulilor din lanţ sau toate lanţurile |
| -Z |
Reporneşte de la zero numărătoarele din lanţ sau din toate lanţurile |
| -C |
Testarea pachetului în lanţ |
| -N |
Crearea unui lanţ nou, definit de utilizator |
| -X |
Ştergerea unui lanţ definit de utilizator |
| -P |
Modificarea politicii lanţului la o ţintă |
| -E |
Modificarea numelui lanţului |
| -p |
Protocol |
| -s |
Adresa/masca sursă |
| -d |
Adresa/masca destinaţie |
| -i |
Numele intrării (numele ethernet) |
| -o |
Numele ieşirii (numele ethernet) |
| -j |
Jump (ţinta pentru regulă) |
| -m |
Potrivire extinsă (este posibilă utilizarea extensiilor) |
| -n |
Afişarea numerică a adreselor şi porturilor |
| -t |
Tabela de manipulat |
| -v |
Modul informativ |
| -x |
Extinderea numerelor (afişarea valorilor exacte) |
| -f |
Potrivirea doar a fragmentului următor sau a celor ce urmează |
| -V |
Versiunea pachetului |
| --line-numbers |
Afişează numărul de linii pe ecran |
Mai întâi, vom încerca să blocăm toate pachetele ICMP destinate maşinii
noastre, doar pentru a ne familiariza cu iptables.
Cod 5.1: Blocarea tuturor pachetelor ICMP |
# iptables -A INPUT -p icmp -j DROP
|
Mai întâi specificăm lanţul în care regula noastră ar trebui să fie adăugată,
apoi protocolul pachetelor ce trebuie înregistrate şi, în final, ţinta. Ţinta
poate fi numele unui lanţ specificat sau una din ţintele noastre speciale
ACCEPT, DROP, REJECT, LOG, QUEUE sau
MASQUERADE. În acest caz, utilizăm DROP, ce va refuza pachetul
fără a-i răspunde clientului.
Notă:
Ţinta LOG este, ceea ce se numeşte, "ne-terminală". Dacă un pachet se
potriveşte unei reguli cu ţinta LOG, în loc să se oprească evaluarea,
pachetul va continua să fie supus următoarelor reguli. Aceasta vă permite să
înregistraţi în jurnal pachetele şi aceasta să fie procesate normal.
|
Acum, încercaţi ping localhost. Nu veţi primi nici un răspuns, deoarece
iptables va refuza toate pachetele ICMP venite. De asemenea, nu veţi putea
transmite ping altor maşini, deoarece pachetul de răspuns ICMP va fi refuzat,
din nou. Acum, ştergeţi lanţul pentru avea fluxul ICMP din nou funcţional.
Cod 5.2: Ştergerea tuturor regulilor |
# iptables -F
|
Acum, să analizăm filtrarea dinamică de pachete din iptables. Dacă am fi dorit
să activăm inspecţia dinamică a pachetelor ce sosesc pe interfaţa eth0, am fi
rulat comanda:
Cod 5.3: Acceptarea pachetelor originare dintr-o conexiune deja stabilită |
# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
|
Aceasta va accepta orice pachet dintr-o conexiune deja stabilită sau în relaţie
cu lanţul INPUT. De asemenea, aţi putea să ştergeţi orice pachet ce nu este în
tabela de stări prin execuţia comenzii iptables -A INPUT -i eth0 -m state
--state INVALID -j DROP chiar înaintea comenzii anterioare. Aceasta
activează filtrarea de pachete dinamică în iptables, prin încărcarea extensiei
"state". Dacă aţi fi dorit ca alţi utilizatori să se conecteze la maşina dvs.,
aţi fi putut utiliza indicatorul --state NEW. Iptables conţine unele
module pentru scopuri diferite. Unele dintre acestea sunt:
| Modul/Potrivire |
Descriere |
Opţiuni extinse |
| mac |
Încarcă extensia pentru adresa mac a pachetelor ce sosesc. |
--mac-source |
| state |
Activează inspecţia dinamică |
--state (stările sunt ESTABLISHED ,RELATED, INVALID, NEW) |
| limit |
Limitarea ratei de transmisie |
--limit, --limit-burst |
| owner |
Încearcă să potrivească unele caracteristici ale creatorului pachetului |
--uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner
sessionid
|
| unclean |
Unele verificări aleatoare în plus pentru pachete |
|
Să încercăm să creăm un lanţ definit de utilizator şi să îl aplicăm unui lanţ
deja existent:
Cod 5.4: Crearea unui lanţ definit de utilizator |
# 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
|
Prin aplicarea regulii lanţului de intrare, obţinem politica: toate pachetele
spre exterior sunt permise şi toate pachetele spre interior sunt oprite.
Se poate găsi documentaţie pe pagina de documentaţie
Netfilter/iptables.
Să vedem un exemplu complet. În acest caz, politica sistemului firewall/gateway
afirmă:
- Conexiunile spre sistemul firewall sunt permise doar prin SSH (portul 22)
-
Reţeaua locală ar trebui să aibă acces la HTTP, HTTPS şi SSH (DNS at trebui,
de asemenea, permis)
-
Traficul ICMP poate conţine informaţii nenecesare şi nu ar trebui să fie
acceptat. Bineînţeles, trebuie să permitem o parte din traficul ICMP.
- Scanările de porturi ar trebui detectate şi înregistrate
- Atacurile SYN ar trebui ocolite
- Tot restul traficului ar trebui să fie oprit şi înregistrat
Cod 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
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1
opts="${opts} showstatus panic save restore showoptions rules"
depend() {
need net
}
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 rule
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 traffic
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
#Incoming traffic
einfo "Creating incoming ssh traffic chain"
$IPTABLES -N allow-ssh-traffic-in
$IPTABLES -F allow-ssh-traffic-in
#Flood protection
$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 -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT
#outgoing traffic
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
#Catch portscanners
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
# Apply and add invalid states to the chains
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
#Allow client to route through via NAT (Network Address Translation)
$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"
}
|
Unele sfaturi la crearea unui sistem firewall:
- Creaţi politica sistemul dvs. firewall înainte de a-l implementa
- Păstraţi-l simplu
-
Să ştiţi cum funcţionează fiecare protocol (citiţi documentele RFC(Request For Comments) relevante)
-
Amintiţi-vă că sistemul firewall este doar o aplicaţie care rulează ca root.
- Testaţi-vă sistemul dvs. firewall
În cazul în care consideraţi că iptables este greu de înţeles sau ia mult timp
pentru a-l înţelege ori ia mult timp pentru a seta un sistem firewall decent,
puteţi utiliza Shorewall. În
principiu acesta utilizează iptables pentru a genera reguli firewall, dar se
concentrează pe reguli şi nu pe anumite protocoale.
12.f. Squid
Squid este o aplicaţie server proxy foarte puternică. Poate filtra traficul pe
baza timpului, expresiilor regulate aplicate căilor/componentelor URI,
adreselor IP ale sursei şi destinaţiei, domeniului, aplicaţiei browser,
autentificării utilizatorului, tipului componentei MIME şi numărului portului
(protocol). Probabil că am uitat unele funcţionalităţi, dar poate fi greu să
acoperim întreaga listă aici.
În următorul exemplu am adăugat un filtru pentru spaţii publicitare, în locul
unui filtru pentru site-urile porno. Motivul pentru aceasta este că Gentoo.org
nu trebuie să fie afişat ca un site porno. Şi nu vreau să-mi pierd
timpul încercând să găsesc unele site-uri bune pentru dvs.
În acest caz, politica mea afirmă:
-
Navigarea (HTTP/HTTPS) este permisă în timpul orelor de lucru (luni-vineri
8-17 şi sâmbătă 8-13), dar dacă angajaţii rămân până târziu, ar trebui să
muncească nu să navigheze
-
Descărcarea fişierelor nu este permisă (.exe, .com, .arj, .zip, .asf, .avi,
.mpg, .mpeg, etc)
-
Nu agreem spaţiile publicitare, deci acestea sunt filtrate şi înlocuite cu o
imagine gif transparentă (aici intervine creativitate dvs.!).
-
Toate celelalte conexiuni spre şi din Internet sunt interzise.
Aceasta se implementează în 4 paşi simpli.
Cod 6.1: /etc/squid/squid.conf |
# Ascultă pe o adresă ip şi un port
http_port 10.0.2.1:3128
# Configuraţia standard
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# Adăugarea unor liste de control al accesului de bază
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
# Adăugarea celor care pot accesa server-ul proxy
acl localnet src 10.0.0.0/255.255.0.0
# Şi a porturilor
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE
# Adăugarea unei liste de control al accesului pe baza unor expresii
# regulate pentru componentele url
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"
# Adăugarea unor liste de control al accesului pe baza orei şi zilei
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00
acl CONNECT method CONNECT
# permite accesul managerului de pe localhost
http_access allow manager localhost
http_access deny manager
# Permite cererile de curăţare de la localhost
http_access allow purge localhost
http_access deny purge
# Interzice cererile pentru porturile necunoscute
http_access deny !Safe_ports
# Interzice CONNECT pe alte porturi decât cele SSL
http_access deny CONNECT !SSL_ports
# Regulile mele proprii
# Adăugaţi o pagină pentru a fi afişată
# când un spaţiu publicitar este îndepărtat
deny_info NOTE_ADS_FILTERED url_ads
# Apoi interziceţi-le
http_access deny url_ads
# Interziceţi toate arhivele
http_access deny archives
# Restricţionaţi accesul doar la orele de lucru
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends
# Interziceţi restul
http_access deny all
|
Urmează completarea fişierelor ce nu dorim să fie descărcate de utilizatorii
dvs. Am adăugat fişierele zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg,
au, ra, arj, tar, gz şi z.
Cod 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]$
|
Notă:
Vă rugăm să notaţi parantezele [] ce conţin majuscule şi minuscule pentru
fiecare caracter. Aceasta se introduce pentru ca nimeni să nu păcălească
filtrul prin accesarea unui fişier denumit AvI în loc de avi.
|
Urmează adăugarea expresiilor regulate pentru identificarea spaţiilor
publicitare. Probabil, dvs. veţi fi mult mai creativi decât mine:
Cod 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
|
Şi ultima parte constă în afişarea următorului fişier în momentul în care un
spaţiu publicitar este îndepărtat. Practic, este o jumătate de fişier html cu o
imagine gif transparentă de dimensiunea 4x4.
Cod 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>
|
Notă:
Nu închideţi tag-urile <HTML> şi <BODY>. Această operaţie va fi
efectuată de squid.
|
După cum puteţi observa, Squid are multe posibilităţi şi este foarte eficient,
atât la filtrare cât şi la nivelul proxy. Puteţi chiar să utilizaţi şi alte
aplicaţii proxy Squid pentru scalarea în reţele foarte mari. Configuraţi
exemplificată aici este potrivită mai degrabă pentru o reţea mică ce conţine
1-20 utilizatori.
Dar, combinarea filtrului de pachete (iptables) şi sistemul gateway de la
nivelul aplicaţie (Squid) este, probabil, cea mai bună soluţie, chiar dacă
Squid se află într-o locaţie sigură şi nimeni nu îl poate accesa din exterior.
Încă trebuie să fim atenţi la atacurile din interior.
Acum, trebuie să configuraţi aplicaţiile browser ale clienţilor pentru
utilizarea aplicaţiei server proxy. Sistemul gateway va preveni utilizatorii să
aibă orice contact cu exteriorul, decât dacă utilizează sistemul proxy.
Notă:
În Mozilla, acesta se setează în Edit->Preferences->Advanced->Proxies.
|
Operaţia mai poate fi făcută transparent, prin utilizarea iptables să transmită
mai departe tot traficul spre exterior spre aplicaţia proxy, Squid. Aceasta se
poate face prin adăugarea unei reguli de transmitere mai departe/prerutare în
sistemul gateway:
Cod 6.5: Activarea retransmiterii portului spre aplicaţia noastră proxy |
# 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
|
Notă:
Dacă aplicaţia proxy rulează pe un sistem de filtrare de pachete -- deşi nu este
recomandat, dar poate fi necesar în cazul în care nu aveţi maşini suficiente --
utilizaţi ţinta REDIRECT în locul DNAT (REDIRECT
redirectează pachetele la localhost).
|
12.g. Lecţii învăţate
Am învăţat că:
-
Un sistem firewall poate reprezenta un risc. Un sistem firewall configurat
incorect este mai rău decât a nu avea nici unul.
- Cum să setăm un sistem gateway de bază şi un sistem proxy transparent.
-
Cheia unui sistem firewall bun este să cunoaşteţi protocoalele pe care doriţi
să le permiteţi.
-
Traficul IP nu conţine întotdeauna date legitime, de ex. pachetele ICMP care
pot avea un conţinut cu caracter maliţios.
- Cum să prevenim atacurile SYN.
-
Filtrarea traficului HTTP, prin îndepărtarea imaginilor ofensive şi
descărcarea de viruşi.
-
Combinarea filtrării pachetelor şi a sistemelor gateway, oferă un control mai
bun.
Acum, dacă chiar doriţi, mergeţi şi creaţi un sistem firewall ce se
potriveşte nevoilor dvs.
[ << ]
[ < ]
[ Acasă ]
[ > ]
[ >> ]
Conţinutul acestui document este publicat sub licenţa Creative Commons -
Attribution / Share Alike.
|
|