요청 또는 사용자 에이전트없이 로그에서 408 오류 발생


답변:


29

Elastic Load Balancer 뒤에서 Amazon에서 웹 서버를 실행할 가능성이 있습니까?

그들의 건강 점검으로 인해 많은 408 개의 응답을 생성하는 것 같습니다 .

해당 포럼 스레드의 일부 솔루션은 다음과 같습니다.

  • RequestReadTimeout header=0 body=0

    요청 시간이 초과되면 408 응답이 비활성화됩니다.

  • ELB 상태 확인을 다른 포트로 변경하십시오.
  • 다음을 사용하여 ELB IP 주소에 대한 로깅을 비활성화하십시오.

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

그리고이 블로그 게시물에서 :

  • 요청 시간 제한을 60 이상으로 조정하십시오.

2
내 이해에 이것은 slowloris 공격에 노출됩니다, 괜찮은 reqtimeout이 요즘 아파치를 사용하는 모든 사람에게 유용한 것 같습니다
neofutur

ELB 뒤에 있다면 slowloris는 문제가되지 않습니다.
Ladadadada

2
RequestReadTimeout header=0 body=0겠습니까이 해제 요청이 모두 함께 시간 초과 읽고, 나는이 권하고 싶지 않다
mikejonesey

@Ladadadada http가 tcp 프록시로 작동하기 때문에 여전히 느린 로리 스 보호가 필요하다고 생각합니다 .offloaded가 tcp가 아닌 http 요청을 전달하면 https가 느린 연결에 대한 필터가 없으며 응답 시간이 초과됩니다.
mikejonesey

@Ladadadada, ELB 또는 ALB는 slowloris에 대해 거의 도움이되지 않으며 대부분의 웹 서버에 영향을 미칩니다. 내 AWS 질문 및 문제는 here : forums.aws.amazon.com/thread.jspa?threadID=269176
Cristiano Coelho

9

무언가가 포트에 연결되어 있고 데이터를 보내지 않습니다. HTTP 408은 "시간 초과"오류입니다. 여기에 좋은 글이 있습니다 : http://www.checkupdown.com/status/E408.html


1
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
kasperd

빈 요청에 대해 408 개의 IP를받는 100 개 이상의 IP 목록을 살펴본 결과 대다수가 중국 본토 출신이며 문제가 주로 혼잡과 관련이있는 것 같습니다. 정체로 인해 연결 설정이 성공했지만 요청 헤더가 전송되지 않았습니다. 중국의 크로스 보더 대역폭은 매우 과부하 상태이며 비 본토 연결도 빈 상태로 브라질, 유럽 및 미국 농촌에서 흩어져 있었으며 미국 서해안 서버에 도달하는 데 비슷한 문제가 있습니다.
ClearCrescendo

8

여기에 이미 몇 가지 좋은 답변이 있지만 구체적으로 언급되지 않은 추가 메모 하나를 위험에 빠뜨리고 싶습니다. 이전의 많은 주석가가 이미 언급했듯이 408은 시간 초과를 나타냅니다. 웹 서버에서 시간 초과가 발생하는 상황이 많이 있습니다.

따라서 서버에서 악용 여부를 검사하는 다양한 경우 408 오류가 발생할 수 있습니다. 이러한 경우 클라이언트는 사용자 에이전트를 거의 나타내지 않고 갑자기 연결을 종료하여 해당 연결이 중단되어 408 오류가 발생할 수 있습니다.

예를 들어, 나는 여전히 POODLE 취약점에 취약한 컴퓨터를 인터넷에서 검색하는 끔찍한 해커라고 가정 해 봅시다. 따라서 SSL 버전 3을 허용하는 서버를 찾기 위해 많은 양의 IP 주소에 대한 연결을 여는 스크립트를 작성했습니다. 나중에 해당 목록을 사용하여 POODLE 익스플로잇을 구체적으로 스캔합니다. 이 첫 번째 스크립트는 다음과 같이 openssl을 사용하여 SSLv3을 확인하는 연결을 설정합니다.

openssl s_client -connect [IP]:443 -ssl3

이 명령은 많은 Apache 구성에서 설명한대로 408 메시지를 생성합니다. 내 두 대의 서버에서이 명령을 수행하면 액세스 로그에 다음 항목이 생성되었습니다.

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

