Nhận 408 lỗi trên nhật ký của chúng tôi mà không có yêu cầu hoặc tác nhân người dùng


36

Tôi nhận được rất nhiều yêu cầu xuất hiện trong nhật ký apache của chúng tôi trông như thế này

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

Dường như không có yêu cầu và không có tác nhân người dùng. Có ai thấy điều này trước đây không?


Câu trả lời:


29

Bạn có bất kỳ cơ hội nào chạy các máy chủ web của bạn ở Amazon đằng sau Bộ cân bằng tải không?

Có vẻ như họ tạo ra rất nhiều phản hồi 408 do kiểm tra sức khỏe của họ .

Một số giải pháp từ chủ đề diễn đàn đó:

  • RequestReadTimeout header=0 body=0

    Điều này vô hiệu hóa các phản hồi 408 nếu yêu cầu hết thời gian.

  • Thay đổi kiểm tra sức khỏe ELB sang một cổng khác.
  • Vô hiệu hóa đăng nhập cho các địa chỉ IP ELB với:

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

Và từ bài đăng trên blog này :

  • Điều chỉnh thời gian chờ yêu cầu của bạn là 60 trở lên.

2
theo hiểu biết của tôi, điều này sẽ đưa bạn đến với cuộc tấn công Slowloris, có một reqtimeout phong nha dường như rất hữu ích cho bất cứ ai sử dụng apache
neofutur

Nếu bạn đứng sau ELB, Slowloris không phải là vấn đề.
Ladadadada

2
RequestReadTimeout header=0 body=0sẽ vô hiệu hóa yêu cầu đọc hết thời gian cùng nhau, tôi sẽ không đề xuất điều này
mikejonesey

@Ladadadada Tôi nghĩ rằng bạn vẫn cần bảo vệ loris chậm vì http hoạt động như một proxy tcp, https nếu được giảm tải sẽ chuyển tiếp các yêu cầu http thay vì tcp, tuy nhiên không có bộ lọc nào cho các kết nối chậm, chỉ có thời gian chờ cho phản hồi.
mikejonesey

@Ladadadada bạn đã sai, ELB hoặc ALB không làm gì để chống lại Slowloris và nó sẽ ảnh hưởng đến hầu hết các máy chủ web, hãy xem câu hỏi và vấn đề AWS của tôi ở đây: forum.aws.amazon.com/thread.jspa?threadID=269176
Cristiano Coelho

9

Một cái gì đó đang kết nối với cổng và sau đó không bao giờ gửi dữ liệu. HTTP 408 là một lỗi "hết thời gian". Có một bài viết hay ở đây: http://www.checkupdown.com/status/E408.html


1
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
kasperd

Chỉ cần tra cứu danh sách hơn 100 IP nhận được 408 yêu cầu trống, điều đáng chú ý là phần lớn đến từ Trung Quốc đại lục và tôi nghi ngờ rằng vấn đề chủ yếu liên quan đến tắc nghẽn. Sự tắc nghẽn dẫn đến thiết lập kết nối thành công nhưng tiêu đề yêu cầu không được gửi. Băng thông nội trú từ Trung Quốc rất quá tải và các kết nối ngoài đại lục cũng trống rỗng là một sự phân tán từ Brazil, Châu Âu và nông thôn Hoa Kỳ, những vấn đề tương tự khi tiếp cận máy chủ Bờ Tây Hoa Kỳ.
ClearCrescendo

8

Đã có khá nhiều câu trả lời hay ở đây, nhưng tôi muốn mạo hiểm thêm một lưu ý chưa được đề cập cụ thể. Như nhiều người bình luận trước đã đề cập, 408 chỉ ra thời gian chờ; và có khá nhiều tình huống trong đó thời gian chờ xảy ra trên máy chủ web.

Như đã nói, có thể tạo ra 408 lỗi trong nhiều trường hợp máy chủ của bạn đang được quét để khai thác. Các khách hàng trong những trường hợp như vậy hiếm khi xuất hiện một tác nhân người dùng và thường kết thúc các kết nối đột ngột, dẫn đến tắt máy cho kết nối đó có thể gây ra lỗi 408.

