Skip to content

BQL Cookbook (Công Thức)

Tổng hợp các truy vấn sẵn sàng sử dụng cho các tác vụ SOC phổ biến. Mỗi kịch bản bao gồm trường hợp thực tế, truy vấn BQL, và giải thích cách thức hoạt động.

📝
Các mẫu chỉ mục trong các ví dụ này (như `events-*`, `auth-*`, `firewall-*`) là **ví dụ minh họa**. Hãy thay thế bằng tên chỉ mục thực tế của bạn khi chạy truy vấn trong môi trường của bạn.

Kịch bản 1: Xem Dữ Liệu Đầu Tiên

Trường hợp sử dụng: Bạn vừa mở trình soạn thảo truy vấn và muốn xem dữ liệu trông như thế nào.

bql
from events-* | head 10

Giải thích: Trả về 10 sự kiện đầu tiên từ index events-*. Đây là truy vấn đơn giản nhất, chỉ cần trỏ vào dữ liệu và lướt qua.

Các trường sẽ thấy: ts, status, host, env, team, method, src_ip, user_id, action, bytes, latency.

Thử ngay: Thay events-* bằng authentication-*, firewall-*, hoặc dns-* để khám phá các tập dữ liệu khác.


Kịch bản 2: Tìm Tất Cả Lỗi

Trường hợp sử dụng: Có sự cố xảy ra. Tìm tất cả sự kiện lỗi.

bql
from events-* | search status=error | head 20

Giải thích: Lọc sự kiện chỉ lấy những sự kiện có status=error, sau đó hiển thị 20 sự kiện đầu tiên.

Tại sao điều này quan trọng: Trong môi trường sản xuất, sự kiện lỗi thường là dấu hiệu đầu tiên của sự cố. Lọc chỉ lấy lỗi giúp loại bỏ nhiễu.


Kịch bản 3: Đếm Sự Kiện Theo Trạng Thái

Trường hợp sử dụng: Xem nhanh tổng quan có bao nhiêu sự kiện là lỗi, cảnh báo, hoặc bình thường.

bql
from events-* | top 10 status

Giải thích: Trả về các giá trị status phổ biến nhất cùng số lần xuất hiện. Kết quả sẽ hiển thị dạng: ok: 4, error: 4, warning: 2.

Tại sao dùng top thay vì stats count? Lệnh top tạo bảng tần suất, mỗi hàng hiển thị một giá trị duy nhất và số lần nó xuất hiện. Đây là cách nhanh nhất để xem phân phối.


Kịch bản 4: Tìm Top Host Phát Sinh Nhiều Sự Kiện

Trường hợp sử dụng: Host nào đang tạo ra nhiều sự kiện nhất?

bql
from events-* | top 10 host

Giải thích: Trả về top 10 host theo số lượng sự kiện, sắp xếp giảm dần.

Ứng dụng SOC: Nếu một host tạo ra nhiều sự kiện hơn hẳn so với host khác, có thể nó đã bị xâm nhập, cấu hình sai, hoặc đang bị tấn công. Truy vấn này giúp xác định các bất thường đó.


Kịch bản 5: Sắp Xếp Sự Kiện Theo Thời Gian

Trường hợp sử dụng: Xem các sự kiện cũ nhất trước (sắp xếp tăng dần).

bql
from events-* | sort ts | head 20

Giải thích: Sắp xếp sự kiện theo thời gian tăng dần (cũ nhất trước), sau đó hiển thị 20 sự kiện đầu tiên.

Lưu ý: BQL mặc định sắp xếp tăng dần. Để xem các sự kiện gần nhất, kết hợp sort với head sau khi thu hẹp khoảng thời gian.


Kịch bản 6: Tìm Người Dùng Duy Nhất

Trường hợp sử dụng: Có bao nhiêu người dùng duy nhất trong nhật ký xác thực?

bql
from authentication-* | stats distinct_count(user)

Giải thích: Đếm số lượng giá trị user khác nhau trên tất cả sự kiện xác thực.

Nếu trường user bị thiếu? Hàm distinct_count bỏ qua các trường bị thiếu, nên chỉ những hàng có giá trị user thực tế mới được đếm.


Kịch bản 7: Đăng Nhập Thất Bại

Trường hợp sử dụng: Điều tra các lần đăng nhập thất bại.

bql
from authentication-* | search action=login_failure | sort ts | head 10

Giải thích: Tìm tất cả lần đăng nhập thất bại, sắp xếp theo thời gian (cũ nhất trước).

Ứng dụng SOC: Nhóm các lần đăng nhập thất bại từ cùng một IP có thể cho thấy tấn công brute force. Sắp xếp theo thời gian để xem chuỗi sự kiện và xác định patterns.


Kịch bản 8: Loại Bỏ Kết Nối Trùng Lặp

Trường hợp sử dụng: Xem các cặp nguồn-đích duy nhất trong nhật ký firewall.

bql
from firewall-* | dedup src_ip dst_ip dst_port | head 20

