Obteniendo 408 errores en nuestros registros sin solicitud o agente de usuario


Respuestas:


29

¿Está por casualidad ejecutando sus servidores web en Amazon detrás de un Elastic Load Balancer?

Parece que generan 408 respuestas debido a sus controles de salud .

Algunas de las soluciones de ese hilo del foro:

  • RequestReadTimeout header=0 body=0

    Esto deshabilita las 408 respuestas si se agota el tiempo de espera de una solicitud.

  • Cambie la comprobación de estado de ELB a un puerto diferente.
  • Inhabilite el registro de las direcciones IP de ELB con:

    SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
    CustomLog logs/access_log common env=!exclude_from_log
    

Y de esta publicación de blog :

  • Ajuste el tiempo de espera de su solicitud a 60 o más.

2
Según tengo entendido, esto lo expondrá al ataque de slowloris, tener un tiempo de espera decente parece ser útil hoy en día para cualquiera que use apache
neofutur

Si está detrás de un ELB, slowloris no es un problema.
Ladadadada

2
RequestReadTimeout header=0 body=0pediría desactivar leer tiempo de espera de todos juntos, que no recomendaría este
mikejonesey

@Ladadadada Creo que aún necesita protección lenta de loris ya que http funciona como un proxy tcp, https si está descargado reenviará las solicitudes http en lugar de tcp, sin embargo, no hay filtros para conexiones lentas, solo hay un tiempo de espera para la respuesta.
mikejonesey

@Ladadadada, está equivocado, ELB o ALB hacen poco o nada para ayudar contra slowloris y afectará a la mayoría de los servidores web, vea mi pregunta y problema de AWS aquí: forum.aws.amazon.com/thread.jspa?threadID=269176
Cristiano Coelho

9

Algo se conecta al puerto y luego nunca envía datos. HTTP 408 es un error de "tiempo de espera". Hay una buena reseña aquí: http://www.checkupdown.com/status/E408.html


1
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
kasperd

Después de buscar una lista de más de 100 IP que reciben 408 para sus solicitudes vacías, es evidente que la mayoría son de China continental y sospecho que el problema está relacionado principalmente con la congestión. La congestión resulta en una configuración de conexión exitosa pero el encabezado de la solicitud no se envía. El ancho de banda transfronterizo de China está muy sobrecargado y las conexiones no continentales que también llegaron vacías se dispersaron desde Brasil, Europa y las zonas rurales de EE. UU. Que posiblemente tengan problemas similares para llegar a un servidor de la costa oeste de EE. UU.
ClearCrescendo

8

Ya hay bastantes buenas respuestas aquí, pero me gustaría arriesgar una nota adicional que no se ha abordado específicamente. Como muchos de los comentaristas anteriores ya mencionados, 408 indica un tiempo de espera; y hay una gran variedad de circunstancias en las que los tiempos de espera se producen en un servidor web.

Dicho esto, se pueden generar 408 errores en una variedad de casos en los que se explora su servidor en busca de vulnerabilidades. En tales casos, los clientes rara vez presentan un agente de usuario y, a menudo, finalizan las conexiones abruptamente, lo que resulta en un cierre abortivo de esa conexión que puede generar un error 408.

Por ejemplo, digamos que soy un pirata informático que está escaneando Internet para buscar computadoras que aún son vulnerables a la vulnerabilidad POODLE. Como tal, he escrito un script que abre conexiones a grandes porciones de direcciones IP para encontrar servidores que acepten la versión 3 de SSL; más adelante usaré esa lista para buscar específicamente el exploit POODLE. Todo lo que hace este primer script es establecer una conexión usando openssl para verificar SSLv3, así:

openssl s_client -connect [IP]:443 -ssl3

Este comando, en muchas configuraciones de Apache, dará como resultado un mensaje 408 exactamente como lo ha descrito. La ejecución de este comando en dos de mis propios servidores resultó en esta entrada al registro de acceso:

<remote IP address>  - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"

Quería aclarar esto, ya que incluso en una situación en la que OP no estaba utilizando ninguna forma de equilibrio de carga, pueden producirse errores 408 en una variedad de circunstancias: algunas maliciosas, algunas que indican problemas con el cliente y otras que indican problemas con el servidor. (Noté en el registro proporcionado por OP que una IP local se indicaba como IP remota, pero OP no mencionó específicamente el uso de un equilibrador de carga, por lo que no estaba seguro de si OP simplemente había usado una IP no enrutable para los fines de demostración, como lo hizo con la URL)

De todos modos, aunque mi publicación es obviamente demasiado tarde en el día para ayudar al OP, espero que pueda ayudar a otros que llegan aquí en busca de una solución a todos esos malditos errores de tiempo de espera.


