He estado tratando de armar un script básico de iptables del servidor que funcione para la mayoría de los sitios que solo ejecutan un servidor web básico usando HTTP (S) y SSH (puertos 80, 443 y 22). Después de todo, la mayoría de los VPS solo necesitan estas reglas de puertos de inicio y pueden agregar puertos de correo o juegos más tarde según sea necesario.
Hasta ahora tengo el siguiente conjunto de reglas y me preguntaba si alguien sabe de un mejor script o cualquier mejora que pueda agregarse.
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
iptables es una de las partes más importantes de asegurar su caja (también vea fail2ban) y, sin embargo, hay muchas personas como yo que tienen problemas para comprender todo lo que implica crear un firewall básico seguro para nuestros servidores.
¿Cuál es la forma más segura de abrir solo los puertos básicos necesarios para un servidor web?
Actualización: cyberciti.biz tiene otro script de iptables que se ve bastante bien.
Además, en lugar de usar Denyhosts o fail2ban, podría usar iptables para bloquear intentos fallidos repetidos en SSH .
modprobe
no está instalado (o si hay algún otro error antes de abrir el puerto 22), se bloqueará del servidor.Respuestas:
La forma más segura de trabajar con iptables es cerrar todo y solo abrir lo que necesita. Estoy un poco distraído, así que siempre trato de ser lo más vago posible, para no cometer errores que puedan hacer que el servidor no sea seguro.
Utilizo este, solo se debe hacer un poco de asignación de variables para que funcione.
Lo he estado usando durante algún tiempo, y cualquier tipo de modificación será muy apreciada si facilita la administración.
fuente
Esto se ve bastante bien, pero podría ajustar las cosas un poco más. El indicador -s es la IP de origen o el nombre de dominio, y agrega "-s 198.23.12.32" o lo que sea que su dirección IP permita solo SSH desde su IP de origen. También puede elegir un rango de IP de origen utilizando la notación de estilo CIDR .
Debe tener precaución al registrar llamadas denegadas. La dirección IP de su servidor será escaneada por bots, script kiddies, etc., y el archivo de registro podría agrandarse bastante rápido. A menos que intente diagnosticar un problema específico que cree que podría estar relacionado con alguien que intenta romper su firewall, eliminaría esta opción.
También puede vincular fail2ban a iptables para un pseudo-IDS. fail2ban escaneará sus archivos de registro y puede bloquear una IP si intentan forzar su entrada en su sistema. Por ejemplo, si una determinada dirección IP no puede iniciar sesión en SSH 5 veces, puede bloquearla durante un día entero. También funciona en FTP y en muchos otros (incluidos los robots malos que golpean a Apache). Lo uso en todos mis servidores para proporcionar algo de protección adicional contra los ataques de fuerza bruta.
fuente
Echa un vistazo a Shorewall. La configuración predeterminada de la interfaz única sería un buen punto de partida. Es fácil de configurar y tiene macros para cosas como SSH y acceso web. Se puede configurar para bloquear el servidor al nivel deseado cuando se apaga el firewall. Con Shorewall-lite, puede ejecutar una compilación de firewall en otro servidor. El registro es fácil de configurar al nivel deseado.
Para un servidor HTTP básico, desea abrir el acceso entrante al puerto 80 y al puerto 443 si usa HTTPS. Generalmente se desea acceso entrante SSH desde algunas direcciones restringidas. Es posible que también desee bloquear el acceso saliente. Abra el firewall solo para los servidores y servicios necesarios. Se deben abrir NTP y DNS, así como un canal para buscar parches.
fuente
Diría que este es un cortafuegos bastante bueno, excepto que está orientado a detener el tráfico entrante y no está enfocado en la salida o el tráfico saliente. En muchos casos, es tan importante centrarse en las conexiones salientes desde una caja como aquellas entrantes. En el desafortunado caso de que la máquina sea realmente explotada, sería bueno poder evitar la descarga de kits raíz adicionales, o conectarse a nodos de comando y control, o lo que sea.
BillThor comenzó a hablar sobre esto anteriormente, pero solo estoy respondiendo con ejemplos específicos. Una de las cosas buenas de iptables es que puede recordar el estado de conexión, esto puede tener implicaciones de rendimiento en sitios con mucho tráfico, pero podría cambiar su acceso entrante en http / https para permitir solo la respuesta en conexiones establecidas, por ejemplo, o limitar específicamente ciertos no privilegiados usuarios de tener acceso saliente en absoluto. Entonces, sus reglas de salida tendrían cláusulas RELACIONADAS, ESTABLECIDAS que evitarían una gran cantidad de ataques auxiliares y ralentizarían los que requieren una etapa secundaria para explotar una caja, lo cual es muy común.
Finalmente, diría que es mejor configurar su política de iptables -P DROP en lugar de tener un RECHAZO adjunto al final. Es sobre todo una cuestión de preferencia, pero puede reducir los errores al agregar cadenas con reglas existentes en lugar de insertar o vaciar / restablecer.
fuente
-A INPUT -j REJECT
a-A INPUT -P DROP
?