Ai un server Ubuntu (sau Debian) si vrei sa ii configurezi firewall-ul. Configuratia default pe care vom lucra este urmatoarea:
root@ubuntu-server:~# netstat -antl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
Dupa cum se vede avem un server mysql care va trebui sa fie folosit doar local, un server exim4 care si el va fi tot local, iar serverele ssh si apache vor trebui sa fie disponibile public. De asemenea acesta este un server "de productie" si nu are si rol de router in acelasi timp.
Intai vom opri tot:
root@ubuntu-server:~# iptables -P INPUT DROP
root@ubuntu-server:~# iptables -P OUTPUT DROP
root@ubuntu-server:~# iptables -P FORWARD DROP
root@ubuntu-server:~# iptables -F
root@ubuntu-server:~# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
Dupa cum se vede tot traficul este in acest moment blocat. Evident daca sunteti conectat remote (e.g. prin ssh, miscarea de mai sus este kamikaze)
Apoi permitem serviciilor necesare sa poata comunica. Ca un "best practice" pe care l-am remarcat, regulile se pun cam intotdeauna preferential pe INPUT. Ideea e ca un eventual atacator sa nu trimita pachete pe care aplicatia noastra sa le proceseze - chiar daca raspunsul ei ar fi oprit - ci ele sa fie oprite direct la nivelul kernelului. Asta ne salveaza macar de niste timp de procesor inutil folosit.
root@ubuntu-server:~# iptables -A INPUT -j ACCEPT -p tcp --dport 80
root@ubuntu-server:~# iptables -A INPUT -j ACCEPT -p tcp --dport 22
root@ubuntu-server:~# iptables -A INPUT -j ACCEPT -p tcp --dport 25 -s 127.0.0.1
root@ubuntu-server:~# iptables -A INPUT -j ACCEPT -p tcp --dport 3306 -s 127.0.0.1
root@ubuntu-server:~# iptables -P OUTPUT ACCEPT
root@ubuntu-server:~# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:25
ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Acum fiecare isi mai poate modifica firewall-ul in functie de cerintele de securitate si preferintele de securitate dorite - de exemplu desi eu nu am adaugat nici o regula pentru OUTPUT, unii dintre dumneavoastra se pot gandi sa adauge. Urmatorul pas ramane de a configura aceste reguli de fiecare data cand sistemul booteaza. Aparent in viziunea unora editarea /etc/rc.local poate fi suficienta intrucat acesta este ultimul script care va fi lansat de catre sistemul de operare atunci cand booteaza. Totusi aceasta abordare nu este suficienta intrucat serviciul de networking (reteaua fizica) impreuna cu serverele noastre apache, mysql, exim4 si sshd sunt deja pornite la momentul cand rc.local este executat, insemnand ca a fost un timp de cateva secunde cand nu a existat un firewall sa ne protejeze aplicatiile.
Astfel, cel mai bun moment de a seta firewall-ul, ramane inainte sau imediat dupa ce placile de retea fizic sunt configurate, dar inainte ca orice alt serviciu de retea sa fi fost pornit.
Dupa cum citim in manual (man 5 interfaces) putem sa lansam un script inainte sau dupa ce o interfata de retea este activata sau oprita. Vom folosi acest mecanism.
Intai vom salva regulile firewall curente intr-un fisier, fie acesta /etc/iptables_rules.conf
root@ubuntu-server:~# iptables-save > /etc/iptables_rules.conf
Apoi vom edita fisierul /etc/network/interfaces si vom incarca regulile din firewall imediat inainte de activarea interfetei.
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore /etc/iptables_rules.conf # linia adaugata de noi.
Gata!