¿Cómo habilitar la protección DDoS?

85

Los ataques DDoS (ataques distribuidos de denegación de servicio) generalmente se bloquean a nivel de servidor, ¿verdad?

¿Hay alguna forma de bloquearlo a nivel de PHP, o al menos reducirlo?

Si no es así, ¿cuál es la forma más rápida y común de detener los ataques DDoS?

coderama
fuente
De no tener nada mejor, aquí hay una lista de módulos de Apache que podrían ayudar potencialmente. Sin embargo, no parece muy rico, y los dos proyectos de cuatro (buscados por 'dos') parecen apuntar a ninguna parte.
Audrius Meskauskas
¿Algo como esto? mod-antiloris.sourceforge.net
K-Gun
Un DDOS tiene éxito cuando el sistema ya no puede procesar todas las solicitudes que le lanza el ataque. Si agrega código en su aplicación que verifica cada solicitud para "¿Es esto un ataque DDOS?", Entonces ese código en realidad está haciendo más daño que bien, porque solo requiere un poco más de recursos para cada solicitud. Esto solo funcionaría en un entorno muy restrictivo donde las solicitudes anónimas no están permitidas de todos modos.
Hugo Delsing

Respuestas:

188

DDOS es una familia de ataques que abruman los sistemas clave en el centro de datos, que incluyen:

  • La conexión de red del centro de alojamiento a Internet
  • La red interna y los enrutadores del centro de alojamiento
  • Tu firewall y balanceadores de carga
  • Sus servidores web, servidores de aplicaciones y base de datos.