Ví dụ: giả sử tôi là một hacker khủng khiếp đang quét internet để tìm các máy tính vẫn dễ bị tổn thương trước lỗ hổng POODLE. Như vậy, tôi đã viết một tập lệnh mở các kết nối tới các khối lớn địa chỉ IP để tìm các máy chủ chấp nhận SSL phiên bản 3 - sau này tôi sẽ sử dụng danh sách đó để quét khai thác POODLE một cách cụ thể. Tất cả những gì tập lệnh đầu tiên này thực hiện là thiết lập kết nối bằng openssl để kiểm tra SSLv3, như sau:

openssl s_client -connect [IP]:443 -ssl3

Lệnh này, trong nhiều cấu hình của Apache, sẽ tạo ra một thông báo 408 chính xác như bạn đã mô tả. Thực hiện lệnh này trên hai máy chủ của riêng tôi dẫn đến mục này vào nhật ký truy cập:

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

Tôi muốn làm rõ điều này vì ngay cả trong trường hợp OP không sử dụng bất kỳ hình thức cân bằng tải nào, 408 lỗi có thể xảy ra trong nhiều trường hợp - một số độc hại, một số cho thấy sự cố với máy khách và một số cho thấy sự cố với máy chủ. (Tôi nhận thấy trong nhật ký do OP cung cấp rằng IP cục bộ được chỉ định là IP từ xa, nhưng OP không đề cập cụ thể đến việc sử dụng bộ cân bằng tải nên tôi không chắc liệu OP có đơn giản sử dụng IP không thể định tuyến cho mục đích không trình diễn, như ông đã làm với URL)

Dù sao, mặc dù bài đăng của tôi rõ ràng là quá muộn trong ngày để giúp OP hy vọng nó có thể giúp những người khác đến đây tìm kiếm giải pháp cho tất cả những lỗi hết thời gian chết tiệt đó.


6

Có nhiều lý do khác nhau cho thời gian chờ 408. Nhưng hãy bắt đầu từ một tiền đề rằng mọi thứ đều ổn sau đó tại một số điểm bắt đầu của 408 này xuất hiện trong nhật ký truy cập của bạn - tức là 408 0 "-" "-".

Giống như nhiều điểm khác trên mạng, 408 thể hiện một kết nối được thực hiện nhưng không có yêu cầu nào được gửi trong thang thời gian thích hợp, do đó máy chủ bỏ kết nối với 408. Một cá nhân kiêu ngạo thực sự đã trả lời ai đó yêu cầu trợ giúp về vấn đề này với - "Phần nào của Timeout mà bạn không hiểu".

Tôi nghĩ rằng đó là rất nhiều câu trả lời mới và thể hiện sự thiếu hiểu biết hoàn toàn về cách một số phương thức bảo mật hoạt động với phần mềm máy chủ web.

Quay lại từ đầu, tại sao tôi lại thấy tất cả những cái 408 này. Một điều bạn sẽ có điểm chung với phần còn lại của chúng tôi là quản lý máy chủ là số lượng lớn các cuộc tấn công bạn nhận được hàng ngày. Bây giờ, bạn làm gì về những điều này? Vâng: bạn sử dụng các phương pháp bảo mật đã chọn của bạn để đối phó với chúng, đây là những gì thay đổi.

Hãy lấy một ví dụ rất dễ dàng, Thả địa chỉ IP. Bao gồm trong tệp iptabes (quy tắc.v4), bạn có "-A ufw-user-input -s 37.58.64.228 -j DROP". Vì vậy, cùng với 37.58.64.228, tường lửa nhận ra IP và ngắt kết nối. Trong rất nhiều cấu hình, bạn thậm chí sẽ không biết nó gõ cửa.

Bây giờ hãy lấy một ví dụ nâng cao hơn, Thả kết nối dựa trên một số tiêu chí. Bao gồm trong tệp iptabes (quy tắc.v4), bạn có "-A INPUT -p tcp -m tcp --dport 80 -m chuỗi - chuỗi" cgi "--algo bm --to 1000 -j DROP". Điều này khác bởi vì trong quy tắc iptable này, chúng tôi đang nói hãy nhìn vào 1000 byte đầu tiên của chuỗi yêu cầu và xem liệu bạn có thể tìm thấy một chuỗi con của "cgi" không và nếu bạn tìm thấy chuỗi con đó thì đừng đi hơn nữa, chỉ cần thả kết nối.

