リクエストまたはユーザーエージェントなしでログに408エラーが表示される


回答:


29

AmazonでElastic Load Balancerの背後でWebサーバーを実行していますか?

彼らは彼らの健康チェックのために多くの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は、Apache使用して、今日、誰のために有用であると思わ持つ
neofutur

ELBの背後にいる場合、スローロリスは問題になりません。
ラダダダダ14年

2
RequestReadTimeout header=0 body=0要求読み取りタイムアウトをすべて一緒に無効にします。これはお勧めしません
-mikejonesey

@Ladadadada httpはtcpプロキシとして機能するため、低速ロリス保護が必要だと思います。オフロードがtcpではなくhttp要求を転送する場合はhttpsですが、低速接続用のフィルターはなく、応答にはタイムアウトしかありません。
mikejonesey

@Ladadadada、あなたは間違っています、ELBまたはALBはslowlorisに対してほとんど何も役に立たず、ほとんどのWebサーバーに影響します、AWSの質問と問題を参照してください:forums.aws.amazon.com/thread.jspa?threadID = 269176
クリスティアーノコエーリョ

9

ポートに何かが接続され、その後データが送信されない。HTTP 408は「タイムアウト」エラーです。ここに良い記事があります:http ://www.checkupdown.com/status/E408.html


1
このリンクは質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供する方が良いでしょう。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
カスペルド

空のリクエストに対して408を受信する100以上のIPのリストを調べたところ、大半が中国本土からのものであることがわかり、問題は主に輻輳に関連していると思われます。接続セットアップは成功するが、リクエストヘッダーは送信されないという輻輳。中国からの国境を越えた帯域幅は非常に過負荷であり、空の本土以外の接続もブラジル、ヨーロッパ、米国西部のサーバーに到達する際に同様の問題を抱えている可能性があります。
ClearCrescendo

8

ここには既にかなり良い回答がありますが、特に言及されていない追加の注意事項を1つ危険にさらしたいと思います。以前のコメンターの多くがすでに言及したように、408はタイムアウトを示します。また、Webサーバーでタイムアウトが発生する状況は非常に多くあります。

つまり、サーバーが悪用のためにスキャンされているさまざまな場合に、408エラーが生成される可能性があります。このような場合、クライアントがユーザーエージェントを提示することはほとんどなく、接続が突然終了することが多く、その結果、408エラーを生成する可能性のあるその接続のシャットダウンが終了します。

たとえば、私がPOODLEの脆弱性に対してまだ脆弱なコンピューターを探してインターネットをスキャンしている卑劣なハッカーだとしましょう。そのため、SSLバージョン3を受け入れるサーバーを見つけるために、IPアドレスの大きなチャンクへの接続を開くスクリプトを作成しました。後でこのリストを使用して、POODLEエクスプロイトをスキャンします。この最初のスクリプトは、次のようにopensslを使用してSSLv3を確認する接続を確立するだけです。

openssl s_client -connect [IP]:443 -ssl3

このコマンドは、Apacheの多くの構成で、説明したとおりに408メッセージになります。自分の2台のサーバーでこのコマンドを実行すると、アクセスログに次のエントリが記録されます。

<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との接続をドロップします。 -「タイムアウトのどの部分を理解していないか」。

これは非常に初心者の答えであり、一部のセキュリティ手法がWebサーバーソフトウェアでどのように機能するかについて完全に理解されていないことを示しています。

初めに戻って、なぜこれらの408がすべて表示されるのですか。サーバーを管理する他の人と共通することの1つは、毎日受ける膨大な量の攻撃です。さて、これらについてどうしますか?まあ:あなたはそれらに対処するために選択したセキュリティ方法を採用しています、これは何が変わるかです。