6

Hay varias razones para un tiempo de espera 408. Pero comencemos con la premisa de que todo está bien, en algún momento estos 408 comienzan a aparecer en su registro de acceso, es decir, 408 0 "-" "-".

Como muchos señalan en la red, un 408 representa que se realiza una conexión, pero no se envía ninguna solicitud en la escala de tiempo apropiada, por lo tanto, el servidor interrumpe la conexión con un 408. Un individuo arrogante realmente respondió a alguien pidiendo ayuda sobre este tema con - "¿Qué parte de Timeout no entiendes?".

Creo que es una respuesta novata y demuestra una total falta de comprensión de cómo funcionan algunos métodos de seguridad con el software de servidor web.

Volviendo al principio, ¿por qué estoy viendo todos estos 408? Una cosa que tendrá en común con el resto de nosotros que administramos un servidor es la gran cantidad de ataques que recibe a diario. Ahora, ¿qué haces al respecto? Bueno: empleas los métodos de seguridad elegidos para lidiar con ellos, esto es lo que cambia.

Tomemos un ejemplo muy sencillo: soltar una dirección IP. Incluido en un archivo iptabes (rules.v4) tiene "-A ufw-user-input -s 37.58.64.228 -j DROP". Entonces viene 37.58.64.228, el firewall reconoce la IP y desconecta la conexión. En muchas configuraciones, ni siquiera sabría que llamaron a la puerta.

Ahora tomemos un ejemplo más avanzado: desconecte la conexión según algunos criterios. Incluido en un archivo iptabes (rules.v4) tiene "-A INPUT -p tcp -m tcp --dport 80 -m string --string" cgi "--algo bm --to 1000 -j DROP". Esto es diferente porque en esta regla de iptable estamos diciendo que mire los primeros 1000 bytes de la cadena de solicitud y vea si puede encontrar una subcadena de "cgi" y si encuentra esa subcadena, entonces no vaya a ninguna Además, simplemente deje caer la conexión.

Aquí el método de seguridad es bueno, pero en lo que respecta a sus registros, es engañoso. El 408 0 "-" "-" generado es lo mejor que apache puede hacer en estas circunstancias. Se realizó la conexión y la solicitud tuvo que ser aceptada hasta cierto punto para aplicar la regla de comparación de cadenas que finalmente resulta en un 408 porque su regla cumplió con los criterios para que la conexión se elimine. Entonces, nuestras pequeñas queridas novicias no podrían estar más equivocadas si lo intentaran. Se realizó una conexión y se recibió una solicitud (en estas circunstancias no tendrá visibilidad). Aunque se genera un 408, no es un 'Tiempo de espera'; su servidor simplemente cortó la conexión después de que la solicitud se realizó en asociación con su regla de firewall. Hay muchas otras reglas, que crearían la misma situación. Don'

Idealmente, habría otro Código de error generado por Apache, por ejemplo, '499', que significaría 'El servidor leyó su solicitud y decidió que simplemente no podría molestarse en entretenerlo: Sod Off HaHa'.

Con el último software de servidor web, prácticamente puede excluir los ataques de DOS y el nuevo gen de los navegadores que incorporan capacidades predictivas no causa este problema como algunos han sugerido.

En resumen, el 408 se genera porque el servidor no respondió a la solicitud, en lo que respecta al cliente, la conexión agotó el tiempo de espera, cuando en realidad el servidor leyó la solicitud pero interrumpió la conexión por razones distintas a un tiempo de espera una solicitud.


2
Pero ¿POR QUÉ dejó caer la conexión? Estamos viendo que esto es registros del servidor, no registros del cliente.
Erick Robertson

5

Tuvimos este mismo problema y lo desconcertamos durante bastante tiempo. La mejor solución que se nos ocurrió fue sugerida por el equipo ELB de AWS Support. Básicamente depende de garantizar que la configuración de tiempo de espera de su servidor httpd sea mayor que su idle timeoutconfiguración ELB (que por defecto es de 60 segundos).

  • Asegúrese de que el Timeoutvalor de su directiva apache sea ​​el doble de la idle timeoutconfiguración de su ELB.
  • Active la KeepAlivefunción, asegúrese de que MaxKeepAliveRequestssea ​​muy grande (0 para infinito o muy alto, como 2000), y que KeepAliveTimeoutsea ​​mayor que sus ELB idle timeout.

Descubrimos que la KeepAliveconfiguración (y la configuración asociada) redujo específicamente la cantidad de 408 a efectivamente 0 (vemos algunas, pero muy pocas).


Desafortunadamente, estoy usando Elastic Beanstalk. No tengo estas opciones disponibles para mí.
Erick Robertson

3

