รับข้อผิดพลาด 408 ข้อในบันทึกของเราโดยไม่มีการร้องขอหรือตัวแทนผู้ใช้


36

ฉันได้รับคำขอจำนวนมากที่ปรากฏในบันทึกการทำงานของ apache ที่มีลักษณะเช่นนี้

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

ดูเหมือนจะไม่มีการร้องขอและไม่มีตัวแทนผู้ใช้ มีใครเห็นสิ่งนี้มาก่อนหรือไม่


คำตอบ:


29

คุณมีโอกาสใช้งานเว็บเซิร์ฟเวอร์ใน Amazon อยู่เบื้องหลัง Elastic Load Balancer หรือไม่?

ดูเหมือนว่าพวกเขาสร้างจำนวนมาก 408 ตอบสนองเนื่องจากการตรวจสอบสุขภาพของพวกเขา

คำตอบบางส่วนจากฟอรั่มนั้น:

  • RequestReadTimeout header=0 body=0

    สิ่งนี้จะปิดใช้งานการตอบกลับ 408 หากคำขอหมดเวลา

  • เปลี่ยนการตรวจสุขภาพของ ELB เป็นพอร์ตอื่น
  • ปิดใช้งานการบันทึกสำหรับที่อยู่ IP ของ ELB ด้วย:

    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 แสดงว่าช้าช้าไม่เป็นปัญหา
Ladadadada

2
RequestReadTimeout header=0 body=0จะปิดใช้งานคำขอหมดเวลาอ่านทั้งหมดด้วยกันฉันจะไม่แนะนำสิ่งนี้
mikejonesey

@ Ladadadada ฉันคิดว่าคุณยังคงต้องการการป้องกันแบบ loris ช้าเนื่องจาก http ทำงานเป็นพร็อกซี tcp, https ถ้า offloaded จะส่งต่อคำขอ http แทนที่จะเป็น tcp อย่างไรก็ตามไม่มีตัวกรองสำหรับการเชื่อมต่อที่ช้ามีเพียงหมดเวลาสำหรับการตอบสนอง
mikejonesey

@ Ladadadada คุณคิดผิด ELB หรือ ALB ไม่ทำอะไรเลยเพื่อช่วยชะลอความช้าและมันจะส่งผลกระทบต่อเว็บเซิร์ฟเวอร์ส่วนใหญ่ดูคำถาม AWS และปัญหาของฉันที่นี่: forums.aws.amazon.com/thread.jspa?threadID=269176
Cristiano Coelho

9

มีบางอย่างกำลังเชื่อมต่อกับพอร์ตและไม่เคยส่งข้อมูล HTTP 408 เป็นข้อผิดพลาด "หมดเวลา" มีการเขียนที่ดีที่นี่: http://www.checkupdown.com/status/E408.html


1
แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
kasperd

มีเพียงการค้นหารายการของ 100+ IP ที่ได้รับ 408s ตามคำขอที่ว่างเปล่าของพวกเขาจะเห็นได้ชัดว่าส่วนใหญ่มาจากจีนแผ่นดินใหญ่และฉันสงสัยว่าปัญหาคือความแออัดที่เกี่ยวข้องเป็นหลัก ความแออัดส่งผลให้การตั้งค่าการเชื่อมต่อสำเร็จ แต่ส่วนหัวคำขอไม่ได้ถูกส่งไป แบนด์วิดธ์ข้ามฟากจากประเทศจีนมีมากเกินไปและการเชื่อมต่อที่ไม่ใช่แผ่นดินใหญ่ก็มาถึงที่ว่างเปล่าเป็นกระจัดกระจายจากบราซิลยุโรปและสหรัฐอเมริกาในชนบทซึ่งมีปัญหาที่คล้ายกันในการเข้าถึงเซิร์ฟเวอร์ฝั่งตะวันตกของสหรัฐ
ClearCrescendo

8

