¿Firewall o no?
Hace un buen tiempo estoy a cargo de unos servidores, por así decirlo, y tuve que poner manos a las obras en cuanto a la seguridad de los mismos.
Según un referente en la materia (?), Ángel Freire, y con quién coincido: Es mejor controlar qué servicios se brindan y dónde escuchan, que desconocerlos y a causa de eso cargar reglas mediante iptables a nuestro querido net filter.
Pero algo se escapa, qué pasa con los ataques por fuerza bruta a servicios vitales como SSH? Bien, a continuación mi solución.
Una vez que decidimos qué servicios brindaremos, tenemos que ver que escuchen donde realmente lo queremos.
~ # netstat -an | grep LISTEN tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:1978 0.0.0.0:* LISTEN
Aquí vemos varios servicios, cada uno de ellos escuchando en distintas interfaces y no por casualidad. Las bases de datos (3306, MySQL y 1978, TokyoTyrant) escuchando en loopback, localhost o como le quieran decir
y por otro lado los servicios públicos (8000, 80, 25 y 22) escuchando tanto en loopback como el resto de las interfaces
Si tuviésemos todo a la bartola, necesitaríamos bloquear, por ejemplo, el acceso a MySQL y Tokyo con unas reglas de iptables. No es más lindo así?
Bien, es más lindo así
ahora, qué pasa con el puerto 22 de SSH? Necesitamos que escuche en las interfaces externas, si no no tendría sentido que exista, pero al hacerlo está suceptible a los inescrupulosos intentos de cientos y miles de idiotas por hacerse del control de nuestros servidores.
Un buen día me harté de ver miles y miles de ráfagas de intentos de autenticación a mi SSH, gestionados por scripts, con usuarios básicos o clásicos de sistemas Unix.
¿La solución? Usar net filter (mediante reglas de iptables) cuando se lo necesita:
#!/bin/bash # Borramos todas las reglas existentes iptables -F # Permitimos la comunicación desde nuestra casa iptables -A INPUT -i eth0 -s DNS_DE_MI_CASA -d IP_DE_MI_SERVIDOR -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -o eth0 -s IP_DE_MI_SERVIDOR -d DNS_DE_MI_CASA -p tcp --sport 22 -j ACCEPT # Permitimos la comunidación desde nuestro trabajo iptables -A INPUT -i eth0 -s DNS_DE_MI_TRABAJO -d IP_DE_MI_SERVIDOR -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -o eth0 -s IP_DE_MI_SERVIDOR -d DNS_DE_MI_TRABAJO -p tcp --sport 22 -j ACCEPT # Denegamos el resto de accesos iptables -A INPUT -i eth0 -s 0/0 -d IP_DE_MI_SERVIDOR -p tcp --dport 22 -j DROP
Con un script como ese, sólo permitimos que al puerto 22 lleguen peticiones de nuestros dominios dinámicos
Lo cual es muy cómodo, aunque en el caso de tener IPs dinámica, tendrán que ejecutar este script, sea mediante cron u otro método, para que las mismas sean actualizadas con las reglas de iptables.
En fin, hasta la próxima!
No trackbacks yet.