Mendapatkan 408 kesalahan pada log kami tanpa permintaan atau agen pengguna

36

Saya mendapatkan banyak permintaan muncul di log apache kami yang terlihat seperti ini

www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -

Tampaknya tidak ada permintaan dan tidak ada agen pengguna. Adakah yang pernah melihat ini sebelumnya?

Glenn Slaven
sumber

Jawaban:

29

Apakah Anda kebetulan menjalankan server web Anda di Amazon di belakang Elastic Load Balancer?

Tampaknya mereka menghasilkan banyak 408 tanggapan karena pemeriksaan kesehatan mereka .

Beberapa solusi dari utas forum itu:

  • RequestReadTimeout header=0 body=0

    Ini menonaktifkan 408 tanggapan jika permintaan habis.

  • Ubah pemeriksaan kesehatan ELB ke port lain.
  • Nonaktifkan logging untuk alamat IP ELB dengan:

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

Dan dari posting blog ini :

  • Sesuaikan batas waktu permintaan Anda menjadi 60 atau lebih.
Ladadadada
sumber
2
dalam pemahaman saya ini akan membuat Anda terkena serangan slowloris, memiliki reqtimeout yang layak tampaknya berguna saat ini bagi siapa saja yang menggunakan apache
neofutur
Jika Anda berada di belakang ELB, slowloris tidak menjadi masalah.
Ladadadada
2
RequestReadTimeout header=0 body=0akan menonaktifkan permintaan baca batas waktu bersama-sama, saya tidak akan merekomendasikan ini
mikejonesey
@Ladadada Saya pikir Anda masih membutuhkan perlindungan kukang karena http berfungsi sebagai proxy tcp, https jika dibongkar akan meneruskan permintaan http daripada tcp, namun tidak ada filter untuk koneksi lambat, hanya ada batas waktu untuk respons.
mikejonesey
@Ladadada Anda salah, ELB atau ALB tidak banyak membantu terhadap slowloris dan itu akan mempengaruhi sebagian besar server web, lihat pertanyaan dan masalah AWS saya di sini: forums.aws.amazon.com/thread.jspa?threadID=269176
Cristiano Coelho
9

Sesuatu terhubung ke port dan kemudian tidak pernah mengirim data. HTTP 408 adalah kesalahan "batas waktu". Ada artikel yang bagus di sini: http://www.checkupdown.com/status/E408.html

Insyte
sumber
1
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
kasperd
Baru saja melihat daftar 100+ IP yang menerima 408 untuk permintaan kosong, terlihat bahwa mayoritas berasal dari daratan Cina dan saya menduga bahwa masalahnya terutama terkait kemacetan. Kemacetan yang mengakibatkan penyetelan koneksi berhasil tetapi tajuk permintaan tidak terkirim. Bandwidth cross boarder dari Cina sangat kelebihan dan koneksi non daratan juga datang kosong adalah hamburan dari Brasil, Eropa dan pedesaan AS yang masuk akal memiliki masalah serupa dalam mencapai server US Coast Barat.
ClearCrescendo
8

Sudah ada beberapa jawaban bagus di sini, tetapi saya ingin membahayakan satu catatan tambahan yang belum secara khusus diatasi. Seperti banyak komentator sebelumnya telah sebutkan, 408 menunjukkan batas waktu; dan ada beberapa keadaan di mana timeout terjadi pada server web.

Dengan itu, 408 kesalahan dapat dihasilkan dalam berbagai kasus di mana server Anda dipindai untuk dieksploitasi. Klien dalam kasus seperti itu jarang menghadirkan agen pengguna dan seringkali mengakhiri koneksi secara tiba-tiba, yang mengakibatkan shutdown yang gagal untuk koneksi yang dapat menghasilkan kesalahan 408.

Sebagai contoh, katakanlah saya adalah peretas pengecut yang memindai internet untuk komputer yang masih rentan terhadap kerentanan POODLE. Karena itu, saya telah menulis skrip yang membuka koneksi ke potongan besar alamat IP untuk menemukan server yang akan menerima SSL versi 3 - nanti saya akan menggunakan daftar itu untuk memindai untuk mengeksploitasi POODLE secara khusus. Semua yang dilakukan skrip pertama ini adalah membuat koneksi menggunakan openssl untuk memeriksa SSLv3, seperti ini:

openssl s_client -connect [IP]:443 -ssl3

Perintah ini akan, dalam banyak konfigurasi Apache, menghasilkan pesan 408 persis seperti yang telah Anda jelaskan. Melakukan perintah ini di dua server saya sendiri menghasilkan entri ini ke log akses:

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

Saya ingin memperjelas hal ini karena bahkan dalam situasi di mana OP tidak menggunakan segala bentuk penyeimbangan beban, 408 kesalahan dapat terjadi dalam berbagai keadaan - beberapa berbahaya, beberapa menunjukkan masalah dengan klien, dan beberapa menunjukkan masalah dengan server. (Saya perhatikan dalam log yang disediakan oleh OP bahwa IP lokal diindikasikan sebagai IP jarak jauh, tetapi OP tidak secara khusus menyebutkan penggunaan load balancer jadi saya tidak yakin apakah OP hanya menggunakan IP non-routable untuk keperluan itu. demonstrasi, seperti yang dia lakukan dengan URL)