Ở đây phương pháp bảo mật là tốt, nhưng theo như nhật ký của bạn có liên quan đến sai lệch. 408 0 "-" "-" được tạo ra là apache tốt nhất có thể làm trong những trường hợp này. Kết nối đã được thực hiện và yêu cầu phải được chấp nhận đến một điểm để áp dụng quy tắc so sánh chuỗi dẫn đến kết quả là 408 vì quy tắc của bạn đáp ứng các tiêu chí cho kết nối bị hủy. Vì vậy, những người thân yêu mới của chúng tôi không thể sai hơn nếu họ cố gắng. Một kết nối đã được thực hiện và một yêu cầu đã được nhận (bạn sẽ không nhìn thấy nó trong những trường hợp này). Mặc dù 408 được tạo nhưng nó không phải là 'Hết giờ'; máy chủ của bạn chỉ cần hủy kết nối sau khi yêu cầu được thực hiện liên quan đến quy tắc tường lửa của bạn. Có nhiều quy tắc khác, sẽ tạo ra tình huống 408 tương tự. Đừng '

Lý tưởng nhất là sẽ có một Mã lỗi khác do Apache tạo ra, ví dụ - '499' có nghĩa là 'Máy chủ đã đọc yêu cầu của bạn và quyết định rằng nó không thể bị làm phiền bạn - Hãy tắt đi HaHa'.

Với phần mềm máy chủ web mới nhất, bạn thực tế có thể loại trừ các cuộc tấn công DOS và gen trình duyệt mới kết hợp các khả năng dự đoán không gây ra vấn đề này như một số người đã đề xuất.

Nói tóm lại, 408 được tạo vì máy chủ không đáp ứng yêu cầu, vì liên quan đến việc máy khách hết thời gian kết nối, khi thực tế, máy chủ đọc yêu cầu nhưng đã bỏ kết nối vì lý do không phải là hết thời gian chờ một yêu cầu.


2
Nhưng TẠI SAO nó làm mất kết nối? Chúng tôi đang xem đây là nhật ký máy chủ, không phải nhật ký máy khách.
Erick Robertson

5

Chúng tôi đã có vấn đề này rất lâu, và bối rối về nó trong một thời gian khá lâu. Giải pháp tốt nhất mà chúng tôi đưa ra được đề xuất bởi nhóm ELB của AWS. Về cơ bản, nó đảm bảo rằng các cài đặt thời gian chờ của máy chủ httpd của bạn đều lớn hơn idle timeoutcài đặt ELB của bạn (mặc định là 60 giây).

  • Đảm bảo rằng Timeoutgiá trị chỉ thị apache của bạn gấp đôi idle timeoutcài đặt ELB của bạn.
  • Bật KeepAlivetính năng này, đảm bảo rằng MaxKeepAliveRequestsnó rất lớn (0 cho vô hạn hoặc rất cao, như 2000) và KeepAliveTimeoutlớn hơn ELB của bạn idle timeout.

Chúng tôi thấy rằng KeepAlivecài đặt (và cài đặt được liên kết) đặc biệt giảm số lượng 408 xuống còn 0 (chúng tôi thấy một số, nhưng rất ít).


Thật không may, tôi đang sử dụng Bean Beanalk. Tôi không có sẵn các tùy chọn này cho tôi.
Erick Robertson

3

Tôi đã có vấn đề này đằng sau AWS đàn hồi tải cân bằng. Kiểm tra sức khỏe đã tạo ra một số lượng khủng khiếp 408 phản hồi trong nhật ký.

Giải pháp duy nhất hiệu quả với tôi là cài đặt thời gian chờ không tải của Bal Baler thấp hơn thời gian chờ phản hồi của Health Check .


0

Một đồng nghiệp gần đây đã nhận xét rằng trong khi bài đăng cuối cùng của tôi đưa ra lời giải thích hợp lệ làm thế nào một 408 có thể có mối liên hệ với một biện pháp bảo mật, nó không đưa ra giải pháp.

