1. Tallafocs amb IP Tables (I)
Contingut
- 1 Enunciat
- 2 Exercicis
- 2.1 1. Esborra totes les regles al Servidor i tindrem el firewall sense cap regla i aturat
- 2.2 2. Que fa cada comanda? Mira l'estat actual de les regles amb iptables -L -v -n
- 2.3 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
- 2.4 4. Si les polítiques per defecte no són ACCEPT en INPUT, OUTPUT o FORWARD, poseu:
- 2.5 5. Instal·la Apache i openssh-server al Servidor
- 2.6 6. Comprova que pots veure els serveis actius des del client, accedint amb un navegador web i un client ssh al servidor
- 2.7 7. Comprova també que Zenmap, amb l'opció "Quick scan" et mostra que els ports dels serveis web i sshd estan oberts (escoltant)
- 2.8 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
- 2.9 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
- 2.10 10. Canvia la política a REJECT i comprova des del client quina és la diferència (navegador, client ssh, Zenmap)
- 2.11 11. Permet l'accés a la màquina server només des de la màquina client (tant d'entrada com de sortida)
- 2.12 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
- 2.13 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
- 2.14 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?
- 2.15 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
- 2.16 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
- 2.17 17. Per què necessitem la regla de la cadena OUTPUT?
- 2.18 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?
- 2.19 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)
- 2.20 20. Fes que la configuració sigui persistent al servidor. Comprova reiniciant el servidor
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.
- L'opció
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.
Solució
Servidor web
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ó
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:
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:
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:
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ó:
Però des del client Ubuntu Live amb la IP 192.168.57.71 veiem la pàgina de prova normalment:
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:
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.