Giải thích: Loại bỏ các hàng trùng lặp dựa trên tổ hợp IP nguồn, IP đích, và cổng. Chỉ hiển thị các kết nối duy nhất.

Tại sao dùng dedup? Nhật ký firewall thường chứa nhiều bản ghi trùng lặp cho cùng một kết nối. Dedup loại bỏ nhiễu để bạn thấy các đường dẫn duy nhất đang được sử dụng.


Kịch bản 9: Đổi Tên Trường Để Dễ Đọc

Trường hợp sử dụng: Làm cho tên trường dễ hiểu hơn trong kết quả đầu ra.

bql
from events-* | search method=GET | rename method as http_method | head 10

Giải thích: Đổi tên method thành http_method trong kết quả, giúp rõ ràng hơn về ý nghĩa của trường.

Khi nào nên dùng: Đổi tên trường trước khi chia sẻ kết quả với người không kỹ thuật, hoặc khi tên trường gốc bị mơ hồ.


Kịch bản 10: Lọc Với Nhiều Điều Kiện

Trường hợp sử dụng: Tìm lỗi chỉ trên host môi trường production.

bql
from events-* | search status=error env=prod | head 20

Giải thích: Kết hợp hai điều kiện với AND ngầm định, chỉ trả về sự kiện thỏa cả HAI điều kiện.

Cách AND ngầm định hoạt động: Khi bạn đặt nhiều biểu thức field=value cạnh nhau trong lệnh search, BQL xử lý như thể chúng được nối bằng AND. Không cần viết từ khóa AND.


Mẹo Hữu Ích

  • Bắt đầu đơn giản. Bắt đầu với from <index> | head 10 để hiểu dữ liệu của bạn.
  • Nối lệnh lại. Pipeline BQL cho phép bạn nối các lệnh với nhau bằng |.
  • Dùng top để xem tần suất. Khi muốn biết "mỗi giá trị có bao nhiêu", top cho bạn số liệu.
  • Dùng dedup để tìm duy nhất. Khi muốn tổ hợp duy nhất, dedup là trợ thủ đắc lực.
  • Dùng rename để rõ nghĩa. Khi tên trường khó hiểu, đổi tên trước khi chia sẻ kết quả.
  • Kết hợp bộ lọc. Đặt nhiều search liên tiếp để thu hẹp kết quả nhanh chóng.

Phân Tích Mạng

Kịch bản 11: Top Host Truyền Nhiều Dữ Liệu Nhất

Trường hợp sử dụng: Host nào đang gửi nhiều dữ liệu nhất?

bql
from firewall-* | sort bytes desc | head 10

Giải thích: Sắp xếp sự kiện firewall theo số byte truyền tải (giảm dần) để tìm các lần truyền dữ liệu lớn nhất.


Kịch bản 12: Phân Tích Lệnh Từ Chối Của Firewall

Trường hợp sử dụng: Lưu lượng mạng nào đang bị chặn?

bql
from firewall-* | search action=deny | top 10 dst_port

Giải thích: Tìm tất cả kết nối bị từ chối và hiển thị các cổng bị nhắm đến thường xuyên nhất.


Kịch bản 13: Patterns Truy Vấn DNS

Trường hợp sử dụng: Các tên miền nào đang được truy vấn?

bql
from dns-* | top 10 query_name

Giải thích: Hiển thị top 10 tên miền được truy vấn nhiều nhất.


Kịch bản 14: Kết Nối Duy Nhất

Trường hợp sử dụng: Có bao nhiêu cặp nguồn-đích duy nhất?

bql
from firewall-* | dedup src_ip, dst_ip | stats count

Giải thích: Đếm các cặp IP nguồn-đích duy nhất trong nhật ký firewall.


Kịch bản 15: Kết Nối Truyền Nhiều Dữ Liệu

Trường hợp sử dụng: Tìm các kết nối truyền lượng dữ liệu lớn.

bql
from firewall-* | sort bytes desc | head 10

Giải thích: Hiển thị top 10 kết nối firewall theo kích thước truyền dữ liệu.


Điều Tra Người Dùng

Kịch bản 16: Dòng Thời Gian Hoạt Động Người Dùng

Trường hợp sử dụng: Xem tất cả hành động của một người dùng cụ thể.

bql
from auth-* | search user=alice | sort ts desc | head 20

Giải thích: Hiển thị 20 sự kiện xác thực gần nhất của người dùng "alice", sắp xếp mới nhất trước.


Kịch bản 17: Đăng Nhập Thất Bại Theo Người Dùng

Trường hợp sử dụng: Người dùng nào có nhiều lần đăng nhập thất bại nhất?

bql
from auth-* | search action=login_failure | top 10 user

Giải thích: Xác định người dùng có số lần đăng nhập thất bại cao nhất.


Kịch bản 18: Phát Hiện Khóa Tài Khoản

Trường hợp sử dụng: Tìm sự kiện khóa tài khoản.

