BÀI VIẾT

Hướng dẫn tự viết rule cho Suricata

3.4K
author Nguyễn Ngọc Đang - 2022-07-01 10:24:26 (GMT+7)

Giới thiệu

Các hướng dẫn trước đã giới thiệu cách cài đặt và cấu hình Suricata. Tuy nhiên, các quy tắc mà chúng ta đã tải xuống trong hướng dẫn đó rất nhiều và bao gồm nhiều giao thức, ứng dụng và rule tấn công khác nhau có thể không liên quan đến mạng và máy chủ của chúng ta.

Trong hướng dẫn này, sẽ tiến hành tìm hiểu cách cấu trúc signatures Suricata và một số tùy chọn quan trọng thường được sử dụng trong hầu hết các quy tắc. Khi đã quen với cách hiểu cấu trúc và các trường trong signatures, thì có thể viết signatures của riêng kết hợp với tường lửa để cảnh báo về những lưu lượng đáng ngờ nhất đến máy chủ mà không cần sử dụng bộ quy tắc.

Khi có bộ quy tắc mô tả phần lớn lưu lượng truy cập hợp pháp và đáng ngờ gặp phải trong mạng, chúng ta có thể bắt đầu loại bỏ có chọn lọc lưu lượng truy cập không hợp lệ bằng cách sử dụng Suricata trong chế độ Ngăn chặn xâm nhập (IPS) đang hoạt động.

Điều kiện cần

Nếu như chúng ta đang theo dõi bài hướng dẫn cách cài đặt và thiết lập 1 số cấu hình với Suricata thì chúng ta đã có Suricata đang chạy trên máy chủ Ubuntu 20.04.

Nếu như chúng ta vẫn chưa cài đặt Suricata thì chúng ta có thể theo dõi bài hướng dẫn cách cài đặt và thiết lập 1 số cấu hình với Suricata

Hiểu cấu trúc của Suricata Signatures

Ban đầu, Suricata Signatures có thể phức tạp, nhưng khi tìm hiểu về cấu trúc của chúng và cách Suricata xử lý chúng, thì chúng ta sẽ có thể tạo các quy tắc của riêng mình để phù hợp với yêu cầu của mội hệ thống.

Suricata Signatures bao gồm ba phần:

  • Action: Thực hiện khi lưu lượng truy cập phù hợp với quy tắc.
  • Header: Mô tả máy chủ, địa chỉ IP, cổng, giao thức và hướng lưu lượng (đến hoặc đi).
  • Options: Chỉ định những thứ như ID chữ ký ( sid), thông báo nhật ký, biểu thức chính quy khớp với nội dung của gói, kiểu phân loại và các công cụ sửa đổi khác có thể giúp thu hẹp xác định lưu lượng truy cập hợp pháp và đáng ngờ.

Cấu trúc chung của một Suricata Signatures như sau:

ACTION HEADER OPTIONS

Phần Header và phần Options của Signatures có nhiều phần.

Ví dụ: Trong hướng dẫn trước, chúng ta đã thử nghiệm Suricata bằng cách sử dụng quy tắc với sid 2100498. Đây là quy tắc đầy đủ để tham khảo:

alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

Trong đó:

  • Phần alert: là Action
  • ip any any -> any any: là Header
  • Và phần còn lại của chữ ký bắt đầu bằng (msg:GPL ATTACK_RESPONSE... ) chứa các Options của quy tắc .

Trong các phần sau, chúng ta sẽ xem xét chi tiết từng phần của quy tắc Suricata.

Actions

Phần Actions của Suricata chỉ định hành động cần thực hiện khi một gói phù hợp với quy tắc. Một hành động có thể là một trong những hành động sau tùy thuộc vào việc Suricata đang hoạt động ở chế độ IDS hay IPS:

  • Pass: Suricata sẽ ngừng quét và cho phép gói mà không tạo ra cảnh báo.
  • Drop: Khi làm việc ở chế độ IPS, Suricata sẽ ngay lập tức ngừng xử lý gói tin và tạo ra một cảnh báo. Nếu kết nối tạo ra gói tin sử dụng TCP, nó sẽ hết thời gian chờ.
  • Reject: Khi Suricata đang chạy chế độ IPS, một gói đặt lại TCP sẽ được gửi và Suricata sẽ bỏ gói phù hợp.
  • Alert: Suricata sẽ tạo một cảnh báo và ghi lại nó để phân tích thêm.

