回答:
AmazonでElastic Load Balancerの背後でWebサーバーを実行していますか?
彼らは彼らの健康チェックのために多くの408の応答を生成するようです。
そのフォーラムスレッドからのソリューションの一部:
RequestReadTimeout header=0 body=0
これにより、要求がタイムアウトした場合に408応答が無効になります。
次を使用して、ELB IPアドレスのロギングを無効にします。
SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
CustomLog logs/access_log common env=!exclude_from_log
そして、このブログ投稿から:
RequestReadTimeout header=0 body=0
要求読み取りタイムアウトをすべて一緒に無効にします。これはお勧めしません
ポートに何かが接続され、その後データが送信されない。HTTP 408は「タイムアウト」エラーです。ここに良い記事があります:http ://www.checkupdown.com/status/E408.html
ここには既にかなり良い回答がありますが、特に言及されていない追加の注意事項を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を助けることはできませんが、願わくば、ここに到着した他の人たちがそれらのすべてのタイムアウトエラーの解決策を探しているのを助けるかもしれません。
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が生成されますリクエスト。
私たちはこの非常に問題を抱えており、かなり長い間それについて困惑していました。私たちが思いついた最適なソリューションは、AWSサポートのELBチームによって提案されました。基本的には、httpdサーバーのタイムアウト設定がすべてELB idle timeout
設定(デフォルトは60秒)よりも大きいことを確認することにかかっています。
Timeout
ディレクティブの値がidle timeout
ELBの設定の2倍であることを確認してください。KeepAlive
機能をオンにし、それMaxKeepAliveRequests
が非常に大きい(無限の場合は0または2000などの非常に高い)こと、およびKeepAliveTimeout
ELBより大きいことを確認しますidle timeout
。私たちは、ことがわかったKeepAlive
(私たちはいくつかが、非常に少数を参照してください)(および関連する設定)は、具体的効果的に0に408sの量を低減した設定します。
AWS Elastic Load Balancerの背後にこの問題がありました。ヘルスチェックにより、ログにひどい量の408応答が生成されました。
私のために働いた唯一の解決策は、ロードバランサーのアイドルタイムアウト設定をヘルスチェックの応答タイムアウトよりも低くすることでした。
同僚は最近、私の最後の投稿では、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=!dontlog
、CustomLog
ディレクティブから削除します。
今、(次の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ログが他の場所にある場合は、構成に合わせてパスを変更します。がんばろう。
408エラーが数と頻度の両方で増加していることがわかりました。発信元のIPアドレスの範囲も拡大しています(これらは独自の個別のファイルに記録されます)。また、IPの同じグループからの連続した408を表示する明らかなログパターンがあります。これは、通常のサーバータイムアウトによるものではなく、発信者が周期的に約2秒または3秒間隔で接続を試行しています接続試行)これらは、単純なDDOSスタイルの接続試行と見なされます。私の意見では、これらはサーバーがオンラインになっていることを発信者に確認するメッセージの一種です...その後、後で別のツールで戻ってきます...内部のハッキングプログラム。