Triển khai Microsoft Defender for Endpoint (Phần 14) – Tìm hiểu ngôn ngữ truy vấn KQL (tiếp theo)

  1. Home
  2. »
  3. Microsoft Security
  4. »
  5. Triển khai Microsoft Defender for Endpoint (Phần 14) – Tìm hiểu ngôn ngữ truy vấn KQL (tiếp…

Danh mục bài viết:

Ở bài trước chúng ta đã tìm hiểu sơ lược về ngôn ngữ truy vấn KQL, hôm nay chúng ta sẽ đi sâu hơn vào một số ví dụ cụ thể.

Sử dụng môi trường demo

Môi trường demo về KQL được Microsoft dựng sẵn trên Microsoft Azure. Nếu chưa có tài khoản, bạn có thể tạo một tài khoản dùng thử ở địa chỉ Create Your Azure Free Account Or Pay As You Go | Microsoft Azure. Với tài khoản này, bạn sẽ có 200 USD sử dụng các dịch vụ trên Microsoft Azure trong 30 ngày.

Truy cập Log Analytics https://aka.ms/lademo và đăng nhập bằng tài khoản Azure có quyền phù hợp để sử dụng được chức năng của Log Analytics. Đây là môi trường demo với mục đích giúp người dùng học sử dụng ngôn ngữ KQL hiệu quả hơn.

Lưu ý có thể sẽ cần tùy chỉnh lại thời gian phù hợp trong truy vấn để có thể thấy được dữ liệu. Chẳng hạn bạn tìm kiếm trong 7 ngày gần nhất không thấy dữ liệu, thì nên mở rộng thời gian tìm kiếm rộng hơn như 10 ngày, 30 và có thể là 60 ngày gần nhất.

Ví dụ 1

SecurityEvent
| where TimeGenerated > ago(20d)

Tìm các sự cố bảo mật trong 20 ngày gần nhất

SecurityEvent
| where TimeGenerated > ago(20d) and EventID == 4624

Tìm các sự cố bảo mật trong 20 ngày gần nhất, có mã sự kiện là 4624

SecurityEvent
| where TimeGenerated > ago(60d)
| where EventID == 4624
| where AccountType =~ "user"

Tìm các sự cố bảo mật trong 60 ngày gần nhất, có mã sự kiện là 4624 liên quan đến loại tài khoản người dùng.

SecurityEvent
| where TimeGenerated > ago(7d) and EventID in (4624, 4625)

Tìm các sự cố bảo mật trong 7 ngày gần nhất, có mã sự kiện là 4624 hoặc 4625.

Ví dụ 2

let timeOffset = 10d;
let discardEventId = 4688;
SecurityEvent
| where TimeGenerated > ago(timeOffset*2) and TimeGenerated < ago(timeOffset)
| where EventID != discardEventId

Cú pháp let cho phép khai báo biến có khả năng tái sử dụng về sau. Trong ví dụ này có 2 biến là:

  • timeOffset: đại diện cho khoảng thời gian là 10 ngày
  • discardEventId: đại diện cho mã sự kiện, với mục đích loại bỏ các sự kiện có mã 4688 ra khỏi kết quả truy vấn

Truy vấn lấy dữ liệu từ các sự kiện bảo mật trong bảng SecurityEvent, lọc các sự kiện xảy ra trong khoảng thời gian từ 20 ngày trước đến 10 ngày trước so với thời điểm hiện tại. Loại bỏ các sự kiện có mã EventID là 4688.

Ví dụ 3

let suspiciousAccounts = datatable(account: string) [

@"NA\timadmin",
@"NT AUTHORITY\SYSTEM"

];
SecurityEvent
| where TimeGenerated > ago(7d)
| where Account in (suspiciousAccounts)

Truy vấn này tìm kiếm các sự kiện bảo mật trong 7 ngày gần nhất liên quan đến hai tài khoản đáng ngờ:

  • NA\timadmin (có thể là tài khoản quản trị nội bộ hoặc tài khoản giả mạo).
  • NT AUTHORITY\SYSTEM (tài khoản hệ thống Windows, thường bị khai thác bởi malware hoặc kẻ tấn công nếu có hoạt động bất thường).

Ví dụ 4

let LowActivityAccounts =

SecurityEvent
| where TimeGenerated > ago(60d)
| summarize cnt = count() by Account
| where cnt < 1000;

LowActivityAccounts | where Account contains "sql"

Xác định các tài khoản có hoạt động thấp (dưới 1000 sự kiện) từ bảng SecurityEvent trong 60 ngày gần nhất. Từ danh sách này, lọc ra những tài khoản có tên chứa chuỗi “sql” (có thể liên quan đến SQL Server, cơ sở dữ liệu, hoặc quản trị viên SQL).

Ví dụ 5

SecurityEvent
| where TimeGenerated > ago(30d)
| where ProcessName != "" and Process != ""
| extend StartDir =  substring(ProcessName,0, string_size(ProcessName)-string_size(Process))

  • Truy vấn các sự kiện ra trong 30 ngày gần nhất, loại bỏ các bản ghi không có thông tin hợp lệ về ProcessName và Process.
  • Tạo một cột mới có tên StartDir lấy đường dẫn thư mục khởi chạy từ đường dẫn đầy đủ bằng cách trích xuất phần đầu của ProcessName (loại bỏ tên tập tin thực thi Process).

 

SecurityEvent
| where TimeGenerated > ago(30d)
| where ProcessName != "" and Process != ""
| extend StartDir =  substring(ProcessName,0, string_size(ProcessName)-string_size(Process))
| order by StartDir desc, Process asc

  • Truy vấn các sự kiện ra trong 30 ngày gần nhất, chỉ lấy các bản ghi có thông tin tiến trình hợp lệ về ProcessName và Process.
  • Tạo một cột mới có tên StartDir lấy đường dẫn thư mục khởi chạy từ đường dẫn đầy đủ bằng cách trích xuất phần đầu của ProcessName (loại bỏ tên tập tin thực thi Process.
  • Sắp xếp kết quả theo StartDir giảm dần và Process tăng dần

 

SecurityEvent
| where TimeGenerated > ago(30d)
| where ProcessName != "" and Process != ""
| extend StartDir =  substring(ProcessName,0, string_size(ProcessName)-string_size(Process))
| order by StartDir desc, Process asc
| project Process, StartDir

  • Truy vấn các sự kiện ra trong 30 ngày gần nhất, chỉ lấy các bản ghi có thông tin tiến trình hợp lệ về ProcessName và Process.
  • Tạo một cột mới có tên StartDir lấy đường dẫn thư mục khởi chạy từ đường dẫn đầy đủ bằng cách trích xuất phần đầu của ProcessName (loại bỏ tên tập tin thực thi Process).
  • Sắp xếp kết quả theo StartDir giảm dần và Process tăng dần.
  • Chỉ hiển thị 2 cột Process và StarDir

 

SecurityEvent
| where TimeGenerated > ago(30d)
| where ProcessName != "" and Process != ""
| extend StartDir =  substring(ProcessName,0, string_size(ProcessName)-string_size(Process))
| order by StartDir desc, Process asc
| project-away ProcessName

  • Truy vấn các sự kiện ra trong 30 ngày gần nhất, chỉ lấy các bản ghi có thông tin tiến trình hợp lệ về ProcessName và Process.
  • Tạo một cột mới có tên StartDir lấy đường dẫn thư mục khởi chạy từ đường dẫn đầy đủ bằng cách trích xuất phần đầu của ProcessName (loại bỏ tên tập tin thực thi Process).
  • Sắp xếp kết quả theo StartDir giảm dần và Process tăng dần.
  • Loại bỏ cột ProcessName, giữ lại tất cả các cột khác

 

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
Bài viết công nghệ:
0
Rất thích suy nghĩ của bạn, hãy bình luận.x