1. Tallafocs amb IP Tables (I)

De Lordwektabyte Wiki
Salta a la navegació Salta a la cerca

Contingut

Enunciat

https://gitlab.com/pautome/m11-asix-pub/blob/master/UF3-Firewall/exercicis/firewall-iptables.md

  • Farem servir dos equips virtuals i la màquina física:
  • OpenSuse amb NAT i host-only, un Ubuntu Desktop amb NAT i host-only i la màquina física com a tercer equip. Tots els equips compartiran la xarxa host-only en el rang 192.168.57.0/24.
  • Quan configurem el tallafocs és molt important l'ordre de les regles, ja que per a cada paquet es comprova la llista de regles i si es troba una regla que concorda amb els criteris de selecció, s'executa el TARGET i ja no es mira la resta que venen darrera.
  • Farem servir una màquina virtual Ubuntu Desktop (l'anomenarem "Servidor") on configurarem el firewall iptables.

Exercicis

1. Esborra totes les regles al Servidor i tindrem el firewall sense cap regla i aturat

iptables -F
iptables -X


2. Que fa cada comanda? Mira l'estat actual de les regles amb iptables -L -v -n

Solució

Quan executem la comanda del punt anterior, veiem que ens dóna aquest output per consola:

root@ubuntu18-server-gsb:/home/guillem# iptables -L -v -n
Chain INPUT (policy ACCEPT 118 packets, 8580 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 80 packets, 13008 bytes)
 pkts bytes target     prot opt in     out     source               destination

Veiem que a les 3 cadenes (INPUT, FORWARD i OUTPUT) s'hi queda una política default d'ACCEPT; pel que aquesta comanda fa una neteja de les regles de les cadenes. Si mirem el manual de IPTables, veiem que aquestes opcions que hem passat a la comanda signifiquen:

  • L'opció -F fa un Flush de les regles de la cadena que diguem. Si no s'especifica cap cadena, es netegen les regles de totes les cadenes.
  • L'opció -X elimina cadenes personalitzades per l'usuari seleccionades; o bé s'eliminen totes si no s'especifica.


3. En una altre equip virtual Ubuntu (serà "Client") instal·la el programari zenmap (o fes servir nmap directament) i arrenca'l. Ens servirà per fer scan de ports i comprovar si es pot accedir als serveis del servidor

Solució

De bon principi, si fem un nmap al servidor tindrem el següent:

[guillem@guillemasix29 ~]$ nmap 192.168.57.70
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-12 16:19 CET
Nmap scan report for 192.168.57.70
Host is up (0.00028s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

4. Si les polítiques per defecte no són ACCEPT en INPUT, OUTPUT o FORWARD, poseu:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Solució

Tal com s'ha comprovat en el punt 2, les polítiques són accept. No fem res.

5. Instal·la Apache i openssh-server al Servidor

Solució

Es tracta d'un OpenSuse, per tant:

zypper in apache2 -y

OpenSSH server ja està instal·lat i, segons l'nmap d'abans, escoltant pel port 22.

6. Comprova que pots veure els serveis actius des del client, accedint amb un navegador web i un client ssh al servidor

Solució

Servidor web
S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació
Una pàgina web de prova


Servidor SSH

Des del client (o la màquina amfitriona:

[guillem@guillemasix29 ~]$ ssh root@192.168.57.70
Password: 
Last login: Tue Feb 12 16:19:23 2019 from 192.168.57.1
Have a lot of fun...
iptables:~ # 

7. Comprova també que Zenmap, amb l'opció "Quick scan" et mostra que els ports dels serveis web i sshd estan oberts (escoltant)

Solució

M11UF3EX1-2.png


8. Ara canvia la configuració del firewall per tancar l'accés al servidor. Posa a iptables que la política sigui per defecte DROP. Comprova l'estat actual del firewall

Solució

Agafant el punt 4 com a contra-exemple, farem el següent:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

De manera que la política per defecte en INPUT, OUTPUT i FORWARD sigui DROP de la comunicació.

A l'executar aquestes comandes mitjançant SSH hem quedat fora del servidor, ja que el protocol SSH també es veu afectat per aquestes noves polítiques d'IPTables.

9. Des del client comprova que els ports dels serveis ja no són accessibles i tampoc es pot accedir amb els clients web i ssh. Comprova que tampoc pots accedir des del servidor a la xarxa, fent un ping al client

Solució

Si fem la prova amb HTTP, veiem que el navegador fa un timeout ja que el servidor no rebutja la connexió directament sinó que no respon:

M11UF3EX1-3.png


Si fem un ping des de l'amfitrió cap a la màquina:

[guillem@guillemasix29 ~]$ ping 192.168.57.70
PING 192.168.57.70 (192.168.57.70) 56(84) bytes of data.
^C
--- 192.168.57.70 ping statistics ---
34 packets transmitted, 0 received, 100% packet loss, time 814ms

Veiem que no tenim cap resposta per molt que esperem.

Si tornem a fer un QuickScan amb ZenMap ens mostra que els ports escanejats estan filtered:

M11UF3EX1-4.png


10. Canvia la política a REJECT i comprova des del client quina és la diferència (navegador, client ssh, Zenmap)

Solució

No podem especificar REJECT com a política; sinó que afegirem a les 3 cadenes: INPUT, OUTPUT i FORWARD un jump cap a REJECT; de manera que tots els paquets es derivin cap allà incondicionalment:

iptables -P INPUT REJECT --icmp-type icmp-net-unreachable
iptables -P FORWARD REJECT --icmp-type icmp-net-unreachable
iptables -P OUTPUT ACCEPT

De manera que la política per defecte en INPUT, i FORWARD sigui REJECT de la comunicació amb un missatge de network unreachable. NOTA: fixeu-vos que la política d'output és ACCEPT perquè el mateix servidor pugui respondre; ja que si també féssim un DROP o REJECT dels paquets en estat OUTPUT, tindríem un comportament semblant a un DROP normal.

Si comprovem ara, per exemple amb la comanda ping:

[guillem@guillemasix29 ~]$ ping 192.168.57.70
PING 192.168.57.70 (192.168.57.70) 56(84) bytes of data.
From 192.168.57.70 icmp_seq=1 Destination Net Unreachable
From 192.168.57.70 icmp_seq=2 Destination Net Unreachable
From 192.168.57.70 icmp_seq=3 Destination Net Unreachable
^C
--- 192.168.57.70 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 12ms

O el navegador web:

M11UF3EX1-5.png


11. Permet l'accés a la màquina server només des de la màquina client (tant d'entrada com de sortida)

iptables -A INPUT -s ip_client -j ACCEPT
iptables -A OUTPUT -d ip_client -j ACCEPT

Solució

Suposant que la màquina client té la IP 192.168.57.71

iptables -A INPUT -s 192.168.57.71 -j ACCEPT
iptables -A OUTPUT -d 192.168.57.71 -j ACCEPT
iptables -A INPUT -j REJECT

Afegim la regla d'entrada i sortida per a origen i destí l'adreça IP del client. Al final afegim un REJECT per a la resta de casos que no compleixin.

Si provem d'accedir al servidor des de la màquina física (192.168.57.1) tenim un missatge d'error de connexió:

M11UF3EX1-5.png


Però des del client Ubuntu Live amb la IP 192.168.57.71 veiem la pàgina de prova normalment:

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació


12. Comprova que no es pot accedir per exemple des de la màquina física (ping, client web), i un scan amb Zenmap et donarà tots els ports tancats. En canvi des del client no

Solució

Des del client s'ha provat des del punt anterior. Si des de la màquina física intentem accedir per SSH:

[guillem@guillemasix29 ~]$ ssh root@192.168.57.70
ssh: connect to host 192.168.57.70 port 22: Connection refused

O si enviem pings:

[guillem@guillemasix29 ~]$ ping 192.168.57.70
PING 192.168.57.70 (192.168.57.70) 56(84) bytes of data.
From 192.168.57.70 icmp_seq=1 Destination Port Unreachable
From 192.168.57.70 icmp_seq=2 Destination Port Unreachable
^C
--- 192.168.57.70 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 33ms

Comprovem que se'ns està aplicant el REJECT.

13. Permet l'accés a la màquina servidor només als ports dels serveis Web (80, 443) i SSH (22), des de qualsevol equip, i prova que ara des de la màquina física pots accedir als serveis web i ssh, però que no pots fer un ping, per exemple

Solució

iptables -A INPUT -p TCP --dport 80 -j ACCEPT
iptables -A INPUT -p TCP --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT

Podem fer SSH:

[guillem@guillemasix29 ~]$ ssh root@192.168.57.70
Password: 
Last login: Thu Feb 14 19:13:27 2019 from 192.168.57.1
Have a lot of fun...
iptables:~ # 

Podem accedir a la web:

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació


Però el ping ens respon amb el REJECT

[guillem@guillemasix29 ~]$ ping 192.168.57.70
PING 192.168.57.70 (192.168.57.70) 56(84) bytes of data.
From 192.168.57.70 icmp_seq=1 Destination Port Unreachable
From 192.168.57.70 icmp_seq=2 Destination Port Unreachable
From 192.168.57.70 icmp_seq=3 Destination Port Unreachable
^C
--- 192.168.57.70 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 51ms

14. Prova a posar només la regla de la cadena INPUT. Funciona el servei web? Per què necessites la regla de la cadena OUTPUT?

Solució

Si només posem la regla a INPUT i no a OUTPUT, si tenim la política per defecte en DROP, hem d'estipular una regla de sortida per a permetre la resposta del servidor cap a fora; de manera que el firewall del servidor no es tanqui a ell mateix si només es permet les connexions entrants però no les sortints de resposta.

15. Escriu, per un servei concret les següents regles, on -A és afegir una regla a una cadena (INPUT, OUTPUT O FORWARD), -p és "protocol" (tcp, udp o icmp), --dport és "destination port" i --sport és "source port" i -j és "jump" que vol dir que especifica l'objectiu de la regla. Canvia n_port pel número de port assignat al servei

iptables -A INPUT -p tcp --dport n_port -j ACCEPT
iptables -A OUTPUT -p tcp --sport n_port -j ACCEPT

Solució

En el cas de tenir un servidor SMTP i un servidor HTTP amb SSL, necessitarem obrir els ports 25 i 443 de la següent manera:

iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT

El que estem definint és permetre les connexions que vagin cap a port 25 o 443 del servidor i permetre les connexions sortints des de port 25 o 443 del mateix. Si no es compleix cap d'aquestes regles, fem un REJECT finalment.

16. Permet fer ping a la màquina server (busca els icmp-type del ping), des de l'equip físic, i prova que ara des de la màquina física pots fer ping

iptables -A INPUT -s ip-fisica -p icmp --icmp-type ?? -j ACCEPT
iptables -A OUTPUT -d ip-fisica -p icmp --icmp-type ?? -j ACCEPT

Solució

Tenint en compte que la màquina amfitriona (física) es troba a 192.168.57.1, permetrem el ping (missatge ICMP del tipus echo-request, tipus 8) així:

iptables -A INPUT -s 192.168.57.1 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -d 192.168.57.1 -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -j DROP

De manera que per a connexions entrants permetrem els ICMPs del tipus echo-request (tipus 8) i permetrem al servidor respondre de sortida amb un echo-reply (tipus 0). Si el missatge ICMP rebut no és del tipus 8, es farà un REJECT perquè no complirà cap norma.

17. Per què necessitem la regla de la cadena OUTPUT?

Solució

Si només posem la regla a INPUT i no a OUTPUT, si tenim la política per defecte en DROP, hem d'estipular una regla de sortida per a permetre la resposta del servidor cap a fora; de manera que el firewall del servidor no es tanqui a ell mateix si només es permet les connexions entrants però no les sortints de resposta.

18. Si volem denegar que es pugui fer un ping, haurem de fer dues regles INPUT i OUTPUT o només amb INPUT ja deneguem?

Solució

Amb la part de INPUT ja denegaríem si volem privar de rebre missatges ICMP; la regla d'OUTPUT seria redundant ja que el servidor no respondria a una petició que no hagi rebut perquè el Firewall ja l'ha filtrat a l'entrada.

19. Activa ara el servei FTP del servidor i limita l'accés al servidor FTP als ordinadors d'un rang adreces IP. Pensa que el protocol FTP fa servir 2 ports, el 20 i el 21 (en mode actiu). Prova primer a permetre el port de comandes (21) i després si funciona, obre el port de dades (20)

Solució

Permetrem d'entrada i sortida pels ports 20 i 21 com a origen i destí en funció de si apliquem en INPUT o OUTPUT.

iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT

20. Fes que la configuració sigui persistent al servidor. Comprova reiniciant el servidor

Solució

Amb la comanda iptables-save i iptables-restore podem desar i importar regles del Firewall

iptables-save > /root/iptables.bak
iptables-restore < /root/iptables.bak

Llavors és qüestió de fer, per exemple, un cronjob @reboot que executi la comanda de restore i que l'administrador del firewall d'aquell sistema vagi desant les regles aplicades una vegada dissenyat i comprovat el bon funcionament. En el cas que una regla sigui errònia i el deixi fora del servidor, seria relativament fàcil restaurar les regles anteriors i fer un roll-back per a poder rectificar.