Antes de comenzar a construir su defensa DDOS, considere cuál es el valor en riesgo en el peor de los casos. Para un servicio no crítico y de uso gratuito para una comunidad pequeña, el valor total en riesgo podría ser un cacahuete. Para un sistema de misión crítica pagado, orientado al público para una empresa establecida de miles de millones de dólares, el valor podría ser el valor de la empresa. En este último caso, no debería usar StackExchange :) De todos modos, para defenderse contra DDOS, necesita un enfoque de defensa en profundidad:

  1. Trabaje con su centro de alojamiento para comprender los servicios que ofrecen, incluido el filtrado de puertos e IP en sus conexiones de red a Internet y los servicios de firewall que ofrecen. Esto es fundamental: la empresa de alojamiento extrae muchos sitios de Internet a medida que la empresa de alojamiento se ocupa de la interrupción en todo el centro de datos causada por el DDOS en un cliente. Además, durante un ataque DDOS, trabajará muy de cerca con el personal del centro de alojamiento, así que conozca sus números de emergencia y manténgase en buenos términos con ellos :) Deberían poder bloquear regiones internacionales enteras, bloquear completamente servicios o redes específicas. protocolos y otras medidas defensivas de amplio espectro o, alternativamente, permitir solo direcciones IP incluidas en la lista blanca (según su modelo de negocio)
  2. Mientras esté en el centro de alojamiento, utilice una red de entrega de contenido para distribuir servicios (principalmente estáticos) cerca de sus usuarios finales y ocultar sus servidores reales a los arquitectos de DDOS. La CDN completa es demasiado grande para que un DDOS elimine todos los nodos en todos los países; si el DDOS se centra en un país, al menos otros usuarios siguen estando bien.
  3. Mantenga todos sus sistemas y paquetes de software actualizados con los últimos parches de seguridad , y me refiero a todos ellos:

    • Switches administrados: sí, a veces es necesario actualizarlos
    • Enrutadores
    • Cortafuegos
    • Equilibradores de carga
    • Sistemas operativos
    • Servidores web
    • Idiomas y sus bibliotecas
  4. Asegúrese de tener un buen firewall o dispositivo de seguridad configurado y revisado periódicamente por un experto en seguridad calificado . Las reglas estrictas del firewall son una buena defensa contra muchos ataques simples. También es útil poder administrar el ancho de banda disponible para cada servicio abierto.

  5. Disponga de buenas herramientas de supervisión de red ; esto puede ayudarle a comprender:

    • Que estás bajo ataque en lugar de simplemente estar bajo una carga pesada
    • De dónde proviene el ataque (que puede incluir países con los que normalmente no hace negocios) y
    • Cuál es realmente el ataque (puertos, servicios, protocolos, IP y contenido del paquete)
  6. El ataque podría ser simplemente un uso intensivo de servicios legítimos del sitio web (por ejemplo, presionar URI 'legales' que ejecutan consultas o insertar / actualizar / eliminar datos): miles o millones de solicitudes provenientes de decenas a millones de direcciones IP diferentes traerán un sitio a su rodillas Alternativamente, algunos servicios pueden ser tan costosos de ejecutar que solo unas pocas solicitudes causan un DOS; piense en un informe realmente costoso. Por lo tanto, necesita un buen monitoreo a nivel de aplicación de lo que está sucediendo:

    • Qué servicios se han invocado y qué argumentos / datos se envían (es decir, iniciar sesión en su aplicación)
    • Qué usuarios están haciendo la invocación y desde qué IP (es decir, iniciando sesión en su aplicación)
    • Qué consultas e inserciones / actualizaciones / eliminaciones está realizando la base de datos
    • Carga promedio, utilización de CPU, E / S de disco, tráfico de red en todas las computadoras (y VM) en su sistema
    • Asegurarse de que toda esta información se pueda recuperar fácilmente y de que pueda correlacionar los registros de diferentes equipos y servicios (es decir, asegurarse de que todos los equipos estén sincronizados en el tiempo mediante ntp).
  7. Restricciones y límites sensibles en su aplicación . Por ejemplo, podría:

    • Use una función de QoS en el equilibrador de carga para enviar todas las sesiones anónimas a servidores de aplicaciones separados en su clúster, mientras que los usuarios que inician sesión usan otro conjunto. Esto evita que un DDOS anónimo a nivel de aplicación saque a clientes valiosos
    • Usar un CAPCHA fuerte para proteger servicios anónimos
    • Tiempos de espera de sesión
    • Tenga un límite de sesión o un límite de velocidad para ciertos tipos de solicitudes, como informes. Asegúrese de que puede desactivar el acceso anónimo si es necesario
    • Asegúrese de que un usuario tenga un límite en la cantidad de sesiones simultáneas (para evitar que una cuenta pirateada inicie sesión un millón de veces)
    • Tener diferentes usuarios de aplicaciones de base de datos para diferentes servicios (por ejemplo, uso transaccional versus uso de informes) y usar la administración de recursos de la base de datos para evitar que un tipo de solicitud web abrume a todos los demás
    • Si es posible, haga que estas restricciones sean dinámicas, o al menos configurables. De esta manera, mientras está bajo ataque, puede establecer límites temporales agresivos ("estrangulando" el ataque), como solo una sesión por usuario y sin acceso anónimo. Ciertamente, esto no es muy bueno para sus clientes, pero es mucho mejor que no tener ningún servicio.
  8. Por último, pero no menos importante, redacte un documento de plan de respuesta de DOS y haga que lo revisen internamente todas las partes relevantes: negocios, administración, el equipo de desarrollo de software, el equipo de TI y un experto en seguridad. El proceso de redacción del documento hará que usted y su equipo reflexionen sobre los problemas y lo ayudarán a estar preparado en caso de que ocurra lo peor a las 3 de la mañana de su día libre. El documento debe cubrir (entre otras cosas):

    • Qué está en riesgo y el costo para la empresa
    • Medidas tomadas para proteger los activos
    • Cómo se detecta un ataque
    • El procedimiento de respuesta y escalamiento planificado
    • Procesos para mantener el sistema y este documento actualizados

Entonces, aparte del preámbulo, aquí hay algunas respuestas específicas:

Los DDOS generalmente se bloquean a nivel de servidor, ¿verdad?

En realidad, no: la mayoría de los peores ataques DDOS son de bajo nivel (a nivel de paquete IP) y se manejan mediante reglas de enrutamiento, firewalls y dispositivos de seguridad desarrollados para manejar ataques DDOS.

¿Hay alguna forma de bloquearlo a nivel de PHP, o al menos reducirlo?