OP가 어떤 형태의로드 밸런싱을 사용하지 않는 상황에서도 여러 가지 상황에서 408 오류가 발생할 수 있습니다. 일부는 악의적이며 일부는 클라이언트에 문제가 있음을 나타내고 일부는 서버에 문제가 있음을 나타냅니다. (OP에서 제공 한 로그에서 로컬 IP가 원격 IP로 표시되었지만 OP는로드 밸런서 사용을 구체적으로 언급하지 않았으므로 OP가 단순히 라우팅 할 수없는 IP를 목적으로 사용했는지 확실하지 않았습니다. URL과 마찬가지로 데모

어쨌든 내 게시물이 분명히 늦게 OP에 도움이되기에 너무 늦었더라도 희망하는 시간 초과 오류에 대한 해결책을 찾고 여기에 도착하는 다른 사람들을 도울 수 있습니다.


6

408 타임 아웃에는 여러 가지 이유가 있습니다. 그러나 모든 것이 괜찮다는 전제에서 시작하여 어느 시점에서이 408이 액세스 로그에 나타나기 시작합니다 (예 : 408 0 "-" "-").

많은 사람들이 인터넷에서 지적한 것처럼 408은 연결이 이루어졌지만 적절한 시간 단위로 요청이 전송되지 않았 음을 나타내므로 서버는 408과 연결을 끊습니다. 오만한 한 사람이 - "시간 초과의 어떤 부분을 이해하지 못합니까?"

나는 이것이 초보 답변이라고 생각하며 일부 보안 방법이 웹 서버 소프트웨어에서 어떻게 작동하는지 완전히 이해하지 못하고 있음을 보여줍니다.

그래서 처음으로 돌아가서, 왜이 모든 408을 보게됩니까? 우리가 서버를 관리하는 다른 사람들과 공통점이있는 한 가지는 매일받는 대규모 공격입니다. 자, 이것들에 대해 무엇을하십니까? 글쎄 : 선택한 보안 방법을 사용하여이를 처리 할 수 ​​있습니다.

아주 쉬운 예를 들어 보자. IP 주소 삭제. iptabes 파일 (rules.v4)에 "-A ufw-user-input -s 37.58.64.228 -j DROP"이 포함되어 있습니다. 방화벽은 IP를 인식하고 연결을 끊습니다. 많은 구성에서 문을 두드리는 것을 알지 못할 것입니다.

이제 몇 가지 기준에 따라 연결을 끊는 고급 예를 들어 보겠습니다. iptabes 파일 (rules.v4)에 "-A INPUT -p tcp -m tcp --dport 80 -m string --string"cgi "--algo bm --to 1000 -j DROP"가 있습니다. 이 iptable 규칙에서 요청 문자열의 처음 1000 바이트를보고 "cgi"의 하위 문자열을 찾을 수 있는지 확인하고 해당 하위 문자열을 찾으면 아무 것도 가지지 않기 때문에 다릅니다 또한 연결을 끊기 만하면됩니다.

여기서 보안 방법은 좋지만 로그가 오도되는 한 좋습니다. 408 0 "-" "-"는 이러한 상황에서 가장 좋은 아파치입니다. 규칙이 연결을 끊는 기준을 충족했기 때문에 연결이 이루어지고 문자열 비교 규칙을 적용하기 위해 요청이 어느 시점까지 수락되어야했습니다. 그래서, 우리의 작은 초보자 사랑 자들은 그들이 시도한다면 더 잘못 될 수 없었습니다. 연결되고 요청이 수신되었습니다 (이러한 상황에서는 표시되지 않습니다). 408이 생성되었지만 'Timeout'이 아닙니다. 방화벽 규칙과 관련하여 요청이 이루어진 후 서버가 단순히 연결을 끊었습니다. 동일한 408 상황을 생성하는 다른 많은 규칙이 있습니다. 님'

이상적으로 또 다른 Apache 생성 오류 코드가있을 것입니다. 예를 들어 '499'는 '서버가 귀하의 요청을 읽고 결정한 것으로 귀찮게 할 수 없음-Sod Off HaHa'를 의미합니다.

최신 웹 서버 소프트웨어를 사용하면 DOS 공격을 실질적으로 배제 할 수 있으며 예측 기능을 통합 한 새로운 브라우저는이 문제를 일으키지 않습니다.

요컨대, 408은 서버가 요청에 응답하지 않았기 때문에 생성되는데, 클라이언트가 연결 시간 초과에 관한 한, 실제로 서버가 요청을 읽지 만 시간 종료 대기 이외의 이유로 연결을 끊은 경우 요청.


2
그러나 연결을 끊었 습니까? 우리는 이것이 클라이언트 로그가 아니라 서버 로그라는 것을 알고 있습니다.
Erick Robertson

5

우리는이 문제를 매우 오랫동안 당황했습니다. 우리가 생각 해낸 최고의 솔루션은 AWS 지원의 ELB 팀이 제안한 것입니다. 기본적으로 httpd 서버의 시간 초과 설정이 ELB idle timeout설정 보다 큽니다 (기본값 : 60 초).

  • 아파치 Timeout지시어 값이 idle timeoutELB 설정의 두 배 인지 확인하십시오 .
  • 온 켜고 KeepAlive, 기능이 보장 MaxKeepAliveRequests합니다 (0 무한 또는 매우 높은, 2000 등) 매우 큰, 그것은 KeepAliveTimeout당신의 ELB의보다 큰 idle timeout.

우리는 KeepAlive(및 관련 설정) 설정이 특히 408의 양을 효과적으로 0으로 줄였습니다.


불행히도, 나는 Elastic Beanstalk를 사용하고 있습니다. 이 옵션을 사용할 수 없습니다.
Erick Robertson

3

AWS Elastic Load Balancer 뒤에이 문제가있었습니다. 상태 확인은 로그에 엄청난 양의 408 응답을 생성했습니다.

나를 위해 일한 유일한 솔루션은 Load Balancer의 유휴 시간 초과 설정을 상태 확인의 응답 시간 초과 보다 낮게 설정하는 것 입니다.


0

동료는 최근에 마지막 게시물에 408이 보안 조치와 연관 될 수있는 방법에 대한 올바른 설명을 제공했지만 해결책을 제시하지 않았다고 말했습니다.

파이프 액세스 로그는 내 개인 솔루션입니다.

다음은 대부분의 우분투 구성에서 기본적으로 작동하며 다른 Apache 구성에서는 최소한의 땜질로 작동합니다. 가장 이해하기 쉽기 때문에 PHP를 선택했습니다. 두 개의 스크립트가 있습니다. 첫 번째 스크립트는 408이 액세스 로그에 기록되지 않도록합니다. 두 번째 스크립트는 모든 408을 별도의 로그 파일로 보냅니다. 어느 쪽이든 결과는 액세스 로그에 더 이상 408이 아닙니다. 구현할 스크립트를 선택하십시오.

좋아하는 텍스트 편집기를 사용하십시오. 저는 nano를 사용합니다. 'LogFormat'및 'CustomLog'지시문이있는 파일을여십시오. 평소 #로 원고를 주석 처리하고 다음을 추가하십시오. 이러한 지시문은 아래 파일에서 찾을 수 있습니다.

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

참고 : 액세스 로그에 이미지를 기록하지 않습니다. 내 etc / apache2 / httpd.conf 파일에 줄을 포함시킵니다.

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

이것이 관심이 없다면 지시어 env=!dontlog에서 를 제거하십시오 CustomLog.

이제 다음 PHP 스크립트 중 하나 (생성 #!/usr/bin/php위치가 사용자의 시스템에 맞게 설정되어 있는지 확인 인터프리터의 위치에 대한 참조입니다 - 당신은 프롬프트 $에 입력하여이 작업을 수행 할 수 있습니다 whereis php-이 같은 뭔가를 반환해야 php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz당신으로. #!/usr/bin/php내 설정에 맞는 것을 볼 수 있습니다 ).

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);
      }
    }
  }
