Gentoo Logo

[ << ] [ < ] [ 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

(Creaţi un nou lanţ cu o singură regulă)
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(Politica implicită pentru traficul spre exterior este permisivă. Traficul spre interior este interzis.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(Şi adăugarea in lanţul INPUT)
# 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:

  1. Creaţi politica sistemul dvs. firewall înainte de a-l implementa
  2. Păstraţi-l simplu
  3. Să ştiţi cum funcţionează fiecare protocol (citiţi documentele RFC(Request For Comments) relevante)
  4. Amintiţi-vă că sistemul firewall este doar o aplicaţie care rulează ca root.
  5. 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ă:

  1. Un sistem firewall poate reprezenta un risc. Un sistem firewall configurat incorect este mai rău decât a nu avea nici unul.
  2. Cum să setăm un sistem gateway de bază şi un sistem proxy transparent.
  3. Cheia unui sistem firewall bun este să cunoaşteţi protocoalele pe care doriţi să le permiteţi.
  4. Traficul IP nu conţine întotdeauna date legitime, de ex. pachetele ICMP care pot avea un conţinut cu caracter maliţios.
  5. Cum să prevenim atacurile SYN.
  6. Filtrarea traficului HTTP, prin îndepărtarea imaginilor ofensive şi descărcarea de viruşi.
  7. 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ă ] [ > ] [ >> ]


Imprimare

View all

Actualizat la 16 Octombrie 2005

Versiunea originală a acestui document a fost actualizată ultima dată la 2 Aprilie 2010

Sumar: Filtraţi-vă pachetele.

Kim Nielsen
Autor

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

Laurenţiu Crăciun
Translator iniţial

Alin Dobre
Translator

Donate to support our development efforts.

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