php - seguridad - como mitigar un ataque ddos
¿Cómo habilitar la protección DDoS? (10)
¿Qué tal algo así 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;
}
Los DDoS (ataques distribuidos de denegación de servicio) generalmente se bloquean a nivel de servidor, ¿verdad?
¿Hay alguna manera de bloquearlo en un nivel de PHP, o al menos reducirlo?
Si no, ¿cuál es la forma más rápida y más común de detener los ataques DDoS?
DDOS es una familia de ataques que saturan 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
- Su 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 más desfavorable. Para un servicio no crítico y de uso gratuito para una comunidad pequeña, el valor total en riesgo podría ser cacahuetes. Para un sistema de misión crítica de pago público orientado a público para un negocio establecido de miles de millones de dólares, el valor podría ser el valor de la empresa. En este último caso, no deberías estar usando StackExchange :) De todos modos, para defenderte contra DDOS, necesitas un enfoque defensivo en profundidad:
- Trabaje con su centro de alojamiento para comprender los servicios que ofrecen, incluido el IP y el filtrado de puertos en sus conexiones de red a Internet y los servicios de firewall que ofrecen. Esto es fundamental: muchos sitios son sacados de Internet por la empresa de hosting ya que la empresa de alojamiento se ocupa de la interrupción en todo el centro de datos causada por el DDOS a 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íficos protocolos y otras medidas defensivas de amplio espectro, o alternativamente, solo permiten IPs en lista blanca (dependiendo de su modelo de negocio)
- Mientras estés en el centro de alojamiento, utiliza una red de distribución de contenido para distribuir servicios (principalmente estáticos) cerca de tus usuarios finales y esconde tus servidores reales de los arquitectos de DDOS. El CDN completo es demasiado grande para que un DDOS elimine todos los nodos en todos los países; si el DDOS está enfocado en un país, al menos otros usuarios todavía están OK.
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 necesitan actualización
- Enrutadores
- Firewalls
- Balanceadores de carga
- Sistemas operativos
- Servidores web
- Idiomas y sus bibliotecas
Asegúrese de tener un buen firewall o dispositivo de seguridad configurado y revisado regularmente por un experto en seguridad calificado . Las reglas fuertes en el firewall son una buena defensa contra muchos ataques simples. También es útil poder administrar el ancho de banda disponible para cada servicio abierto.
Tenga buenas herramientas de monitoreo de red en su lugar, esto puede ayudarlo a comprender:
- Que estás bajo ataque en lugar de simplemente estar bajo una carga pesada
- De dónde viene el ataque (que puede incluir países con los que normalmente no hace negocios) y
- Qué es realmente el ataque (puertos, servicios, protocolos, IP y contenido de paquetes)
El ataque podría ser simplemente un uso intensivo de los servicios legítimos del sitio web (por ejemplo, accediendo a URIs ''legales'' que ejecutan consultas o insertando / actualizando / eliminando datos): miles o millones de solicitudes provenientes de decenas a millones de direcciones IP diferentes traerán un sitio a su sitio rodillas. Alternativamente, algunos servicios pueden ser tan caros de ejecutar que solo unas pocas solicitudes causan un DOS, piense que es un informe realmente costoso. Entonces necesita una buena monitorización de 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 de qué IPs (es decir, iniciando sesión en su aplicación)
- Qué consultas e inserciones / actualizaciones / elimina la DB está realizando
- Carga promedio, utilización de CPU, disco de E / S, tráfico de red en todas las computadoras (y VM) en su sistema
- Asegurándose de que toda esta información sea fácilmente recuperable y que pueda correlacionar los registros de diferentes computadoras y servicios (es decir, asegúrese de que todas las computadoras estén sincronizadas en tiempo usando ntp).
Limitaciones y límites sensibles en su aplicación . Por ejemplo, podrías:
- 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 clientes valiosos
- Usar un CAPCHA fuerte para proteger servicios anónimos
- Tiempo de espera de sesión
- Tener un límite de sesión o límite de frecuencia en 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 un registro de cuentas pirateado se repita un millón de veces)
- Tener diferentes usuarios de aplicaciones de bases de datos para diferentes servicios (por ejemplo, uso transaccional vs. 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 estas restricciones dinámicas, o al menos configurables. De esta forma, mientras está bajo ataque, puede establecer límites temporales agresivos (''estrangulando'' el ataque), como una sola sesión por usuario y sin acceso anónimo. Esto ciertamente no es bueno para sus clientes, pero es mucho mejor que no tener ningún servicio.
Por último, pero no menos importante, escriba un documento del Plan de respuesta de DOS y obtenga la revisión interna de todas las partes relevantes: empresas, administración, el equipo de desarrollo SW, 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 los ayuden a estar preparados en caso de que ocurra lo peor a las 3 de la mañana en su día libre. El documento debe cubrir (entre otras cosas):
- Lo que está en riesgo y el costo para el negocio
- Medidas tomadas para proteger los activos
- Cómo se detecta un ataque
- La respuesta planificada y el procedimiento de escalación
- Procesos para mantener el sistema y este documento actualizado
Entonces, a un lado del preámbulo, aquí hay algunas respuestas específicas:
Los DDOS generalmente están bloqueados en un nivel de servidor, ¿verdad?
En realidad, la mayoría de los peores ataques DDOS son de bajo nivel (a nivel de paquete IP) y son manejados por reglas de enrutamiento, firewalls y dispositivos de seguridad desarrollados para manejar ataques DDOS.
¿Hay alguna manera de bloquearlo en un nivel de PHP, o al menos reducirlo?
Algunos ataques DDOS están dirigidos a la aplicación en sí misma, enviando URI válidos y solicitudes HTTP. Cuando la tasa de solicitudes aumenta, su (s) servidor (es) comienza a tener problemas y tendrá un corte de SLA. En este caso, hay cosas que puedes hacer en el nivel de PHP:
Monitoreo de 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 medidas 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 analice con herramientas de línea de comandos (grep, sed, awk). Recuerde que un DDOS generará millones de líneas de registro. Es probable que necesite cortar sus registros (especialmente con respecto a URI, hora, IP y usuario) para averiguar qué está sucediendo y necesita generar datos como:
- A qué URI se está accediendo
- ¿Qué URI están fallando a una tasa alta (un indicador probable de los URI específicos a los que atacan los atacantes)?
- Qué usuarios están accediendo al servicio
- Cuántas IPs cada usuario accede al servicio desde
- Qué URI son usuarios anónimos que acceden
- Qué argumentos se usan para un servicio determinado
- Auditar acciones de usuarios específicos
Registre la dirección IP de cada solicitud. NO invierta DNS esto - irónicamente, el costo de hacer esto hace que un DDoS sea más fácil para los atacantes
- Registre todo el URI y el método HTTP, por ejemplo, "GET http://example.com/path/to/service?arg1=ddos "
- Registre la identificación del usuario si está presente
- Registre argumentos HTTP importantes
Límites de frecuencia razonables: puede implementar límites sobre cuántas solicitudes puede realizar una IP o un usuario determinado en un período de tiempo determinado. ¿Podría un cliente legítimo hacer 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 sea una persona, no un robot DDOS.
¿Cuál es la forma más rápida y más común de detener los ataques DDOS?
El más rápido es probablemente ceder ante el chantaje, aunque esto podría no ser deseable.
De lo contrario, lo primero que debe hacer es ponerse en contacto con su proveedor de hosting y / o CDN y trabajar con ellos (si no lo han contactado, ya se está preguntando qué demonios está pasando ...). Cuando se produce una DDOS, es probable que afecte de forma colateral 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 y cualquier información) con el proveedor; estos registros, combinados con sus monitores de red, juntos pueden proporcionar suficiente información para bloquear / mitigar el ataque.
Si está esperando un DDOS, es una muy buena idea calificar a su proveedor de hosting en el nivel de protección que puede proporcionar. Deben tener experiencia DDOS y herramientas para mitigarlo: comprender sus herramientas, procesos y procedimientos de escalamiento. También pregunte qué tipo de soporte tiene el proveedor de hosting de sus proveedores originales. Estos servicios pueden significar un costo más adelantado o mensual, pero trátelo como una póliza de seguro.
Mientras te encuentres bajo ataque, necesitarás agarrar tus registros y explotarlos: prueba y resuelve el patrón del ataque. Debe considerar desactivar el acceso anónimo y estrangular los servicios bajo ataque (es decir, disminuir el límite de tasa 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 de sus clientes válidos. Si este es el caso, puede cambiar a un enfoque de lista blanca por un tiempo breve. 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://.com/a/1029613/1395668
DDoS se maneja mejor con dispositivos de red muy costosos y especialmente diseñados. Los anfitriones generalmente no son buenos para hacer protección 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 DDoS o un servicio de mitigación DDoS, pero está lejos de ser ideal y todavía te deja en riesgo de ataque.
De acuerdo con la parte PHP de la pregunta;
Aunque no confío en PHP para esto, podría implementarse, pero debe considerar todas estas posibilidades o más;
- El atacante puede cambiar el IP para cada solicitud
- El atacante puede pasar el (los) parámetro (s) al URI que al sitio objetivo no le importa estos parámetros.
- El atacante puede reiniciar la sesión antes de la expiración ...
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;
?>
El nivel de php es demasiado tarde en la cadena de solicitud.
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.
Ver: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ para http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ cómo combatir la colisión tiene ataques DoS.
También lo olvidé por completo, http://www.cloudflare.com es uno de los mejores cortafuegos de aplicaciones web gratuitas, tienen planes gratuitos y de pago, y salvarán tu trasero de DDOS. Lo usamos para muchos de nuestros sitios con mucho tráfico solo por sus capacidades de almacenamiento en caché . ¡Es impresionante!
Hay complementos que puede usar en apache para ddos / dos. Buen comienzo aquí http://www.debianadmin.com/how-to-protect-apache-against-dosddos-or-brute-force-attacks.html
Si estás en LEMP, puedes consultar aquí. http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
Estos son buenos puntos de partida económicos.
Los DDOS generalmente están bloqueados en un nivel de servidor. Habilite la protección DDOS en su nivel de servidor. Por favor, consulte las notas a continuación para las protecciones DDOS.
Configuraciones de configuración del servidor Apache HTTP que pueden ayudar a prevenir problemas de DDOS:
La directiva RequestReadTimeout permite limitar el tiempo que un cliente puede tomar para 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
Permita 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 (a excepción del límite otorgado 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 apagan los keepalives completamente a través de KeepAlive, lo que tiene, por supuesto, otros inconvenientes en el rendimiento. Deben verificarse los valores de varias directivas relacionadas con tiempo de espera proporcionadas por otros módulos.
Las directivas LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine y LimitXMLRequestBody deben configurarse cuidadosamente para limitar el consumo de recursos desencadenado por la entrada del cliente. Sintonice la directiva MaxRequestWorkers para permitir que el servidor maneje la cantidad máxima de conexiones simultáneas sin quedarse sin recursos.
No puedes hacer esto en el nivel de 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
Pasos anti DDOS :
- La primera cosa importante es identificar primero el ataque ddos. Identificar el ataque ddos más temprano significa más para su servidor.
- Obtener un mejor ancho de banda disponible para su servidor. Mantenga siempre el ancho de banda más que suficiente para su servidor. Esto no evitará el ataque DDOS, pero llevará más tiempo. Por el cual obtendrás algo más de tiempo para actuar.
- Si posee su propio servidor web, puede defender el parámetro de red limitando la tasa de su enrutador, agregar filtros para colocar paquetes en diferentes fuentes de ataques, agotar el tiempo de conexión medio abierta de forma más agresiva. Establezca también umbrales de caída de inundación inferiores de SYN, ICMP y UDP.
- Si no tiene mucha información acerca de estas cosas, comuníquese con sus proveedores de hosting 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 compañías. Por el cual pueden ayudarte a prevenir los ataques DDOS. Además, muchas compañías ofrecen protección y protección contra ddos baratos.
Para obtener más información, http://buckydroid.com/ddos-attack-protection-mitigation/ ( http://buckydroid.com/ddos-attack-protection-mitigation/ )
NO use protección basada en PHP, ¡es horrible y apenas tendrá impacto! Configure su servidor web para solicitudes de límite de velocidad, 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, sin embargo no ataques basados en la capa 7 a menos que esté dispuesto a pagar.