Logstash là một công cụ phân tích log phổ biến dùng cho cả log đơn dòng và đa dòng theo nhiều định dạng, bao gồm định dạng phổ biến như syslog và các log có định dạng JSON, cũng như khả năng phân tích các log tùy chỉnh. Công cụ này miễn phí và theo mã nguồn mở, vô cùng mạnh mẽ và tương đối dễ dàng thiết lập trong môi trường lớn. Phần sau sẽ trình bày cấu hình Logstash để phân tích log đang thu thập với URLsnarf. Logstash phiên bản 1.2.1 có giao diện Kibana để xem log, vì vậy phần này cũng sẽ thảo luận một số tính năng có thể được sử dụng để truy vấn dữ liệu.
Logstash không có trong SO, cần phải tải về từ trang web của dự án tại www.logstash.net. Logstash được chứa hoàn toàn trong một gói java, vì vậy sẽ cần cài đặt Java Runtime Environment (JRE).
Để phân tích bất kỳ loại dữ liệu nào, Logstash đòi hỏi một tệp tin cấu hình để định nghĩa làm thế nào nhận được dữ liệu đó. Ví dụ sau sẽ xem xét việc dữ liệu được ghi vào một vị trí cụ thể. Gọi tệp tin cấu hình là urlsnarf-parse.conf. Đây là một cấu hình rất đơn giản:
input { file { type = > “urlsnarf” path = > “/home/idsusr/urlsnarf.log” } } output {
elasticsearch { embedded = > true } }
Cấu hình này báo cho Logstash cần lắng nghe các dữ liệu được ghi vào /home/idsusr/urlsnarf.log và xem xét các log đã ghi vào tệp tin đó là một kiểu log "urlsnarf", loại log đã định nghĩa. Phần đầu ra của tệp tin cấu hình này bắt đầu một thực thể Elasticsearch bên trong Logstash cho phép lập chỉ mục và tìm kiếm các dữ liệu nhận được.
Khi có tệp tin cấu hình, có thể khởi tạo Logstash để bắt đầu nghe log cho đến khi bắt đầu sinh dữ liệu. Để chạy Logstash với Kibana, thực hiện lệnh:
Đầu ra của lệnh này được hiển thị trong Hình 2.25.
Hình 2.25 Chạy Logstash
Lệnh này sẽ khởi tạo agent, chỉ ra urlsnarf-parse.conf với tùy chọn -f. Kết thúc lệnh với "- web" sẽ đảm bảo là Kibana được chạy cùng. Việc khởi động lần đầu tiên có thể mất một phút. Sau đó, truy cập http://127.0.0.1:9292 trong trình duyệt web để vào Kibana.
Nếu đã cài đặt Logstash trên SO và muốn truy cập vào giao diện web của Kibana từ một hệ thống khác thì sẽ không thể được. Điều này là do tường lửa được kích hoạt trên hệ thống. Có thể thêm một ngoại lệ cho tường lửa với lệnh sau:
sudo ufw allow 9292/tcp
Để tạo dữ liệu phân tích, có thể chạy URLsnarf và xuất dữ liệu đầu ra của nó vào một tệp tin. sudo urlsnarf> /home/idsusr/urlsnarf.log
Sau đó, mở trình duyệt web (hoặc sử dụng curl từ dòng lệnh) và đi đến một vài trang web để tạo ra một số dữ liệu. Khi hoàn tất, sử dụng Ctrl + C để kết thúc URLsnarf. Sau khi dừng thu thập dữ liệu, quay trở lại Kibana và xác nhận rằng các bản ghi đang đến trong trình duyệt. Nếu có, sẽ thấy một số dữ liệu hiển thị trên màn hình, tương tự như Hình 2.26.
Hình 2.26 Xem dữ liệu log trong Kibana
Hình 2.26 chỉ mô tả tệp tin log theo mức "thô" và hầu hết là chưa phân tích. Cần phải định nghĩa các bộ lọc tùy chỉnh để tạo ra các thông tin trạng thái, để Kibana thực sự có ích. Logstash
làm cho việc phân tích dễ dàng hơn so với lúc sử dụng biểu thức thông thường. Xét một ví dụ trong đó sẽ tạo ra một bộ lọc để so khớp các trường văn bản trong log đã tạo với Justniffer trong Hình 2.27, nhưng có bổ sung “sensor name” ở cuối. (Justsniffer là một công cụ thu thập dữ liệu mạnh, có thể được dùng cho dữ liệu PSTR. Tham khảo chi tiết ở tài liệu [1]).
Hình 2.27 Tuỳ chỉnh dữ liệu Justniffer với một tên cảm biến để được phân tích
Để cho thấy cách Logstash xử lý việc so khớp cơ bản so với các mẫu xây dựng sẵn, sử dụng một bộ lọc "match" trong cấu hình.
input { file { type = > “Justniffer-Logs” path = > “/home/idsusr/justniffer.log” } } filter { grok { type = > “Justniffer-Logs”
match = > [ “message”, “insertfilterhere” ] }
} output {
elasticsearch { embedded = > true } }
Dùng các mẫu GROK được xây dựng sẵn để tạo ra các dữ liệu cần cho cấu hình, gọi là justniffer-parse.conf. Những mẫu này có thể được tìm thấy tại https://github.com/logstash/logstash/blob/master/patterns/grok-patterns. Nhưng trước khi kiểm tra các mẫu cần gắn với nhau, điều đầu tiên cần làm là nhìn vào định dạng log và định nghĩa những trường muốn xác định. Định dạng dữ liệu này như sau:
datestamp timestamp – IP - > IP – domain/path – sensorname SENSOR
Tiếp theo cần phải dịch định dạng dữ liệu này vào GROK, và cần bộ gỡ lỗi GROK. Bộ gỡ lỗi nằm ở http://grokdebug.herokuapp.com/. Ở đây chỉ cần đặt chuỗi log cần so khớp tại dòng trên cùng, và trong dòng mẫu, nhập mẫu GROK phù hợp. Ứng dụng này sẽ cho thấy dữ liệu nào phù hợp. Điều quan trọng khi phát triển các chuỗi định dạng GROK là bắt đầu với các mẫu nhỏ và mở rộng chúng dần dần để phù hợp với toàn bộ dòng log (Hình 2.28).
Hình 2.28 Sử dụng trình gỡ lỗi GROK
Để phù hợp với dòng log, sẽ sử dụng mẫu:
%{DATE:date} %{TIME:time} - %{IP:sourceIP} - > %{IP:destIP} -
%{URIHOST:domain}%{URIPATHPARAM:request} - %{DATA:sensor} SENSOR Trong này đã bao gồm các nhãn trường theo sau mỗi trường. Áp dụng bộ lọc cho toàn bộ tệp tin cấu hình sẽ cho một cấu hình hoàn chỉnh, để phân tích tất cả các log Justniffer đi đến phù hợp với các định dạng xác định trước đó. Đây là tệp tin cấu hình kết quả:
input { file { type = > “Justniffer-Logs” path = > “/home/idsusr/justniffer.log” } } filter { grok { type = > “Justniffer-Logs”
match = > [ “message", “%{DATE:date} %{TIME:time} - %{IP:sourceIP} - > %{IP:destIP} - %{URIHOST:domain}%{URIPATHPARAM:request} - %{DATA:sensor} SENSOR” ] } } output {
elasticsearch { embedded = > true } }
Sau khi có được cấu hình, có thể bắt đầu bộ thu thập dữ liệu Logstash sử dụng tệp tin cấu hình mới:
Khi Logstash chạy, có thể bắt đầu thu thập dữ liệu với lệnh Justniffer để tạo ra dữ liệu log theo định dạng phù hợp với cấu hình vừa tạo:
sudo justniffer -p “tcp port 80” -u -l “%request.timestamp - %source.ip - > %dest.ip - %request.header.host%request.url - IDS1 SENSOR” >> /home/idsusr/justniffer.log
Khi chạy, lại cần phải duyệt một vài trang web để tạo ra log. Sau khi thu thập dữ liệu, kiểm tra lại Kibana và xem liệu log có được hiển thị lên hay không. Nếu mọi thứ chính xác, sẽ phải có được phân tích đầy đủ các log tùy chỉnh.
Hình 2.29 Kiểm tra bản ghi cá nhân trong Kibana
Có thể kiểm tra thang đo cho một trường bằng cách nhấn vào tên trường trong danh sách ở phía bên trái màn hình. Hình 2.30 là thang đo trường trong trường Host, dùng để hiển thị tất cả các máy đã truy cập trong các bản ghi hiện hành.
Hình 2.30 Kiểm tra thang đo trường trong Kibana
Như đã thấy, sự kết hợp của Logstash, Kibana, và GROK làm thành một bộ ba mạnh mẽ, thuận tiện cho việc phân tích các log giống như log được tạo ra bởi dữ liệu PSTR. Nếu muốn tìm hiểu thêm về những công cụ này, truy cập vào trang web Logstash tại http://logstash.net/.