bql
from auth-* | search action=lockout | head 20

Giải thích: Trả về tất cả sự kiện khóa tài khoản để điều tra.


Kịch bản 19: Truy Cập Ẩn Danh

Trường hợp sử dụng: Tìm lần đăng nhập không có người dùng được chỉ định.

bql
from auth-* | search user=null | head 20

Giải thích: Tìm các sự kiện xác thực mà trường user bị thiếu hoặc rỗng.


Kịch bản 20: Phân Tích Phiên Đăng Nhập

Trường hợp sử dụng: Theo dõi hoạt động phiên đăng nhập của người dùng.

bql
from auth-* | search user=alice | dedup session_id | head 10

Giải thích: Hiển thị các session ID duy nhất của người dùng "alice" để hiểu patterns phiên đăng nhập.


Phân Tích Tiến Trình

Kịch bản 21: Tiến Trình Duy Nhất Theo Host

Trường hợp sử dụng: Có tiến trình nào đang chạy trên mỗi host?

bql
from process-* | dedup host, process_name | head 20

Giải thích: Hiển thị tổ hợp tiến trình-host duy nhất.


Kịch bản 22: Tiến Trình Chạy Lâu Nhất

Trường hợp sử dụng: Tìm tiến trình chạy lâu nhất.

bql
from process-* | sort duration_ms desc | head 10

Giải thích: Hiển thị top 10 tiến trình chạy lâu nhất.


Kịch bản 23: Tiến Trình Thoát Với Lỗi

Trường hợp sử dụng: Tìm tiến trình thoát ra với lỗi.

bql
from process-* | search exit_code!=0 | head 20

Giải thích: Hiển thị tiến trình thoát với mã exit khác 0 (thất bại).


Kịch bản 24: Lệnh Khả Nghi

Trường hợp sử dụng: Tìm các thực thi lệnh có dấu hiệu đáng ngờ.

bql
from process-* | search cmdline="cat /etc/passwd" | head 10

Giải thích: Tìm các dòng lệnh chứa patterns đáng ngờ.


Kịch bản 25: Số Lượng Tiến Trình Theo Host

Trường hợp sử dụng: Mỗi host có bao nhiêu tiến trình?

bql
from process-* | stats count by host

Giải thích: Đếm số sự kiện tiến trình trên mỗi host.


Phát Hiện Nâng Cao

Kịch bản 26: Phát Hiện Brute Force

Trường hợp sử dụng: Tìm người dùng có số lần đăng nhập thất bại bất thường cao.

bql
from auth-* | search action=login_failure | stats count by user | sort count desc | head 10

Giải thích: Xác định người dùng có nhiều lần đăng nhập thất bại nhất, chỉ báo quan trọng của tấn công brute force.


Kịch bản 27: Phân Tích Xu Hướng Theo Thời Gian

Trường hợp sử dụng: Xem lưu lượng sự kiện theo thời gian.

bql
from events-* | timechart span=1h count

Giải thích: Hiển thị số lượng sự kiện theo giờ để xác định patterns lưu lượng và bất thường.


Kịch bản 28: Tổng Hợp Nhiều Trường

Trường hợp sử dụng: Đếm người dùng duy nhất trên mỗi host.

bql
from auth-* | stats distinct_count(user) by host | sort distinct_count desc | head 10

Giải thích: Hiển thị host nào có nhiều người dùng xác thực nhất.


Kịch bản 29: Tổng Hợp Nhiều Thống Kê

Trường hợp sử dụng: Thực hiện cùng lúc đếm, tổng và trung bình bytes trên mỗi host.

bql
from firewall-* | stats count, sum(bytes), avg(bytes) by host | head 10

Giải thích: Thực hiện nhiều phép tổng hợp trong cùng một lệnh stats. Tất cả các phép tổng hợp chia sẻ chung mệnh đề by. Kết quả hiển thị cột count, sum_bytes, và avg_bytes cho mỗi host.

Tại sao dùng multi-agg? Thay vì chạy 3 truy vấn riêng biệt, bạn có thể lấy tất cả thống kê trong một lần. Điều này tiết kiệm thời gian và đảm bảo dữ liệu được tính trên cùng một tập sự kiện.


Kịch bản 29: Lọc Phức Tạp

Trường hợp sử dụng: Tìm lỗi môi trường production trên host cụ thể.

bql
from events-* | search status=error and env=prod and host=web-01 | head 20

Giải thích: Kết hợp nhiều điều kiện để thu hẹp vào kịch bản lỗi cụ thể.


Kịch bản 30: Điều Tra Liên Index

Trường hợp sử dụng: Correlate lỗi xác thực với truy vấn DNS từ nguồn giống nhau.

bql
from auth-*, dns-* | search action=login_failure | head 20

Giải thích: Truy vấn nhiều index pattern để tìm sự kiện liên quan trên các nguồn dữ liệu khác nhau.


Chủ Đề Liên Quan

Released under the MIT License.