Algunos ataques DDOS están dirigidos a la propia aplicación y envían solicitudes HTTP y URI válidas. Cuando aumenta la tasa de solicitudes, sus servidores comienzan a tener problemas y tendrá una interrupción del SLA. En este caso, hay cosas que puede hacer a nivel de PHP:

  • Monitoreo del nivel de aplicación: asegúrese de que cada servicio / página registre las solicitudes de manera que pueda ver lo que está sucediendo (para que pueda tomar acciones para mitigar el ataque). Algunas ideas:

    • Tenga un formato de registro que pueda cargar fácilmente en una herramienta de registro (o Excel o similar) y analizar con herramientas de línea de comandos (grep, sed, awk). Recuerde que un DDOS generará millones de líneas de registro. Es probable que deba dividir sus registros (especialmente con respecto a URI, tiempo, IP y usuario) para averiguar qué está sucediendo y necesitar generar datos como:

      • A qué URI se accede
      • Qué URI están fallando a una tasa alta (un indicador probable de los URI específicos que atacan los atacantes)
      • Qué usuarios acceden al servicio
      • ¿Desde cuántas direcciones IP accede cada usuario al servicio?
      • A qué URI acceden los usuarios anónimos
      • Qué argumentos se utilizan para un servicio determinado
      • Auditar las acciones de un usuario específico
    • Registre la dirección IP de cada solicitud. NO invierta el DNS en esto: irónicamente, el costo de hacer esto hace que un DDOS sea más fácil para los atacantes

    • Registra todo el URI y el método HTTP, por ejemplo, "GET http://example.com/path/to/service?arg1=ddos "
    • Registre el ID de usuario si está presente
    • Registrar argumentos HTTP importantes
  • Límites de tasa razonables: puede implementar límites sobre la cantidad de solicitudes que una IP o un usuario puede realizar en un período de tiempo determinado. ¿Podría un cliente legítimo realizar más de 10 solicitudes por segundo? ¿Pueden los usuarios anónimos acceder a informes costosos?

  • CAPTCHA para acceso anónimo: implemente un CAPTCHA para todas las solicitudes anónimas para verificar que el usuario es una persona, no un bot DDOS.

¿Cuál es la forma más rápida y común de detener los ataques DDOS?

Probablemente lo más rápido sea ceder al chantaje, aunque esto podría no ser deseable.

De lo contrario, lo primero que debe hacer es ponerse en contacto con su proveedor de alojamiento y / o CDN y trabajar con ellos (si no lo han contactado ya preguntando qué diablos está pasando ...). Cuando ocurre un DDOS, es probable que afecte colateralmente a otros clientes del proveedor de alojamiento, y el proveedor puede estar bajo una presión considerable para cerrar su sitio simplemente para proteger sus recursos. Esté preparado para compartir sus registros (toda la información) con el proveedor; estos registros, combinados con sus monitores de red, pueden proporcionar en conjunto suficiente información para bloquear / mitigar el ataque.

Si está esperando un DDOS, es una muy buena idea calificar a su proveedor de alojamiento en el nivel de protección que puede brindar. Deben tener experiencia en DDOS y herramientas para mitigarlo: comprender sus herramientas, procesos y procedimientos de escalamiento. También pregunte qué soporte tiene el proveedor de hospedaje de sus proveedores ascendentes. Estos servicios pueden significar un mayor costo inicial o mensual, pero trátelo como una póliza de seguro.

Mientras está bajo ataque, deberá tomar sus registros y extraerlos; intente averiguar el patrón del ataque. Debería considerar desactivar el acceso anónimo y limitar los servicios bajo ataque (es decir, disminuir el límite de velocidad de la aplicación para el servicio).

Si tiene suerte y tiene una base de clientes pequeña y fija, es posible que pueda determinar las direcciones IP válidas de sus clientes. Si este es el caso, puede cambiar a un enfoque de lista blanca durante un tiempo. Asegúrese de que todos sus clientes sepan que esto está sucediendo para que puedan llamar si necesitan acceder desde una nueva IP :)


Doug McClean tiene buenos consejos en: https://stackoverflow.com/a/1029613/1395668

Andrew Alcock
fuente
20

Según la parte de PHP de la pregunta;

Aunque no confío en PHP para esto, podría implementarse pero debe considerar todas estas posibilidades o más;

  1. El atacante puede cambiar la IP para cada solicitud
  2. El atacante puede pasar parámetros al URI que indican que al sitio de destino no le importan estos parámetros
  3. El atacante puede reiniciar la sesión antes de que expire ...

Pseudo simple;

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>
K-Gun
fuente
8

El nivel de php es demasiado tarde en la cadena de solicitudes.

Poner su servidor apache detrás de un dispositivo de código abierto puede ser una buena opción para usted.

http://tengine.taobao.org/ tiene documentación y código fuente más módulos destinados a la prevención de DDOS. Es una expansión de nginx, por lo que puede configurarlo fácilmente como un proxy inverso para su instancia de apache.

Consulte: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ para saber cómo luchar contra la colisión con ataques DoS.

También lo olvidé por completo, http://www.cloudflare.com es uno de los mejores firewalls de aplicaciones web gratuitas, tienen planes gratuitos y de pago y te salvarán el culo de DDOS, lo usamos para muchos de nuestros sitios de alto tráfico solo por sus capacidades de almacenamiento en caché . ¡Es asombroso!

j_mcnally
fuente
5

No puede hacer esto en el nivel PHP. DDOS es un tipo de ataque que envía demasiadas solicitudes a su servidor web. Su servidor web rechazará la solicitud antes de llamar a su script PHP.

