Bài viết trước chúng ta đã tìm hiểu về cách thức quản lý cảnh báo (Alert) và sự cố (Incident) trong Microsoft Defender for Endpoint. Để có thể tìm hiểu kỹ hơn về sự cố, các thành phần liên quan cũng như điều tra và săn tìm mối đe dọa nâng cao (Advanced hunting), các chuyên gia bảo mật sẽ cần thêm khả năng truy vấn với KQL (Kusto Query Language).
Trong bài viết này, chúng ta sẽ khám phá các khía cạnh cơ bản của KQL và cách áp dụng nó trong công cụ Microsoft Defender for Endpoint. Nội dung bao gồm cú pháp, khái niệm chính, và các ví dụ thực tế để giúp bạn bắt đầu viết truy vấn của riêng mình.
Giới thiệu về KQL (Kusto Query Language)
Ngôn ngữ truy vấn KQL là một công cụ mạnh mẽ dùng để phân tích và khám phá dữ liệu trong các nền tảng bảo mật của Microsoft, như Azure Data Explorer, Azure Monitor, Microsoft Sentinel, Defender XDR. KQL cho phép các chuyên gia bảo mật chủ động săn tìm mối đe dọa, điều tra sự cố bảo mật và khai thác thông tin từ lượng lớn dữ liệu bảo mật – một trở ngại rất lớn khi tra cứu trên giao diện quản trị.
Tầm quan trọng của KQL nằm ở khả năng xử lý dữ liệu lớn một cách hiệu quả, với cú pháp trực quan và linh hoạt, phù hợp cho cả người mới bắt đầu và chuyên gia bảo mật. KQL đặc biệt hữu ích trong việc kết hợp với tính năng săn tìm nâng cao (Advanced Hunting) của Defender for Endpoint, nơi dữ liệu được tổ chức thành các bảng như DeviceEvents, DeviceFileEvents, và DeviceInfo, cho phép truy vấn chi tiết về hoạt động thiết bị.
Advanced Hunting trong MDE
Trong MDE, KQL được sử dụng trong tính năng Advanced Hunting, cho phép truy vấn dữ liệu từ nhiều bảng (schema) như sự kiện thiết bị, quy trình, tập tin, kết nối mạng,…. Điều này giúp đội ngũ bảo mật không chỉ phản ứng với các cảnh báo mà còn chủ động tìm kiếm các dấu hiệu bất thường trước khi chúng trở thành mối nguy hại lớn.
Truy cập vào Advanced Hunting thông qu đường dẫn https://security.microsoft.com, Investigation & Response > Hunting > Advanced Hunting (giao diện Unified SOC)
Dữ liệu trong Microsoft Defender for Endpoint được tổ chức thành nhiều bảng, mỗi bảng chứa thông tin về các khía cạnh khác nhau của hoạt động thiết bị. Việc làm quen với các bảng này là cần thiết để xây dựng truy vấn KQL hiệu quả. Dưới đây là danh sách một số bảng chính và mô tả ngắn gọn:
- DeviceEvents – chứa thông tin về các sự kiện trên thiết bị, như phát hiện antivirus, sự kiện tường lửa, và các hoạt động bảo mật khác.
- DeviceFileEvents – ghi lại các sự kiện liên quan đến tệp, bao gồm tạo, sửa đổi, và xóa tệp.
- DeviceInfo – cung cấp thông tin tĩnh về thiết bị, như tên thiết bị, hệ điều hành, và chi tiết phần cứng.
- DeviceNetworkEvents – ghi lại các sự kiện mạng, bao gồm kết nối và giao tiếp.
- DeviceProcessEvents – lưu trữ các sự kiện liên quan đến quy trình, như tạo, kết thúc, và thực thi quy trình.
- DeviceRegistryEvents – ghi lại các thay đổi trong sổ đăng ký Windows.
Chi tiết đầy đủ có thể tham khảo ở đây https://learn.microsoft.com/en-us/defender-xdr/advanced-hunting-schema-tables
Cú pháp chi tiết của KQL
KQL là ngôn ngữ truy vấn với các yêu cầu ở trạng thái chỉ đọc (read-only) để xử lý dữ liệu và trả về kết quả. Các yêu cầu ở dạng văn bản thuần túy, cú pháp dễ đọc, dễ viết và tự động hóa. Truy vấn sử dụng các thực thể lược đồ được sắp xếp theo thứ tương tự như ngôn ngữ truy vấn SQL: cơ sở dữ liệu, bảng và cột.
KQL trong Defender for Endpoint tuân theo cấu trúc cơ bản, bắt đầu bằng tên bảng, sau đó là các toán tử được nối bằng dấu pipe (|) để thực hiện các thao tác như lọc, chọn cột, sắp xếp, và tổng hợp. Một truy vấn KQL bao gồm:
- Nguồn dữ liệu: thường là tên bảng hoặc tập hợp dữ liệu (dataset)
- Toán tử (Operator): các lệnh xử lý dữ liệu, được nối với nhau bằng dấu |. Một số toán tử phổ biến gồm:
- where: lọc dữ liệu dựa trên điều kiện, ví dụ where Timestamp > ago(1d) để lọc sự kiện trong 1 ngày qua.
- project: Chọn các cột cụ thể để hiển thị, ví dụ project DeviceName, EventType lấy thông tin tên thiết bị, loại sự kiện
- sort by: Sắp xếp kết quả, ví dụ sort by DeviceName asc sắp xếp kết quả theo thứ tự tăng dần
- take: Giới hạn số hàng trả về, ví dụ take 10 để lấy 10 hàng đầu tiên.
- join: Kết hợp dữ liệu từ nhiều bảng dựa trên cột chung, ví dụ join DeviceInfo on DeviceId.
- summarize: Tổng hợp dữ liệu, như đếm (count()), tính trung bình (avg()), hoặc nhóm (by).
- ago(): Hàm thời gian để lọc dữ liệu trong khoảng thời gian nhất định, ví dụ ago(7d) cho 7 ngày trước.
- …
- Biểu thức (Expression): điều kiện lọc, tính toán, hoặc định dạng đầu ra
Một số use case cơ bản làm quen với KQL
Use case 1
Tình huống: Lọc dữ liệu sự kiện trên thiết bị
DeviceEvents
| where Timestamp > ago(7d)
| project DeviceName
| sort by DeviceName asc
| take 10
Giải thích:
Truy vấn này chọn sự kiện từ bảng DeviceEvents, lọc các sự kiện trong 7 ngày qua, hiển thị tên thiết bị, sắp xếp theo tên thiết bị tăng dần, và lấy 10 hàng đầu tiên.
Use case 2
Tình huống: liệt kê thiết bị đã được onboard
DeviceInfo
| where OnboardingStatus == "Onboarded"
| project DeviceName, OSPlatform, LoggedOnUsers
Giải thích:
Truy vấn này liệt kê các thiết bị đã được onboard, hiển thị tên thiết bị, nền tảng hệ điều hành, người dùng đăng nhập trên thiết bị.
Use case 3
Tình huống: tìm tất cả quy trình PowerShell được thực thi trên thiết bị trong 7 ngày qua, phát hiện các hoạt động PowerShell bất thường, vốn thường được tin tặc sử dụng để thực thi mã độc.
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName == "powershell.exe"
| project Timestamp, DeviceName, FileName, ProcessCommandLine
Giải thích:
- DeviceProcessEvents: Bảng chứa thông tin về các quy trình trên thiết bị.
- Timestamp > ago(7d): Lọc dữ liệu trong 7 ngày qua.
- FileName == “powershell.exe”: chỉ lấy các quy trình về PowerShell.
- project: chọn các cột cần thiết để xem thời gian, tên thiết bị, tên tập tin, và lệnh thực thi.
Use case 4
Tình huống: tìm các dữ liệu PowerShell tải tập tin từ Internet, phát hiện hành vi tải mã độc từ Internet, một kỹ thuật phổ biến trong các cuộc tấn công.
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName == "powershell.exe"
| where ProcessCommandLine has_any("DownloadFile", "WebClient", "http", "https")
| project Timestamp, DeviceName, ProcessCommandLine, InitiatingProcessFileName
Giải thích:
- has_any: Tìm các lệnh PowerShell chứa bất kỳ từ khóa nào liên quan đến tải tập tin từ web.
- InitiatingProcessFileName: Hiển thị quy trình khởi tạo PowerShell để kiểm tra nguồn gốc.
Use case 5
Tình huống: tổng hợp dữ liệu, đếm số lần thực thi PowerShell theo thiết bị. Mục tiêu xem thiết bị nào thực thi PowerShell nhiều nhất trong 30 ngày qua.
DeviceProcessEvents
| where Timestamp > ago(30d)
| where FileName == "powershell.exe"
| summarize PowerShellCount = count() by DeviceName
| order by PowerShellCount desc
Giải thích:
- summarize … by: Đếm số lần xuất hiện của PowerShell theo từng thiết bị.
- order by … desc: Sắp xếp theo thứ tự giảm dần để dễ nhận diện thiết bị có hoạt động bất thường.
Use case 6
Tình huống: tìm kết nối mạng đáng ngờ xuất phát từ quy trình PowerShell hoặc cmd.exe, điều tra các kết nối mạng đáng ngờ có thể liên quan đến việc liên lạc với máy chủ điều khiển và kiểm soát (C2).
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName in ("powershell.exe", "cmd.exe")
| join (
DeviceNetworkEvents
| where Timestamp > ago(7d)
) on DeviceId
| project Timestamp, DeviceName, FileName, ProcessCommandLine, RemoteIP, RemotePort
Giải thích:
- join: Kết hợp bảng DeviceProcessEvents (quy trình) với DeviceNetworkEvents (kết nối mạng) dựa trên DeviceId và ProcessId.
- Hiển thị thông tin về quy trình và địa chỉ IP đích mà tiến trình kết nối tới.
Ứng dụng thực tế cho đội ngũ bảo mật
KQL giúp đội ngũ bảo mật tổ chức thực hiện các tác vụ quan trọng như:
- Phát hiện mối đe dọa: Sử dụng truy vấn để tìm các hoạt động đáng ngờ, như quy trình bất thường hoặc tập tin thực thi mới.
- Điều tra sự cố: Phân tích dữ liệu từ các bảng để xác định phạm vi và tác động của sự cố, ví dụ, kiểm tra tất cả các thiết bị bị ảnh hưởng bởi một phát hiện liên quan đến mã độc, antivirus,….
- Quản lý vá lỗi: Xác định thiết bị có phần mềm dễ bị tấn công để ưu tiên vá lỗi.
- Giám sát liên tục: Theo dõi hoạt động người dùng và thiết bị để phát hiện hành vi bất thường, như đăng nhập nhiều lần từ cùng một tài khoản.
Best practice khi sử dụng KQL
Khi làm việc với KQL, có thể thực hiện theo một số best practice sau:
- Tối ưu hiệu suất truy vấn: Sử dụng bộ lọc hiệu quả và tránh tính toán không cần thiết để đảm bảo truy vấn chạy nhanh, đặc biệt với tập dữ liệu lớn.
- Cân nhắc về bảo mật: Cẩn thận với dữ liệu hiển thị, đảm bảo xử lý thông tin nhạy cảm theo chính sách bảo mật của tổ chức.
- Cập nhật truy vấn thường xuyên: Điều chỉnh truy vấn để thích nghi với các mối đe dọa mới và thay đổi trong môi trường.
- Kiểm tra trước khi chạy: Thử nghiệm truy vấn trên tập dữ liệu nhỏ trước khi áp dụng trên toàn bộ dữ liệu để đảm bảo kết quả chính xác.
Một số tài liệu tham khảo để tìm hiểu về KQL
Để tìm hiểu sâu hơn và tiếp tục hành trình học tập, bạn có thể tham khảo các nguồn sau:
- Kusto Query Language Overview: Hướng dẫn toàn diện về cú pháp và tính năng KQL.
- Kho mẫu truy vấn GitHub: Bộ sưu tập truy vấn mẫu cho săn tìm nâng cao trong Microsoft 365 Defender, bao gồm Defender for Endpoint.