Pokoknya, walaupun posting saya jelas terlambat untuk membantu OP semoga bermanfaat bagi orang lain yang datang ke sini mencari solusi untuk semua kesalahan batas waktu itu.

Josh Wieder
sumber
6

Ada berbagai alasan untuk Batas Waktu 408. Tapi mari kita mulai dari premis bahwa semuanya baik-baik saja kemudian pada titik tertentu mulai 408 ini muncul di log akses Anda - yaitu 408 0 "-" "-".

Seperti banyak poin di internet, 408 mewakili koneksi yang dibuat tetapi tidak ada permintaan yang dikirim dalam skala waktu yang sesuai, oleh karena itu server menjatuhkan koneksi dengan 408. Seorang individu sombong sebenarnya menanggapi seseorang yang meminta bantuan untuk masalah ini dengan - "Bagian mana dari Timeout yang Anda tidak mengerti".

Saya pikir itu adalah jawaban yang sangat baru dan menunjukkan kurangnya pemahaman tentang bagaimana beberapa metode keamanan berfungsi dengan perangkat lunak server web.

Jadi kembali ke awal, mengapa saya melihat semua 408 ini. Satu hal yang akan Anda miliki bersama dengan kami yang mengelola server adalah banyaknya serangan yang Anda terima setiap hari. Sekarang, apa yang Anda lakukan tentang ini? Nah: Anda menggunakan metode keamanan yang Anda pilih untuk menghadapinya, inilah yang berubah.

Mari kita ambil contoh yang sangat mudah, Letakkan alamat IP. Termasuk dalam file iptabes (rules.v4) Anda memiliki "-A ufw-user-input -s 37.58.64.228 -j DROP". Jadi datanglah 37.58.64.228 firewall mengenali IP dan menjatuhkan koneksi. Dalam banyak konfigurasi Anda bahkan tidak akan tahu itu mengetuk pintu.

Sekarang mari kita ambil contoh yang lebih maju, Jatuhkan koneksi berdasarkan beberapa kriteria. Termasuk dalam file iptab (rules.v4) Anda memiliki "-A INPUT -p tcp -m tcp --dport 80 -m string --string" cgi "--algo bm --to 1000 -j DROP". Ini berbeda karena dalam aturan iptable ini kami mengatakan melihat 1000 byte pertama dari string permintaan dan melihat apakah Anda dapat menemukan sub-string "cgi" dan jika Anda menemukan sub-string maka jangan pergi lebih lanjut, cukup jatuhkan koneksi.

Di sini metode keamanannya bagus, tetapi sejauh menyangkut log Anda menyesatkan. 408 0 "-" "-" yang dihasilkan adalah apache terbaik yang dapat dilakukan dalam kondisi ini. Koneksi dibuat dan permintaan harus diterima hingga titik untuk menerapkan aturan perbandingan string yang akhirnya menghasilkan 408 karena aturan Anda memenuhi kriteria untuk koneksi yang akan dihapus. Jadi, adik kecil kami yang masih baru tidak bisa salah jika mereka mencoba. Koneksi dibuat dan permintaan diterima (Anda hanya tidak akan memiliki visibilitas dalam kondisi ini). Meskipun 408 dihasilkan, ini bukan 'Timeout'; server Anda cukup menjatuhkan koneksi setelah permintaan dibuat terkait dengan aturan firewall Anda. Ada banyak aturan lain, yang akan menciptakan situasi yang sama. Mengenakan'

Idealnya akan ada Kode Kesalahan lain yang dibuat oleh Apache, misalnya - '499' yang berarti 'Server Membaca Permintaan Anda Dan Memutuskannya Tidak Bisa Diganggu Menjamu Anda - Sod Off HaHa'.

Dengan perangkat lunak server web terbaru, Anda dapat secara praktis mengecualikan serangan DOS dan gen browser baru yang menggabungkan kemampuan prediksi tidak menyebabkan masalah ini seperti yang disarankan beberapa orang.

Singkatnya, 408 dihasilkan karena server tidak menanggapi permintaan, sehingga sejauh menyangkut masalah koneksi waktu habis, ketika pada kenyataannya server membaca permintaan tetapi menjatuhkan koneksi untuk alasan selain waktu tunggu menunggu permintaan.

Kev
sumber
2
Tapi MENGAPA itu menjatuhkan koneksi? Kami melihat ini adalah log server, bukan log klien.
Erick Robertson
5

