ฉันได้รับคำขอจำนวนมากที่ปรากฏในบันทึกการทำงานของ apache ที่มีลักษณะเช่นนี้
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
ดูเหมือนจะไม่มีการร้องขอและไม่มีตัวแทนผู้ใช้ มีใครเห็นสิ่งนี้มาก่อนหรือไม่
ฉันได้รับคำขอจำนวนมากที่ปรากฏในบันทึกการทำงานของ apache ที่มีลักษณะเช่นนี้
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
ดูเหมือนจะไม่มีการร้องขอและไม่มีตัวแทนผู้ใช้ มีใครเห็นสิ่งนี้มาก่อนหรือไม่
คำตอบ:
คุณมีโอกาสใช้งานเว็บเซิร์ฟเวอร์ใน Amazon อยู่เบื้องหลัง Elastic Load Balancer หรือไม่?
ดูเหมือนว่าพวกเขาสร้างจำนวนมาก 408 ตอบสนองเนื่องจากการตรวจสอบสุขภาพของพวกเขา
คำตอบบางส่วนจากฟอรั่มนั้น:
RequestReadTimeout header=0 body=0
สิ่งนี้จะปิดใช้งานการตอบกลับ 408 หากคำขอหมดเวลา
ปิดใช้งานการบันทึกสำหรับที่อยู่ IP ของ ELB ด้วย:
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
มีคำตอบที่ดีอยู่แล้วที่นี่ แต่ฉันต้องการที่จะเสี่ยงเพิ่มเติมหนึ่งบันทึกที่ไม่ได้รับการแก้ไขโดยเฉพาะ ดังที่ผู้วิจารณ์คนก่อนหน้าหลายคนพูดถึงแล้ว 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 หวังว่ามันอาจช่วยให้ผู้อื่นที่มาถึงที่นี่มองหาวิธีการแก้ไขข้อผิดพลาดหมดเวลาทั้งหมด
มีสาเหตุหลายประการสำหรับการหมดเวลา 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 จะถูกสร้างขึ้นเพราะเซิร์ฟเวอร์ไม่ตอบสนองต่อการร้องขอดังนั้นเท่าที่ลูกค้ามีความกังวลเกี่ยวกับการเชื่อมต่อหมดเวลาในความเป็นจริงเซิร์ฟเวอร์อ่านการร้องขอ แต่หลุดการเชื่อมต่อด้วยเหตุผลอื่นนอกเหนือจากการหมดเวลารอ การร้องขอ
เรามีปัญหาอย่างนี้และงงงวยอยู่พักนึง ทางออกที่ดีที่สุดที่เราคิดขึ้นนั้นได้รับการแนะนำจากทีม ELB ของ AWS เป็นหลักในการตรวจสอบให้แน่ใจว่าการตั้งค่าการหมดเวลาของเซิร์ฟเวอร์ httpd ของคุณนั้นมากกว่าidle timeout
การตั้งค่าELB ของคุณ(ซึ่งเป็นค่าเริ่มต้นถึง 60 วินาที)
Timeout
ค่าคำสั่งapache ของคุณเป็นสองเท่าของidle timeout
การตั้งค่า ELB ของคุณKeepAlive
คุณลักษณะตรวจสอบให้แน่ใจว่าMaxKeepAliveRequests
มีขนาดใหญ่มาก (ไม่ว่าจะเป็น 0 สำหรับอนันต์หรือสูงมากเช่น 2000) และนั่นKeepAliveTimeout
สูงกว่า ELB ของidle timeout
คุณเราพบว่าการKeepAlive
ตั้งค่า (และการตั้งค่าที่เกี่ยวข้อง) ลดจำนวน 408s เป็น 0 ได้อย่างมีประสิทธิภาพโดยเฉพาะ (เราเห็นจำนวนน้อย แต่น้อยมาก)
ฉันมีปัญหานี้หลัง AWS Elastic Load Balancer การตรวจสอบสุขภาพสร้างยอดเยี่ยม 408 คำตอบในบันทึก
ทางออกเดียวที่ทำงานสำหรับฉันคือการมีBalancer การโหลดของ Idle หมดเวลาการตั้งค่าที่ต่ำกว่าของการตรวจสุขภาพของการตอบสนองหมดเวลา
เมื่อเร็ว ๆ นี้เพื่อนร่วมงานของฉันตั้งข้อสังเกตว่าในขณะที่โพสต์ล่าสุดของฉันให้คำอธิบายที่ถูกต้องว่า 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 ของคุณอยู่ที่อื่นให้เปลี่ยนพา ธ เพื่อให้เหมาะกับการกำหนดค่าของคุณ โชคดี.
ฉันพบว่า 408 ข้อผิดพลาดเพิ่มขึ้นทั้งจำนวนและความถี่ ช่วงของที่อยู่ IP ที่มาจากนั้นก็เพิ่มขึ้นเช่นกัน (เหล่านี้ถูกบันทึกไว้ในไฟล์แยกต่างหาก) นอกจากนี้ยังมีรูปแบบการบันทึกที่เห็นได้ชัดซึ่งแสดง 408 ติดต่อกันจากกลุ่ม IP เดียวกันที่ไม่ได้เกิดจากการหมดเวลาของเซิร์ฟเวอร์ปกติที่ผู้เริ่มต้นพยายามเชื่อมต่อประมาณ 2 หรือ 3 วินาทีในรูปแบบวงจร (ไม่ต้องรอให้หมดเวลาก่อน ความพยายามในการเชื่อมต่อ) ฉันเห็นสิ่งเหล่านี้เป็นความพยายามในการเชื่อมต่อสไตล์ DDOS ที่เรียบง่าย ในความคิดของฉันนี่เป็นข้อความยืนยันชนิดหนึ่งสำหรับผู้เริ่มต้นที่เซิร์ฟเวอร์ออนไลน์ ... จากนั้นพวกเขาจะกลับมาพร้อมเครื่องมือต่าง ๆ ... ถ้าคุณเพิ่มช่วงเวลาหมดเวลาคุณเพียงแค่ให้เวลากับพวกเขามากขึ้น โปรแกรมแฮ็คของพวกเขาภายใน