2012-03-30 40 views
34

Làm thế nào để tạo một bản ghi vào logfile nội dung của tiêu đề yêu cầu HTTP (tất cả) như nhận được bởi apache?Có thể đăng nhập tất cả các tiêu đề yêu cầu HTTP bằng Apache không?

Hiện nay apache kết hợp cấu hình định dạng log của tôi là:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"" combined

Tôi hiểu rằng người ta có thể làm điều đó như vậy:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" \"%{heading name}i\" \"%{heading name}i\" \"%{heading name}i\"" combined

nhưng nó không phải là logic và nó là không thể biết được tiêu đề nào sẽ là.

Trả lời

10

Dưới đây là danh sách tất cả http-headers: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Và đây là danh sách tất cả apache-logformats: http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats

Như bạn đã viết một cách chính xác, mã để đăng nhập một tiêu đề cụ thể là% {foobar} i trong đó foobar là tên của tiêu đề. Vì vậy, giải pháp duy nhất là tạo một chuỗi định dạng cụ thể. Khi bạn mong đợi một tiêu đề không chuẩn như x-my-nonstandard-header, thì hãy sử dụng %{x-my-nonstandard-header}i. Nếu máy chủ của bạn sẽ bỏ qua tiêu đề không chuẩn này, tại sao bạn muốn ghi nó vào tệp nhật ký của mình? Một tiêu đề không xác định hoàn toàn không ảnh hưởng đến hệ thống của bạn.

+3

Nó vẫn đủ hữu ích để có thể ghi nhật ký tất cả tiêu đề HTTP được truyền vào máy apache. Tôi thà có một hệ thống linh hoạt hơn là phải chỉnh sửa 'LogFormat' mỗi khi một header mới được giới thiệu. –

+1

Tôi cố ý đăng nhập để bỏ phiếu cho câu trả lời này! – rofans91

40

mod_log_forensic là những gì bạn muốn, nhưng nó có thể không được bao gồm/có sẵn với cài đặt Apache của bạn theo mặc định.

Đây là cách sử dụng.

LoadModule log_forensic_module /usr/lib64/httpd/modules/mod_log_forensic.so 
<IfModule log_forensic_module> 
ForensicLog /var/log/httpd/forensic_log 
</IfModule> 
+11

Cảm ơn, đây là câu trả lời đúng. Đây là cách thiết lập nó trong httpd.conf. (Ugh, không linefeeds trong ý kiến ​​??) 'LoadModule log_forensic_module/usr/lib64/httpd/modules/mod_log_forensic.so' ' ForensicLog/var/log/httpd/forensic_log' Bây giờ bạn có thể kiểm tra [Shellshock] (http://www.troyhunt.com/2014/09/everything-you-need-to-know-about.html) cố gắng như sau: 'grep"() {"/ var/log/httpd/forensic_log' – Raptor007

5

Nếu bạn quan tâm đến nhìn thấy mà tiêu đề một khách hàng từ xa được gửi đến máy chủ của bạn, và bạn có thể gây ra các yêu cầu để chạy một kịch bản CGI cụ thể, sau đó là giải pháp đơn giản nhất là phải có kịch bản máy chủ của bạn đổ biến môi trường vào một tệp ở đâu đó.

ví dụ: chạy lệnh shell "env>/tmp/tiêu đề" từ bên trong kịch bản của bạn

Sau đó, hãy tìm các biến môi trường bắt đầu bằng HTTP _...

Bạn sẽ thấy dòng thích:

HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
HTTP_ACCEPT_ENCODING=gzip, deflate 
HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.5 
HTTP_CACHE_CONTROL=max-age=0 

Mỗi trong số đó đại diện cho một tiêu đề yêu cầu.

Lưu ý rằng tên tiêu đề được sửa đổi từ yêu cầu thực tế. Ví dụ: "Accept-Language" trở thành "HTTP_ACCEPT_LANGUAGE", v.v.

Các vấn đề liên quan