..

Suricata, Lua and rules writing

Suricata

Suricata là một giải pháp IDS/IPS mã nguồn mở. Nó được xây dựng từ các thành phần khác nhau và khả năng hoạt động của nó tùy thuộc vào cách thức cấu hình, cài đặt cho hệ thống.

Cài đặt cho fedora bằng lệnh

sudo dnf install suricata -y

Cấu hình của Suricata được lưu trong /etc/suricata/suricata.yaml. Rules được lưu tại /var/lib/suricata/rules/ và log được lưu tại /var/log/suricata/.

Kiểm tra trạng thái của Suricata bằng lệnh

sudo systemctl status suricata

Bước setup đầu tiên là cấu hình network interface và địa chỉ IP mà tại đó Suricata sẽ hoạt động.

Xem chi tiết các thông tin trên bằng lệnh ip addr.

Ví dụ:

sudo suricata -i wlp8s0

Một số config trong file suricata.yaml.

##
## Step 1: Inform Suricata about your network
##

vars:
  # more specific is better for alert accuracy and performance
  address-groups:
    HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
    #HOME_NET: "[192.168.0.0/16]"
    #HOME_NET: "[10.0.0.0/8]"
    #HOME_NET: "[172.16.0.0/12]"
    #HOME_NET: "any"

HOME_NET là các dải địa chỉ IP mà Suricata sẽ giám sát. Mặc định nó định nghĩa sẵn các dải địa chỉ IPv4 dành riêng cho mạng nội bộ theo chuẩn RFC 1918.

Ta có thể giới hạn HOME_NET lại thành một dải IP cụ thể để giảm số lượng false positive

Sửa interface mặc định:

af-packet:
  - interface: wlp8s0

Kiểm tra trạng thái hoạt động:

sudo systemctl status suricata
● suricata.service - Suricata Intrusion Detection Service
     Loaded: loaded (/usr/lib/systemd/system/suricata.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Fri 2026-04-03 10:55:03 +07; 1s ago

Tổng quan về Rules

Suricata rules được chia thành 3 phần chính là rule action, rule headerrule options. Ví dụ:

drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..); flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)

drop là action, thông báo cho ta biết sẽ drop gói tin nếu rule này match, tcp $HOME_NET any -> $EXTERNAL_NET any là header, nó định nghĩa giao thức, địa chỉ nguồn, cổng nguồn, địa chỉ đích và cổng đích. Phần còn lại là options, nó chứa các điều kiện để rule này match và các thông tin khác như message, reference, classtype, sid và rev.

Actions sẽ cho biết phương thức xử lí đối với dữ liệu được phân tích, các cơ chế trong mode IDS bao gồm pass, alert, log.

  • Alert: Hệ thống tự động ghi log cảnh báo và lưu lại thông tin packet được phân tích có dâu hiệu.
  • Log: Tương tự Alert nhưng không lưu lại dữ liệu được phân tích khi có cảnh bảo
  • Pass: Thông báo không tiếp tục xử lý gói tin

Header có chữ dấu -> để xác định hướng đi của dữ liệu được phân tích. Có 2 dạng đó là -><>.

-> là hướng đi vào một chiều, ví dụ client -> server 80. Còn <> là hướng đi hai chiều, cả chiều vào lẫn chiều ra.

alert tcp any any <> any 80 (msg:'example'; sid:2;)

Phần còn lại của rules là options, options sẽ có dạng <option>:<values>;. Một số options quan trọng:

  • msg: được sử dụng để mô tả thông báo cho hệ thống
  • sid: được sử dụng để xác định tính duy nhất các rules được tạo. Mỗi rules có một giá trị duy nhất và không trùng nhau.
  • rev: được sử dụng để xác định khi một rule thay đổi. Khi đổi rule thì chỉ cần cập nhật lại rev mà không cần thay đổi sid. …

Lí thuyết về phần này mọi người tham khảo doc của suricata 7.0

Test rules

Demo: Mặc định thì rules của suricata được lưu tại /var/lib/suricata/rules/. Thêm file rules custom vào :


default-rule-path: /var/lib/suricata/rules

rule-files:
  - suricata.rules
  - local.rules 

Sau đó tạo file local.rules và thêm nội dung sau vào:

alert icmp any any -> any any (msg:"custom rule"; sid:3000001; rev:1;)

Sau đó restart lại suricata:

sudo suricata -T -c /etc/suricata/suricata.yaml
sudo suricata -i wlp8s0

Để lấy log theo thời gian thực ta có thể sử dụng lệnh:

sudo tail -f /var/log/suricata/fast.log

Check: thử ping 8.8.8.8 và xem kết quả:

...

Nếu muốn chạy suricata với một bộ rules cụ thể thì sử dụng:

sudo suricata -i wlp8s0 -S /var/lib/suricata/rules/local.rules

Xóa bớt log cũ:

sudo truncate -s 0 /var/log/suricata/fast.log