Tuve este problema detrás de AWS Elastic Load Balancer. Las comprobaciones de estado generaron una horrible cantidad de 408 respuestas en el registro.

La única solución que funcionó para mí era tener Tiempo de espera inactivo del equilibrador de carga de la configuración más baja que su tiempo de espera de respuesta de chequeo .


0

Un colega comentó recientemente que, si bien mi última publicación dio una explicación válida de cómo un 408 podría tener una asociación con una medida de seguridad, no ofreció ninguna solución.

El registro de acceso canalizado es mi solución personal.

Lo siguiente debería funcionar listo para usar en la mayoría de las configuraciones de Ubuntu, y con ajustes mínimos en otras configuraciones de Apache. Elegí PHP porque es el más fácil de entender. Hay dos scripts: el primero evita que se escriba un 408 en su registro de acceso. El segundo script envía todos los 408 a un archivo de registro separado. De cualquier manera, el resultado no es más 408 en su registro de acceso. Es su elección qué script implementar.

Usa tu editor de texto favorito, yo uso nano. Abra el archivo donde tiene sus directivas 'LogFormat' y 'CustomLog'. Comente los originales con el # habitual y agregue lo siguiente. Puede encontrar estas directivas en el archivo a continuación.

sudo nano / etc / apache2 / sites-available / default

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe

CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog

NOTA: No registro imágenes en mi registro de acceso. En mi archivo etc / apache2 / httpd.conf incluyo la línea

SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog

Si esto no le interesa, elimine el env=!dontlogde la CustomLogdirectiva.

Ahora cree uno de los siguientes scripts PHP ( #!/usr/bin/phpes una referencia a la ubicación del intérprete, asegúrese de que la ubicación sea correcta para su sistema; puede hacerlo escribiendo en el indicador $; whereis phpesto debería devolver algo como php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz. puede ver #!/usr/bin/phpes el correcto para mi configuración).

sudo nano /var/log/apache2/PipedAccessLog.php

#!/usr/bin/php
<?php
  $file = '/var/log/apache2/access.log';
  $no408 = '"-" 408 0 "-" "-"';
  $stdin = fopen ('php://stdin', 'r');
  ob_implicit_flush (true);
  while ($line = fgets ($stdin)) {
    if($line != "") {
      if(stristr($line,$no408,true) == "") {
        file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
      }
    }
  }
?>

sudo nano /var/log/apache2/PipedAccessLog.php

#!/usr/bin/php
<?php
  $file = '/var/log/apache2/access.log';
  $file408 = '/var/log/apache2/408.log';
  $no408 = '"-" 408 0 "-" "-"';
  $stdin = fopen ('php://stdin', 'r');
  ob_implicit_flush (true);
  while ($line = fgets ($stdin)) {
    if($line != "") {
      if(stristr($line,$no408,true) != "") {
        file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
      }
      else {
        file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
      }
    }
  }
?>

Habiendo guardado el PipedAccessLog.phpguión; asegúrese de que la raíz sea propietaria ejecutando lo siguiente en el indicador $.

sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php

El PipedAccessLog.phpscript necesitará permisos de lectura / escritura y ejecución, así que ejecute lo siguiente en el indicador $.

sudo chmod 755 /var/log/apache2/PipedAccessLog.php

Finalmente, para que todo funcione, debe reiniciar el servicio Apache. Ejecute lo siguiente en el indicador $.

sudo service apache2 restart

Si sus registros de Apache se encuentran en otro lugar, cambie las rutas para adaptarlas a su configuración. Buena suerte.


66
Si los 408 están sucediendo, tenemos que descubrir por qué y deshacernos de ellos. Simplemente evitar que se registren o canalizarlos a otro archivo es una pérdida de tiempo del servidor. También sirve para ocultar solo el problema. Es como limpiar tu habitación metiendo todo debajo de tu cama.
Erick Robertson

-2

He encontrado que 408 errores están aumentando tanto en número como en frecuencia. El rango de direcciones IP de las que se originan también está creciendo (estos se registran en su propio archivo separado). También hay patrones de registro evidentes que muestran 408 consecutivos de los mismos grupos de IP que no se deben a los tiempos de espera normales del servidor en el sentido de que el originador está intentando conexiones separadas unos 2 o 3 segundos en un patrón cíclico (no hay que esperar un tiempo de espera antes de otro intento de conexión) Los veo como simples intentos de conexión de estilo DDOS. En mi opinión, estos son un tipo de mensaje de confirmación para el creador de que un servidor está en línea ... luego regresan más tarde con diferentes herramientas ... Si aumenta su intervalo de tiempo de espera, simplemente les está dando una asignación de tiempo más grande para que se ejecuten sus programas de hack dentro.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.