Nhật ký truy cập Piped là giải pháp cá nhân của tôi.

Những điều sau đây sẽ hoạt động vượt trội trên hầu hết các cấu hình Ubuntu và với sự sửa đổi tối thiểu trên các cấu hình Apache khác. Tôi đã chọn PHP vì nó dễ hiểu nhất. Có hai tập lệnh: lần đầu tiên ngăn chặn 408 được ghi vào nhật ký truy cập của bạn. Kịch bản thứ hai gửi tất cả 408 đến một tệp nhật ký riêng. Dù bằng cách nào thì kết quả không còn 408s trong nhật ký truy cập của bạn. Đó là sự lựa chọn của bạn để thực hiện kịch bản.

Sử dụng trình soạn thảo văn bản yêu thích của bạn, tôi sử dụng nano. Mở tệp nơi bạn có các lệnh 'LogFormat' và 'CustomLog'. Nhận xét bản gốc với # thông thường và thêm phần sau. Bạn có thể tìm thấy các chỉ thị trong tập tin dưới đây.

sudo nano / etc / apache2 / site-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

LƯU Ý: Tôi không đăng nhập hình ảnh trong nhật ký truy cập của mình. Trong tập tin etc / apache2 / httpd.conf của tôi, tôi bao gồm dòng

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

Nếu điều này không được bạn quan tâm thì hãy loại bỏ env=!dontlogkhỏi CustomLogchỉ thị.

Bây giờ hãy tạo một trong các tập lệnh PHP sau ( #!/usr/bin/phplà tham chiếu đến vị trí của trình thông dịch, hãy đảm bảo rằng vị trí đó là chính xác cho hệ thống của bạn - bạn có thể làm điều này bằng cách nhập vào dấu nhắc $; whereis php- điều này sẽ trả về một cái gì đó như php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz. có thể thấy #!/usr/bin/phplà đúng cho thiết lập của tôi).

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

Đã lưu PipedAccessLog.phptập lệnh; đảm bảo rằng root có quyền sở hữu bằng cách thực hiện như sau tại dấu nhắc $.

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

Các PipedAccessLog.phpkịch bản sẽ cần đọc / ghi và thực hiện quyền để thực hiện những điều sau đây tại $ nhắc.

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

Cuối cùng, để mọi thứ hoạt động, bạn cần khởi động lại dịch vụ Apache. Thực hiện như sau tại dấu nhắc $.

sudo service apache2 restart

Nếu nhật ký Apache của bạn được đặt ở nơi khác thì hãy thay đổi đường dẫn cho phù hợp với cấu hình của bạn. Chúc may mắn.


6
Nếu 408 đang xảy ra, chúng ta cần tìm hiểu tại sao và loại bỏ chúng. Đơn giản chỉ cần ngăn không cho chúng được ghi nhật ký hoặc chuyển chúng sang tệp khác là lãng phí thời gian của máy chủ. Nó cũng phục vụ để chỉ che giấu vấn đề. Nó giống như làm sạch phòng của bạn bằng cách đẩy mọi thứ dưới giường của bạn.
Erick Robertson

-2

Tôi đã thấy rằng 408 lỗi đang gia tăng cả về số lượng và tần suất. Phạm vi địa chỉ IP mà họ đang bắt nguồn cũng đang tăng lên (những địa chỉ này được ghi vào tệp riêng của họ). Ngoài ra còn có các mẫu nhật ký hiển thị hiển thị 408 liên tiếp từ cùng một nhóm IP không phải do thời gian chờ máy chủ bình thường trong đó người khởi tạo đang cố gắng kết nối cách nhau khoảng 2 hoặc 3 giây trong một mẫu tuần hoàn (không phải chờ thời gian chờ trước khi hết thời gian khác nỗ lực kết nối) Tôi thấy đây là những nỗ lực kết nối kiểu DDOS đơn giản. Theo tôi đây là một loại thông báo xác nhận cho người khởi tạo rằng máy chủ đang trực tuyến ... sau đó họ sẽ quay lại với các công cụ khác nhau .... Nếu bạn tăng khoảng thời gian chờ của mình, bạn chỉ cần cho họ thời gian chạy lớn hơn để chạy chương trình hack của họ trong.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.