มีคำตอบที่ดีอยู่แล้วที่นี่ แต่ฉันต้องการที่จะเสี่ยงเพิ่มเติมหนึ่งบันทึกที่ไม่ได้รับการแก้ไขโดยเฉพาะ ดังที่ผู้วิจารณ์คนก่อนหน้าหลายคนพูดถึงแล้ว 408 หมายถึงหมดเวลา และมีสถานการณ์หลายอย่างที่ทำให้เกิดการหมดเวลาบนเว็บเซิร์ฟเวอร์

จากที่กล่าวไว้ว่าข้อผิดพลาด 408 สามารถสร้างขึ้นได้ในหลายกรณีซึ่งเซิร์ฟเวอร์ของคุณกำลังถูกสแกนเพื่อหาช่องโหว่ ลูกค้าในกรณีเช่นนี้มักจะนำเสนอตัวแทนผู้ใช้และมักจะยุติการเชื่อมต่ออย่างฉับพลันส่งผลให้เกิดการหยุดทำงานชั่วคราวสำหรับการเชื่อมต่อที่สามารถสร้างข้อผิดพลาด 408

ตัวอย่างเช่นสมมติว่าฉันเป็นแฮ็กเกอร์ขี้ขลาดตาขาวที่กำลังสแกนอินเทอร์เน็ตเพื่อหาคอมพิวเตอร์ที่ยังคงมีช่องโหว่ต่อ POODLE ดังนั้นฉันจึงเขียนสคริปต์ที่เปิดการเชื่อมต่อไปยังที่อยู่ IP จำนวนมากเพื่อค้นหาเซิร์ฟเวอร์ที่จะยอมรับ SSL เวอร์ชัน 3 - หลังจากนั้นฉันจะใช้รายการนั้นเพื่อสแกนหาการหาประโยชน์จาก POODLE โดยเฉพาะ สิ่งที่สคริปต์แรกนี้ทำคือสร้างการเชื่อมต่อโดยใช้ openssl เพื่อตรวจสอบ SSLv3 เช่นนี้

openssl s_client -connect [IP]:443 -ssl3

คำสั่งนี้จะส่งผลให้ข้อความ 408 ตรงตามที่คุณได้อธิบายไว้ในการกำหนดค่าต่างๆของ Apache การใช้คำสั่งนี้กับเซิร์ฟเวอร์ของฉันเองสองตัวทำให้เกิดรายการนี้ในบันทึกการเข้าถึง:

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