?>

PipedAccessLog.php스크립트 를 저장했습니다 . $ 프롬프트에서 다음을 실행하여 root에게 소유권이 있는지 확인하십시오.

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

PipedAccessLog.php스크립트는 읽기 / 쓰기 및 사용 권한이 너무 프롬프트 $에서 다음을 실행 실행해야합니다.

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

마지막으로 모든 작업을 수행하려면 Apache 서비스를 다시 시작해야합니다. $ 프롬프트에서 다음을 실행하십시오.

sudo service apache2 restart

Apache 로그가 다른 곳에 있으면 구성에 맞게 경로를 변경하십시오. 행운을 빕니다.


6
408이 발생하면 이유를 파악하고 제거해야합니다. 단순히 파일을 기록하거나 다른 파일로 파이프하는 것을 막는 것은 서버 시간 낭비입니다. 또한 문제를 숨기는 역할도합니다. 침대 밑에있는 모든 것을 밀어서 방을 청소하는 것과 같습니다.
Erick Robertson

-2

숫자와 빈도 모두에서 408 오류가 증가하고 있음을 발견했습니다. IP 주소의 출처도 증가하고 있습니다 (이것들은 그들 자신의 별도 파일에 기록됩니다). 또한 발신자가 주기적 패턴으로 약 2 초 또는 3 초 간격으로 연결을 시도한다는 점에서 정상적인 서버 시간 초과로 인한 것이 아닌 동일한 IP 그룹에서 연속 408을 표시하는 명백한 로그 패턴이 있습니다 (다른 시간 이전에 시간 초과를 기다리지 않음) 연결 시도) 나는 이것을 단순한 DDOS 스타일 연결 시도로 본다. 제 생각에 이것은 서버가 온라인 상태라는 발신자에 대한 확인 메시지의 유형입니다 ... 그런 다음 다른 도구와 함께 돌아옵니다 .... 시간 초과 간격을 늘리면 단순히 더 큰 time_allocation을 실행하게됩니다. 내부의 해킹 프로그램

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.