Kami memiliki masalah ini, dan agak bingung untuk sementara waktu. Solusi terbaik yang kami temukan disarankan oleh tim ELB dukungan AWS. Ini pada dasarnya bergantung pada memastikan bahwa pengaturan batas waktu server httpd Anda semua lebih besar dari idle timeoutpengaturan ELB Anda (yang default ke 60 detik).

  • Pastikan Timeoutnilai direktif apache Anda menggandakan idle timeoutpengaturan ELB Anda.
  • Aktifkan KeepAlivefitur, pastikan itu MaxKeepAliveRequestssangat besar (0 untuk tak terbatas atau sangat tinggi, seperti 2000), dan itu KeepAliveTimeoutlebih besar daripada ELB Anda idle timeout.

Kami menemukan bahwa pengaturan KeepAlive(dan pengaturan terkait) secara khusus mengurangi kuantitas 408s menjadi 0 secara efektif (kami melihat beberapa, tetapi sangat sedikit).

dsummersl
sumber
Sayangnya, saya menggunakan Pohon Kacang Elastis. Saya tidak memiliki opsi ini untuk saya.
Erick Robertson
3

Saya memiliki masalah ini di belakang AWS Elastic Load Balancer. Pemeriksaan kesehatan menghasilkan 408 respons dalam log.

Satu-satunya solusi yang berhasil bagi saya adalah memiliki pengaturan Batas Waktu Idle Pemuat Beban lebih rendah dari Batas Waktu Respons Pemeriksaan Kesehatan .

Přemysl Růžička
sumber
0

Seorang kolega baru-baru ini mengatakan bahwa sementara posting terakhir saya memberikan penjelasan yang valid bagaimana 408 dapat memiliki hubungan dengan tindakan keamanan, itu tidak menawarkan solusi.

Log Akses Pipa adalah solusi pribadi saya.

Yang berikut ini harusnya bekerja di luar kotak pada sebagian besar konfigurasi Ubuntu, dan dengan sedikit mengutak-atik konfigurasi Apache lainnya. Saya memilih PHP karena ini yang paling mudah dimengerti. Ada dua skrip: yang pertama mencegah 408 ditulis ke log akses Anda. Skrip kedua mengirim semua 408 ke file log terpisah. Apa pun hasilnya, tidak ada lagi 408 dalam log akses Anda. Ini adalah skrip pilihan Anda untuk diimplementasikan.

Gunakan editor teks favorit Anda, saya menggunakan nano. Buka file di mana Anda memiliki arahan 'LogFormat' dan 'CustomLog' Anda. Beri komentar asli dengan # biasa dan tambahkan yang berikut. Anda dapat menemukan arahan ini dalam file di bawah ini.

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

CATATAN: Saya tidak mencatat gambar di log akses saya. Dalam file etc / apache2 / httpd.conf saya, saya menyertakan baris

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

Jika ini tidak menarik bagi Anda maka hapus env=!dontlogdari CustomLogarahan.

Sekarang buat salah satu skrip PHP berikut ( #!/usr/bin/phpadalah referensi ke lokasi penerjemah, pastikan lokasi itu benar untuk sistem Anda - Anda dapat melakukan ini dengan mengetikkan $ prompt; whereis php- ini akan menghasilkan sesuatu seperti php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz. Ketika Anda dapat melihat #!/usr/bin/phptepat untuk pengaturan saya).

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

Setelah menyimpan PipedAccessLog.phpskrip; pastikan bahwa root memiliki kepemilikan dengan menjalankan yang berikut di $ prompt.

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

The PipedAccessLog.phpScript akan perlu membaca / menulis dan melaksanakan hak akses sehingga mengeksekusi berikut di $ prompt.

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

Akhirnya agar semuanya berfungsi, Anda harus memulai kembali layanan Apache. Jalankan yang berikut di $ prompt.

sudo service apache2 restart

Jika log Apache Anda berada di tempat lain, maka ubah jalur yang sesuai dengan konfigurasi Anda. Semoga berhasil.

Kev
sumber
6
Jika 408 terjadi, kita perlu mencari tahu mengapa dan menyingkirkannya. Mencegah mereka untuk tidak masuk atau menyalurkannya ke file lain adalah pemborosan waktu server. Ini juga berfungsi untuk hanya menyembunyikan masalah. Ini seperti membersihkan kamar Anda dengan mendorong semua yang ada di bawah tempat tidur Anda.
Erick Robertson
-2

Saya telah menemukan bahwa 408 kesalahan meningkat baik dalam jumlah maupun frekuensi. Kisaran alamat IP asal mereka juga bertambah (ini dicatat ke file mereka sendiri). Ada juga pola log jelas menampilkan 408 berturut-turut dari kelompok IP yang sama yang bukan karena batas waktu server normal di mana pencetus sedang mencoba koneksi sekitar 2 atau 3 detik terpisah dalam pola siklus (tidak ada menunggu batas waktu sebelum yang lain upaya koneksi) Saya melihat ini sebagai upaya koneksi gaya DDOS sederhana. Menurut pendapat saya ini adalah jenis pesan konfirmasi untuk pencetus bahwa server sedang online ... kemudian mereka kembali lagi dengan alat yang berbeda .... Jika Anda menambah interval waktu tunggu Anda, Anda cukup memberi mereka time_allocation lebih besar untuk dijalankan program hack mereka di dalam.

pengguna282558
sumber