Ejecuto varios cientos de servidores web detrás de cargadores de carga, alojando muchos sitios diferentes con una gran cantidad de aplicaciones (de las cuales no tengo control). Aproximadamente una vez al mes, uno de los sitios es pirateado y se carga un script de inundación para atacar a algún banco o institución política. En el pasado, siempre se trataba de inundaciones UDP que se resolvieron efectivamente bloqueando el tráfico UDP saliente en el servidor web individual. Ayer comenzaron a inundar un gran banco de EE. UU. Desde nuestros servidores utilizando muchas conexiones TCP al puerto 80. Como este tipo de conexiones son perfectamente válidas para nuestras aplicaciones, simplemente bloquearlas no es una solución aceptable.
Estoy considerando las siguientes alternativas. ¿Cuál recomendarías? ¿Has implementado estos y cómo?
- ¡Límite en los paquetes TCP salientes del servidor web (iptables) con puerto de origen! = 80
- Lo mismo pero con colas (tc)
- Límite de velocidad del tráfico saliente por usuario por servidor. Toda una carga administrativa, ya que hay potencialmente miles de usuarios diferentes por servidor de aplicaciones. Tal vez esto: ¿cómo puedo limitar el ancho de banda por usuario?
- ¿Algo más?
Naturalmente, también estoy buscando formas de minimizar la posibilidad de que los piratas informáticos accedan a uno de nuestros sitios alojados, pero como ese mecanismo nunca será 100% resistente al agua, quiero limitar severamente el impacto de una intrusión.
Actualización: Actualmente estoy probando con estas reglas, eso habría evitado este ataque específico. ¿Cómo propondrías hacerlos más genéricos? ¿Me estoy perdiendo un ataque TCP DoS conocido cuando solo califico el límite en los paquetes SYN?
iptables -A OUTPUT -p tcp --syn -m limit --limit 100/min -j ACCEPT
iptables -A OUTPUT -p tcp --syn -m limit --limit 1000/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A OUTPUT -p tcp --syn -j REJECT --reject-with tcp-reset
¡Salud!