Headers

Mỗi Suricata Signatures Signatures có một phần Headers mô tả giao thức mạng, địa chỉ IP nguồn và đích, cổng và hướng lưu lượng. Ví dụ sid:2100498 phần tiêu đề của quy tắc là ip any any -> any any phần được đánh dấu:

alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

Định dạng chung của phần Headers của quy tắc là:

<PROTOCOL> <SOURCE IP> <SOURCE PORT> -> <DESTINATION IP> <DESTINATION PORT>

Giao thức có thể là một trong nhưng giao thức sau:

  • TCP
  • UDP
  • ICMP
  • IP

Các trường Source và Destination có thể là địa chỉ IP hoặc dải mạng hoặc giá trị đặc biệt any, sẽ khớp với tất cả các địa chỉ IP và mạng. Mũi ->tên chỉ hướng lưu thông.

Nếu chúng ta muốn cảnh báo về lưu lượng rời khỏi mạng của chúng ta thì trường Source sẽ là địa chỉ IP hoặc dải mạng của hệ thống của chúng ta. Destination có thể là IP hoặc mạng của hệ thống từ xa hoặc giá trị đặc biệt any.

Ngược lại, nếu chúng ta muốn tạo cảnh báo về lưu lượng đến, trường Source có thể được đặt thành any và Destination thành địa chỉ IP hoặc dải mạng của hệ thống của chúng ta.

Options

Các đối số bên trong dấu ngoặc đơn (. . .) trong Suricata Signatures chứa các Options và công cụ sửa đổi từ khóa khác nhau mà chúng ta có thể so sánh trên các phần của gói, phân loại quy tắc hoặc ghi nhật ký các thông báo tùy chỉnh. Trong khi các đối số Headers của quy tắc hoạt động trên tiêu đề gói ở cấp IP, cổng và giao thức, các Options khớp với dữ liệu chứa bên trong gói.

Các Options trong quy tắc Suricata phải được phân tách bằng dấu chấm phẩy và thường sử dụng định dạng khóa: giá trị. Một số tùy chọn không có bất kỳ cài đặt nào và chỉ tên cần được chỉ định trong một quy tắc.

Để thêm Options với giá trị SSH traffic detected on non-SSH port giải thích nội dung của cảnh báo:

alert ssh any any -> 103.97.125.151 !22 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000;)

Tuy nhiên, có một số tùy chọn cốt lõi như content keyword và các từ khóa Meta khác nhau được sử dụng trong hầu hết các chữ ký, chúng ta sẽ tìm hiểu trong các phần sau.

Content Keyword

Một trong những tùy chọn quan trọng nhất cho bất kỳ quy tắc nào là Content Keyword

Ví dụ quy tắc SID: 2100498:

alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

Chúng ta có thể thấy nội dung content:"uid=0|28|root|29|" phần chứa từ khóa nội dung và giá trị mà Suricata sẽ tìm kiếm bên trong một gói.

Trong trường hợp này, tất cả các gói từ bất kỳ địa chỉ IP nào trên bất kỳ cổng nào sẽ được kiểm tra để đảm bảo chúng không chứa giá trị chuỗi content:"uid=0|28|root|29|". Content Keyword có thể được sử dụng với hầu hết các từ khóa khác trong Suricata. Chúng ta có thể tạo quy tắc cụ thể bằng cách sử dụng các kết hợp của Headers và các Options nhắm mục tiêu các giao thức ứng dụng cụ thể, sau đó kiểm tra nội dung gói cho các byte, chuỗi hoặc khớp riêng lẻ bằng cách sử dụng các biểu thức thông thường.

Ví dụ: Quy tắc kiểm tra lưu lượng DNS đang tìm kiếm bất kỳ gói nào với nội dung danglab.xyz (thay sang domain thích hợp của bạn) và tạo cảnh báo:

alert dns any any -> any any (msg:"DNS LOOKUP for danglab.xyz"; dns.query; content:"danglab.xyz"; sid:1000001;)

Tuy nhiên, quy tắc này sẽ không khớp nếu truy vấn DNS sử dụng miền DANGLAB.XYZ, vì Suricata mặc định so sánh nội dung phân biệt chữ hoa chữ thường. Để làm cho nội dung so sánh không phân biệt chữ hoa chữ thường, hãy thêm từ khóa nocase vào quy tắc:

Ví dụ: Quy tắc kiểm tra lưu lượng DNS đang tìm kiếm bất kỳ gói nào với nội dung danglab.xyz (thay sang domain thích hợp của bạn) và tạo cảnh báo không phân biệt chữ hoa chữ thường

alert dns any any -> any any (msg:"DNS LOOKUP for danglab.xyz"; dns.query; content:"danglab.xyz"; nocase; sid:1000001;)

Bây giờ bất kỳ sự kết hợp nào của chữ thường hoặc chữ hoa sẽ vẫn phù hợp với content keyword.

msg Keyword

Trong các quy tắc chúng ta đều chứa các từ khóa msg với thông tin về quy tắc. Tùy chọn này không bắt buộc, nhưng việc để trống sẽ khiến chúng ta khó hiểu tại sao lại xảy ra hành động cảnh báo hoặc bỏ qua khi kiểm tra nhật ký của Suricata.

Tuỳ chọn msg được thiết kế để trở thành một mô tả văn bản mà con người có thể đọc được về một cảnh báo. Nó phải mang tính mô tả và thêm ngữ cảnh vào cảnh báo để chúng ta hoặc người khác đang phân tích nhật ký hiểu tại sao cảnh báo được kích hoạt.

sid và rev Keywords

Mỗi Quy tắc Suricata cần một ID (SID). Nếu hai quy tắc có cùng SID (trong ví dụ sau đầu ra, nó là SID: 10000000), Suricata sẽ không bắt đầu và thay vào đó sẽ tạo ra lỗi như sau:

Kết quả
. . .
29/03/2022 -- 09:12:32 - <Error> - [ERRCODE: SC_ERR_DUPLICATE_SIG(176)] - Duplicate signature "drop ssh any any -> 127.0.0.0/8 !22 (msg:"blocked invalid ssh"; sid:10000000;)"
. . .

Khi chúng ta tạo chữ ký của riêng, phạm vi 1000000-1999999 được dành riêng cho các quy tắc tùy chỉnh. Các quy tắc tích hợp của Suricata nằm trong khoảng từ 2200000-2299999.

Tùy chọn sid thường là phần cuối cùng của quy tắc Suricata. Tuy nhiên, nếu có nhiều phiên bản của quy tắc với những thay đổi theo thời gian, thì có tùy chọn rev được sử dụng để chỉ định phiên bản của quy tắc.

Ví dụ: Cảnh báo SSH trước đó trong hướng dẫn này có thể được thay đổi thành chỉ quét lưu lượng SSH trên cổng 2022:

alert ssh any any -> 103.97.125.151 2022 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000; rev:2;)

Quy tắc cập nhật hiện bao gồm rev:2, cho biết nó đã được cập nhật từ phiên bản trước.

reference Keyword

reference Keyword được sử dụng trong quy tắc để mô tả nơi tìm thêm thông tin về cuộc tấn công hoặc vấn đề mà một quy tắc được dùng để phát hiện.

Ví dụ: Nếu quy tắc được thiết kế để phát hiện một loại phương pháp khai thác hoặc tấn công mới, trường tham chiếu có thể được sử dụng để liên kết đến nhà nghiên cứu bảo mật hoặc trang web của công ty có tài liệu về vấn đề.

Lỗ hổng Heartbleed trong OpenSSL là một ví dụ về một lỗi được nghiên cứu và công bố rộng rãi. Suricata đi kèm với chữ ký được thiết kế để kiểm tra các gói TLS không chính xác và bao gồm tham chiếu đến mục CVE Heartbleed chính :

/etc/suricata/rules/tls-events.rules
alert tls any any -> any any (msg:"SURICATA TLS invalid heartbeat encountered, possible exploit attempt (heartbleed)"; flow:established; app-layer-event:tls.invalid_heartbeat_message; flowint:tls.anomaly.count,+,1; classtype:protocol-command-decode; reference:cve,2014-0160; sid:2230013; rev:1;)

Lưu ý: reference:cve,2014-0160; được đánh dấu của quy tắc. Tùy chọn tham chiếu này cho chúng ta hoặc nhà phân tích đang kiểm tra các cảnh báo từ Suricata nơi tìm thêm thông tin về vấn đề cụ thể.