非常に簡単な例を見てみましょう。IPアドレスをドロップします。iptabesファイル(rules.v4)に含まれている「-A ufw-user-input -s 37.58.64.228 -j DROP」があります。そのため、37.58.64.228に伴い、ファイアウォールは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 "-" "-"は、これらの状況でできる最高のApacheです。接続が確立され、文字列比較ルールを適用するために要求をある程度まで受け入れて、最終的に408になります。これは、ルールが接続のドロップ基準を満たすためです。だから、私たちの小さな初心者のダーリンたちは、彼らが試みたなら、もっと間違っているはずがない。接続が確立され、リクエストが受信されました(これらの状況では、単にそれを見ることができません)。408は生成されますが、「タイムアウト」ではありません。ファイアウォールルールに関連してリクエストが行われた後、サーバーは単に接続をドロップしました。同じ状況を作り出す他の多くのルールがあります。ドン'

理想的には、Apacheが生成した別のエラーコードがあります。たとえば、「499」は「サーバーがリクエストを読み取り、それを決定するだけで面白くなりませんでした-Sod Off HaHa」を意味します。

最新のWebサーバーソフトウェアを使用すると、DOS攻撃を実質的に除外できます。また、予測機能を組み込んだブラウザーの新しい遺伝子は、この問題を引き起こしません。

要するに、サーバーがリクエストに応答しなかったため、クライアントが接続がタイムアウトになったため、実際にはサーバーがリクエストを読み取りましたが、タイムアウト以外の理由で接続を切断したため、408が生成されますリクエスト。


2
しかし、なぜ接続が切断されたのですか?これはクライアントログではなくサーバーログです。
エリックロバートソン

5

私たちはこの非常に問題を抱えており、かなり長い間それについて困惑していました。私たちが思いついた最適なソリューションは、AWSサポートのELBチームによって提案されました。基本的には、httpdサーバーのタイムアウト設定がすべてELB idle timeout設定(デフォルトは60秒)よりも大きいことを確認することにかかっています。

  • apache Timeoutディレクティブの値がidle timeoutELBの設定の2倍であることを確認してください。
  • このKeepAlive機能をオンにし、それMaxKeepAliveRequestsが非常に大きい(無限の場合は0または2000などの非常に高い)こと、およびKeepAliveTimeoutELBより大きいことを確認しますidle timeout

私たちは、ことがわかったKeepAlive(私たちはいくつかが、非常に少数を参照してください)(および関連する設定)は、具体的効果的に0に408sの量を低減した設定します。


残念ながら、私はElastic Beanstalkを使用しています。これらのオプションは利用できません。
エリックロバートソン

3

AWS Elastic Load Balancerの背後にこの問題がありました。ヘルスチェックにより、ログにひどい量の408応答が生成されました。

私のために働いた唯一の解決策は、ロードバランサーのアイドルタイムアウト設定をヘルスチェックの応答タイムアウトよりも低くすることでした。


0

同僚は最近、私の最後の投稿では、408がセキュリティ対策とどのように関連付けられるかについて有効な説明を行ったが、解決策を提供しなかったと述べました。

Piped Accessログは私の個人的なソリューションです。

以下は、ほとんどのUbuntu構成ですぐに使用でき、他のApache構成では最小限の変更で動作するはずです。PHPを選択したのは、最も簡単に理解できるからです。2つのスクリプトがあります。最初のスクリプトは、408がアクセスログに書き込まれるのを防ぎます。2番目のスクリプトは、すべての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=!dontlogCustomLogディレクティブから削除します。

今、(次のPHPスクリプトの1つを作成する#!/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が発生している場合は、理由を把握してそれらを取り除く必要があります。それらがログに記録されないようにするか、別のファイルにパイプするだけでは、サーバー時間の無駄です。また、問題を隠すだけです。それは、ベッドの下にすべてを押し込んで部屋を掃除するようなものです。
エリックロバートソン

-2

408エラーが数と頻度の両方で増加していることがわかりました。発信元のIPアドレスの範囲も拡大しています(これらは独自の個別のファイルに記録されます)。また、IPの同じグループからの連続した408を表示する明らかなログパターンがあります。これは、通常のサーバータイムアウトによるものではなく、発信者が周期的に約2秒または3秒間隔で接続を試行しています接続試行)これらは、単純なDDOSスタイルの接続試行と見なされます。私の意見では、これらはサーバーがオンラインになっていることを発信者に確認するメッセージの一種です...その後、後で別のツールで戻ってきます...内部のハッキングプログラム。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.