ฉันต้องการทำให้ชัดเจนว่าแม้ในสถานการณ์ที่ OP ไม่ได้ใช้ load balancing รูปแบบใด ๆ ข้อผิดพลาด 408 สามารถเกิดขึ้นได้ในหลากหลายสถานการณ์ - มีบางอย่างที่เป็นอันตรายบางคนระบุปัญหากับลูกค้าและบางคนแสดงปัญหากับเซิร์ฟเวอร์ (ฉันสังเกตเห็นในบันทึกที่ให้ไว้โดย OP ว่า IP ในตัวเครื่องถูกระบุว่าเป็น IP ระยะไกล แต่ OP ไม่ได้กล่าวถึงการใช้ load balancer เป็นพิเศษดังนั้นฉันไม่แน่ใจว่า 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" 37.58.64.228 ดังนั้นไฟร์วอลล์จะจดจำ IP และลดการเชื่อมต่อ ในการกำหนดค่าจำนวนมากคุณจะไม่รู้ด้วยซ้ำว่ามันกำลังกระแทกประตู

ตอนนี้ลองมาเป็นตัวอย่างขั้นสูงวางการเชื่อมต่อตามเกณฑ์บางอย่าง รวมอยู่ในไฟล์ iptabes (rules.v4) คุณมี "-A-INPUT -p tcp -m tcp --dport 80 -m string - string" cgi "--algo bm - ถึง 1,000 -j DROP" สิ่งนี้แตกต่างกันเพราะในกฎ iptable นี้เรากำลังพูดถึง 1,000 ไบต์แรกของสตริงคำขอและดูว่าคุณสามารถหาสตริงย่อยของ "cgi" และถ้าคุณพบสตริงย่อยนั้นไม่ต้องไปไหน เพิ่มเติมเพียงแค่วางการเชื่อมต่อ

นี่เป็นวิธีการรักษาความปลอดภัยที่ดี แต่เท่าที่บันทึกของคุณมีความกังวลที่ทำให้เข้าใจผิด 408 0 "-" "-" ที่สร้างขึ้นเป็น Apache ที่ดีที่สุดที่สามารถทำได้ภายใต้สถานการณ์เหล่านี้ มีการเชื่อมต่อและคำขอต้องได้รับการยอมรับจนถึงจุดหนึ่งเพื่อใช้กฎการเปรียบเทียบสตริงซึ่งในที่สุดผลลัพธ์ใน 408 เนื่องจากกฎของคุณตรงตามเกณฑ์สำหรับการเชื่อมต่อที่จะถูกทิ้ง ดังนั้นที่รักสามเณรเล็ก ๆ ของเราก็ไม่ผิดถ้าพวกเขาลอง มีการเชื่อมต่อและได้รับคำขอ (คุณเพียง แต่จะไม่สามารถมองเห็นได้ภายใต้สถานการณ์เหล่านี้) แม้ว่า 408 จะถูกสร้างขึ้นมันไม่ได้เป็น 'หมดเวลา'; เซิร์ฟเวอร์ของคุณเพียงยกเลิกการเชื่อมต่อหลังจากคำขอถูกเชื่อมโยงกับกฎไฟร์วอลล์ของคุณ มีกฎอื่น ๆ อีกมากมายซึ่งจะสร้างสถานการณ์ 408 เดียวกัน ดอน'

จะเป็นการดีที่มีรหัสข้อผิดพลาด Apache ที่สร้างขึ้นอีกตัวอย่างเช่น - '499' ซึ่งจะหมายถึง 'เซิร์ฟเวอร์อ่านคำขอของคุณและตัดสินใจว่าจะไม่ใส่ใจกับความบันเทิงของคุณ - ออกนอกบ้าน HaHa'

ด้วยซอฟต์แวร์เว็บเซิร์ฟเวอร์ล่าสุดคุณสามารถยกเว้นการโจมตีของ DOS และยีนใหม่ของเบราว์เซอร์ที่รวมความสามารถในการคาดการณ์ไม่ทำให้เกิดปัญหานี้ตามที่บางคนแนะนำ

ในระยะสั้น 408 จะถูกสร้างขึ้นเพราะเซิร์ฟเวอร์ไม่ตอบสนองต่อการร้องขอดังนั้นเท่าที่ลูกค้ามีความกังวลเกี่ยวกับการเชื่อมต่อหมดเวลาในความเป็นจริงเซิร์ฟเวอร์อ่านการร้องขอ แต่หลุดการเชื่อมต่อด้วยเหตุผลอื่นนอกเหนือจากการหมดเวลารอ การร้องขอ


2
แต่ทำไมมันถึงปล่อยการเชื่อมต่อ? เราเห็นว่านี่คือบันทึกเซิร์ฟเวอร์ไม่ใช่บันทึกของลูกค้า
Erick Robertson

5

เรามีปัญหาอย่างนี้และงงงวยอยู่พักนึง ทางออกที่ดีที่สุดที่เราคิดขึ้นนั้นได้รับการแนะนำจากทีม ELB ของ AWS เป็นหลักในการตรวจสอบให้แน่ใจว่าการตั้งค่าการหมดเวลาของเซิร์ฟเวอร์ httpd ของคุณนั้นมากกว่าidle timeoutการตั้งค่าELB ของคุณ(ซึ่งเป็นค่าเริ่มต้นถึง 60 วินาที)

  • ตรวจสอบให้แน่ใจว่าTimeoutค่าคำสั่งapache ของคุณเป็นสองเท่าของidle timeoutการตั้งค่า ELB ของคุณ
  • เปิดใช้งานKeepAliveคุณลักษณะตรวจสอบให้แน่ใจว่าMaxKeepAliveRequestsมีขนาดใหญ่มาก (ไม่ว่าจะเป็น 0 สำหรับอนันต์หรือสูงมากเช่น 2000) และนั่นKeepAliveTimeoutสูงกว่า ELB ของidle timeoutคุณ

เราพบว่าการKeepAliveตั้งค่า (และการตั้งค่าที่เกี่ยวข้อง) ลดจำนวน 408s เป็น 0 ได้อย่างมีประสิทธิภาพโดยเฉพาะ (เราเห็นจำนวนน้อย แต่น้อยมาก)


น่าเสียดายที่ฉันใช้ Elastic Beanstalk ฉันไม่มีตัวเลือกเหล่านี้สำหรับฉัน
Erick Robertson

3

ฉันมีปัญหานี้หลัง AWS Elastic Load Balancer การตรวจสอบสุขภาพสร้างยอดเยี่ยม 408 คำตอบในบันทึก

ทางออกเดียวที่ทำงานสำหรับฉันคือการมีBalancer การโหลดของ Idle หมดเวลาการตั้งค่าที่ต่ำกว่าของการตรวจสุขภาพของการตอบสนองหมดเวลา


0

เมื่อเร็ว ๆ นี้เพื่อนร่วมงานของฉันตั้งข้อสังเกตว่าในขณะที่โพสต์ล่าสุดของฉันให้คำอธิบายที่ถูกต้องว่า 408 สามารถมีความสัมพันธ์กับมาตรการรักษาความปลอดภัยได้อย่างไร

Piped Access log เป็นโซลูชันส่วนตัวของฉัน

ต่อไปนี้ควรใช้งานนอกกรอบสำหรับการตั้งค่าของ Ubuntu ส่วนใหญ่และมีการปรับเปลี่ยนเล็กน้อยในการกำหนดค่า Apache อื่น ๆ ฉันเลือก PHP เพราะเข้าใจง่ายที่สุด มีสองสคริปต์คือสคริปต์แรกป้องกันการเขียน 408 ลงในบันทึกการเข้าถึงของคุณ สคริปต์ที่สองส่ง 408 ทั้งหมดไปยังไฟล์บันทึกแยกต่างหาก ไม่ว่าผลลัพธ์จะเป็นอย่างไรใน 408s ในบันทึกการเข้าถึงของคุณ เป็นตัวเลือกของคุณที่จะใช้สคริปต์

ใช้โปรแกรมแก้ไขข้อความที่คุณชื่นชอบฉันใช้นาโน เปิดไฟล์ที่คุณมีคำสั่ง '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อ้างอิงถึงที่ตั้งของล่ามให้แน่ใจว่าตำแหน่งถูกต้องสำหรับระบบของคุณ - คุณสามารถทำได้โดยการพิมพ์ที่ $ prompt; 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สคริปต์; ตรวจสอบให้แน่ใจว่ารูทมีความเป็นเจ้าของโดยดำเนินการต่อไปนี้ที่พร้อมท์ $

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 ที่มาจากนั้นก็เพิ่มขึ้นเช่นกัน (เหล่านี้ถูกบันทึกไว้ในไฟล์แยกต่างหาก) นอกจากนี้ยังมีรูปแบบการบันทึกที่เห็นได้ชัดซึ่งแสดง 408 ติดต่อกันจากกลุ่ม IP เดียวกันที่ไม่ได้เกิดจากการหมดเวลาของเซิร์ฟเวอร์ปกติที่ผู้เริ่มต้นพยายามเชื่อมต่อประมาณ 2 หรือ 3 วินาทีในรูปแบบวงจร (ไม่ต้องรอให้หมดเวลาก่อน ความพยายามในการเชื่อมต่อ) ฉันเห็นสิ่งเหล่านี้เป็นความพยายามในการเชื่อมต่อสไตล์ DDOS ที่เรียบง่าย ในความคิดของฉันนี่เป็นข้อความยืนยันชนิดหนึ่งสำหรับผู้เริ่มต้นที่เซิร์ฟเวอร์ออนไลน์ ... จากนั้นพวกเขาจะกลับมาพร้อมเครื่องมือต่าง ๆ ... ถ้าคุณเพิ่มช่วงเวลาหมดเวลาคุณเพียงแค่ให้เวลากับพวกเขามากขึ้น โปรแกรมแฮ็คของพวกเขาภายใน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.