Si está utilizando Apache, aquí hay algunos consejos de Apache: http://httpd.apache.org/docs/trunk/misc/security_tips.html

ndlinh
fuente
5

DDoS se maneja mejor con dispositivos de red muy costosos y especialmente diseñados. Los hosts generalmente no son buenos para proteger contra DDoS porque están sujetos a un rendimiento relativamente bajo, agotamiento del estado, ancho de banda limitado, etc. El uso de iptables, mods de apache y servicios similares puede ayudar en algunas situaciones si no tiene acceso al hardware de mitigación de DDoS o un servicio de mitigación de DDoS, pero está lejos de ser ideal y aún lo deja en riesgo de ataque.

Ryan
fuente
8
Necesitamos una solución, y si no existe una solución ideal, necesitamos soluciones parciales. Nadie necesita un consejo del tipo "simplemente no puedes hacer esto".
Audrius Meskauskas
5

¿Qué tal algo como esto en el lado de PHP?

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}
NVG
fuente
1
Hay algunos errores en este código: 10 está codificado, strtotime no es necesario en el servidor y las variables de sesión, y $ _SESSION ['ban_up'] == 1 debería ser = 1.
Jason Silver
2

No NO utilizar la protección basada en PHP, es horrible y apenas tienen un impacto en absoluto! Configure su servidor web para limitar las solicitudes, por ejemplo, en Nginx usando el módulo limit_req ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html )

Aunque, recomendaría usar CloudFlare para combatir la capa 4, pero no los ataques basados ​​en la capa 7 a menos que esté dispuesto a pagar.

JustLloyd
fuente
sí, también funcionó muy bien para mí, mi experiencia aquí softwareengineeringsolutions.co.uk/…
Elvis Ciotti
2

Los DDOS generalmente se bloquean a nivel de servidor. Habilite la protección DDOS en su nivel de servidor. Consulte las notas siguientes para conocer las protecciones contra DDOS.

Parámetros de configuración del servidor HTTP Apache que pueden ayudar a prevenir problemas de DDOS:

La directiva RequestReadTimeout permite limitar el tiempo que un cliente puede tardar en enviar la solicitud.

Espere 10 segundos para recibir la solicitud, incluidos los encabezados, y 30 segundos para recibir el cuerpo de la solicitud:

RequestReadTimeout header=10 body=30

Espere al menos 10 segundos para recibir el cuerpo de la solicitud. Si el cliente envía datos, aumente el tiempo de espera en 1 segundo por cada 1000 bytes recibidos, sin límite superior para el tiempo de espera (excepto por el límite dado indirectamente por LimitRequestBody):

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

La directiva KeepAliveTimeout también puede reducirse en sitios que están sujetos a ataques DoS. Algunos sitios incluso desactivan los keepalives por completo a través de KeepAlive, que por supuesto tiene otros inconvenientes en el rendimiento. Deben comprobarse los valores de varias directivas relacionadas con el tiempo de espera proporcionados por otros módulos.

Las directivas LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine y LimitXMLRequestBody deben configurarse cuidadosamente para limitar el consumo de recursos provocado por la entrada del cliente. Ajuste la directiva MaxRequestWorkers para permitir que el servidor maneje el número máximo de conexiones simultáneas sin quedarse sin recursos.

Raja Rama Mohan Thavalam
fuente
2

Pasos anti DDOS :

  • Lo primero que importa es identificar primero el ataque ddos. Identificar el ataque ddos ​​más temprano significa más mejor para su servidor.
  • Obtener un mejor ancho de banda disponible para su servidor. Mantenga siempre el ancho de banda más que suficiente que se requiere para su servidor. Esto no evitará el ataque DDOS, pero llevará más tiempo. Por lo que tendrás algo de tiempo extra para actuar.
  • Si posee su propio servidor web, puede defender el parámetro de red limitando la velocidad de su enrutador, agregar filtros para soltar paquetes a diferentes fuentes de ataques, detener las conexiones medio abiertas de manera más agresiva. También establezca umbrales de caída de inundación SYN, ICMP y UDP más bajos.
  • Si no tiene mucha idea sobre estas cosas, póngase en contacto con sus proveedores de alojamiento rápidamente. Pueden hacer todo lo posible para prevenir los ataques DDOS.
  • También hay un servicio especial de mitigación de DDOS proporcionado por Cloudflare y muchas otras empresas. Por lo que pueden ayudarlo a prevenir los ataques DDOS. Además, muchas empresas ofrecen protección contra ddos y protección contra dos .
Soy novato
fuente