El servidor de pruebas que siguió encendido
Cerrar puertos es parar lo que un servidor no necesita que escuche. Aplicar parches es instalar los arreglos de fallos conocidos.
Un desarrollador abrió un puerto para probar una página y se fue de vacaciones. El puerto quedó abierto tres meses, y el programa de detrás nunca se actualizó.
Un puerto que nadie necesita es una puerta que nadie vigila. Cerrarlo no cuesta nada.
Al final de esta lección
Nota
Puedo encontrar lo que escucha un servidor, cerrar lo que sobra y comprobar las actualizaciones.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Puerto | una puerta numerada de una máquina donde escucha un programa | 22 |
| Escuchar | esperar en un puerto a que alguien se conecte | |
| Bucle local | la dirección 127.0.0.1, a la que solo llega la misma máquina | |
| Denegar por defecto | rechazar todo lo que ninguna regla permite | |
| Parche | una actualización que arregla un fallo conocido | |
| Superficie de ataque | todo lo que un atacante puede alcanzar y probar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Lo que escucha se puede atacar
Cada programa que escucha en un puerto es una entrada posible. Cuantos menos haya, menos puede probar un atacante.
El primer trabajo es mirar. Vas a lanzar dos servidores web pequeños tuyos desde una carpeta vacía, uno abierto a la red y otro solo a esta máquina.
Lista lo que escucha ahora
ss -ltnSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea una carpeta vacía para servir
mkdir -p sitio-vacioSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Servidor abierto a la red en el 8088
(timeout 120 python3 -m http.server 8088 --bind 0.0.0.0 --directory sitio-vacio >/dev/null 2>&1 &)Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Servidor de bucle local en el 8089
(timeout 120 python3 -m http.server 8089 --bind 127.0.0.1 --directory sitio-vacio >/dev/null 2>&1 &)Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Compara los dos
ss -ltn | grep -E ':808[89]'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cómo leer la columna Local Address
El último Run escribió dos líneas. Una tiene 0.0.0.0:8088 y la otra 127.0.0.1:8089.
La dirección 0.0.0.0 significa todas las redes en las que está la máquina. La dirección 127.0.0.1 significa solo esta máquina. El segundo servidor no se puede atacar desde fuera, y no necesita ninguna regla de cortafuegos.
Los dos servidores se paran solos a los dos minutos.
Una regla puede rechazar un puerto
A veces un programa debe escuchar en todas partes pero no debe ser alcanzado. Una regla de cortafuegos en la máquina puede rechazarlo.
Ahora añades una regla solo para el puerto 8088, en una tabla tuya llamada practica. Tu terminal no se toca, y no se guarda nada. Si un Run dice nft: command not found, instálalo con sudo apt-get install -y nftables.
Rechaza el puerto 8088 con una regla
sudo nft 'add table inet practica; add chain inet practica guardia { type filter hook input priority 0 ; policy accept ; }; add rule inet practica guardia tcp dport 8088 reject with tcp reset'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pregunta ahora al puerto 8088
curl -sS -m 3 http://127.0.0.1:8088/ 2>&1 | head -n 1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pregunta al puerto 8089, que ninguna regla toca
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8089/Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué dicen las dos respuestas
El primer curl escribió curl: (7) Failed to connect to 127.0.0.1 port 8088, seguido de una nota sobre el tiempo. La regla rechazó la conexión al instante. El segundo escribió 200: el puerto 8089 sigue respondiendo.
Un cortafuegos de verdad empieza al revés. Su política es denegar por defecto, y una regla permite cada puerto que hace falta.
Ejemplo: denegar por defecto en un servidor web
| Puerto | Para qué sirve | Regla |
|---|---|---|
| 22 | SSH para el administrador | Permitir, solo desde la dirección de la oficina |
| 443 | El sitio web | Permitir, desde todas partes |
| 8088 | Una página de prueba olvidada | Sin regla, así que se rechaza |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Borra la tabla de práctica
sudo nft delete table inet practicaSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para los dos servidores desechables
pkill -f 'http.server 808'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Los parches cierran fallos que otros ya encontraron
La mayoría de los ataques usan un fallo que ya tiene arreglo. Un servidor con las actualizaciones atrasadas es fácil de atacar.
Puedes mirar sin cambiar nada. La palabra -s significa simular: escribe lo que haría y no hace nada. Los números dependen del día, así que aquí no se da ninguno.
¿Hay una versión más nueva de openssl?
apt-cache policy openssl | head -n 3Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Cuántas actualizaciones instalaría?
sudo apt-get -s upgrade | grep -c '^Inst'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que un puerto es seguro porque nadie sabe que está ahí. Los escáneres prueban todos los puertos en minutos. Un puerto es seguro cuando ningún programa escucha en él, o cuando una regla lo rechaza. Ser desconocido no es un control.
Para ir más lejos: parches con calendario
Ejecuta ls /etc/apt/apt.conf.d y busca un archivo con auto-upgrades en el nombre. Si existe, léelo con cat. Dice si la máquina instala sola las actualizaciones de seguridad.
Escribe dos frases. Una razón para dejar que un servidor se actualice solo. Una razón por la que un colegio querría probar antes las actualizaciones.