classtype Keyword

Suricata có thể phân loại lưu lượng truy cập theo nhóm danh mục được định cấu hình trước được bao gồm khi chúng ta cài đặt gói Suricata với trình quản lý gói của bản phân phối Linux. File phân loại mặc định thường được tìm thấy trong /etc/suricata/classification.config như sau:

/etc/suricata/classification.config
#
# config classification:shortname,short description,priority
#

config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Potentially Bad Traffic, 2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: successful-recon-largescale,Large Scale Information Leak,2
config classification: attempted-dos,Attempted Denial of Service,2
...

Từ kết quả trên chúng ta có thể thấy mỗi mục phân loại có ba trường:

  • Tên ngắn gọn, có thể đọc được bằng máy, trong các ví dụ trên not-suspicious, unknownbad-unknown tương ứng.
  • Ví dụ, mô tả cho một phân loại được sử dụng với các cảnh báo Not Suspicious Traffic.
  • Trường ưu tiên, xác định thứ tự mà chữ ký sẽ được Suricata xử lý. Mức độ ưu tiên cao nhất là giá trị 1. Các chữ ký sử dụng bộ phân loại có mức độ ưu tiên cao hơn sẽ được kiểm tra đầu tiên khi Suricata xử lý một gói tin.

Trong ví dụ sid:2100498, classtypeclasstype:bad-unknown; như sau:

alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

Ưu tiên ngầm định cho chữ ký là 2, vì đó là giá trị được gán cho bad-unknownclasstype trong file /etc/suricata/classification.config. Nếu chúng ta muốn ghi đè mức độ ưu tiên mặc định cho một quy tắc, có thể thêm một tuỳ chọn priority:n trong đó n giá trị từ 1 đến 255.

target Keyword

Một tùy chọn hữu ích khác trong quy tắc Suricata là tuỳ chọn target. Nó có thể được đặt thành một trong hai giá trị: src_ipdest_ip. Mục đích của tùy chọn này là xác định chính xác sourcetarget lưu trữ trong nhật ký cảnh báo của Suricata.

Ví dụ: Quy tắc SSH từ trước đó trong hướng dẫn này có thể được nâng cao với target:dest_ip;:

alert ssh any any -> 103.97.125.151 2022 (msg:"SSH TRAFFIC on non-SSH port"; target:dest_ip; sid:1000000; rev:3;)

Ví dụ này sử dụng dest_ip được thiết kế để kiểm tra lưu lượng SSH đi vào mạng của chúng ta. Việc thêm tuỳ chọn target vào quy tắc sẽ dẫn đến các trường bổ sung sau trong alert phần của file eve.json

. . .
  "source": {
    "ip": "127.0.0.1",
    "port": 35272
  },
  "target": {
    "ip": "103.97.125.151",
    "port": 2022
  }
. . .

Với các mục nhập này trong nhật ký của Suricata, chúng có thể được gửi đến công cụ Quản lý sự kiện và thông tin bảo mật (SIEM) để giúp tìm kiếm các cảnh báo có thể bắt nguồn từ một máy chủ chung hoặc các cuộc tấn công hướng đến một mục tiêu cụ thể dễ dàng hơn. mạng.

Tổng Kết.

Qua bài viết hướng dẫn trên chúng ta hoàn tất việc tìm hiểu cách tự viết rule cho Suricata, cấu trúc quy tắc của Suricata. Hy vọng các bạn thành công trong việc áp dụng được Suricata vào trong thực tế, công việc.


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Hướng dẫn cài đặt SIEM dùng Suricata và Elastic Stack trên Ubuntu 20.04
Hướng dẫn cài đặt SIEM dùng Suricata và Elastic Stack trên Ubuntu 20.04
Hướng dẫn cài đặt Suricata trên Ubuntu 20.04
Hướng dẫn cài đặt Suricata trên Ubuntu 20.04
Hướng dẫn thiết lập Suricata làm Hệ thống ngăn chặn xâm nhập (IPS) trên Ubuntu 20.04
Hướng dẫn thiết lập Suricata làm Hệ thống ngăn chặn xâm nhập (IPS) trên Ubuntu 20.04

Cloud VPS tại 123HOST

Hiệu năng, ổn định và bảo mật

Cloud VPS giá rẻ

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận
Liên hệ chúng tôi