- 4.1 Tổng quan về rules
- 4.2 Meta-settings
- 4.3 Header keyword
- 4.5 Payload keyword
- 4.6 HTTP Keywords
- 4.7 Flow Keywords
- 4.10 File Keywords
- 4.9 Xbits
- 4.10 File Keywords
- 4.11 Rule Thresholding
Suricata rules được chia thành 2 phần chính là: rule header
và rule options
.
Rules header luôn là thành phần đầu tiên trong rules và nó đòi hỏi các thành phần cần có trong rules. Nó đòi hỏi các thành phần sau:
- Action: Việc xử lý đối vỡi dữ liệu được phân tích, các cơ chế trong mode IDS là:
Pass
,Alert
và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
Xác định giao thức sử dụng và đồng thời thông báo cho hệ thống biết nhóm rules nào sẽ được sử dụng. Có thể chọn một trong 4 giao thức như: tcp
, udp
, icmp
và ip
. Ngoài ra còn có thêm một số lựa chọn khác như: http
, ftp
, tls
(bao gồm cả ssl).
- Ví dụ về 1 rule
tcp
:
Xác định đích và nguồn IP của gói tin, xác định các IP hoặc dải IP sẽ được xử lý. trong quá trình cấu hình cho mã nguồn mở thì thành phần này càng được làm rõ thì hệ thống xử lý càng nhanh và đỡ tiêu tốn tài nguyên.
Có thể sử dụng biến HOME_NET
và EXTERNAL_NET
trong yaml file
để cấu hình địa chỉ nguồn và địa chỉ đích. Tham khảo Rule_varsđể có thể hiểu rõ hơn về vấn đề này.
Trong quá trình cấu hình địa chỉ nguồn và đích cho gói tin, có thể sử dụng tùy chọn !
.
- Ví dụ:
! 1.1.1.1 # Mọi địa chỉ ngoại trừ địa chỉ 1.1.1.1
Xác định địa chỉ nguồn và đích của gói tin. HTTP port là 80, https port 443. Thông thường source port được để thiết lập là any
. Một vài tùy chọn khi khai báo port như:
- !: Chỉ định mọi port ngoại trừ port này
- :: Định nghĩa một khoảng port chạy từ đâu tới đâu
- []: signs to make clear which parts belong together
- ,: Khai báo từng port riêng biệt
ác định chiều hướng đi của dữ liệu được phân tích. Có 2 dạng đó là
- Dữ liệu vào: ->
- Dữ liệu ra vào: <> Vì có 2 lựa chọn nên trong việc tạo luật cần xác định rõ thứ tự ưu tiên phân tích gói tin cho hệ thống xử lý.
Rule header chịu chức năng chính được mô tả giống như ai sẽ alf người chịu trách nhiệm, còn rule options có chức năng là vấn đề gì. Nó cho biết là sẽ tìm kiếm dấu hiệu gì trên các gói tin và làm sao để tìm kiếm nó.
Nội dung bên trong rules options là các biến số và nó có các lựa chọn khác nhau tùy vào cách tạo các rules. Các biến số này có dạng như sau: <option>:<values>
; Options này bao gồm tên và giá trị của no, được phân cách với nhau bởi dấu hai chấm.
Được sử dụng để mô tả cảnh báo cho hệ thống, nó sẽ hiển thị khi người phân tích nhận các cảnh báo
- Ví dụ:
ET POLICY Outgoing Basic Auth Base64 HTTP Password detected unencrypted
OS-WINDOWS SMB NTLM NULL session attempt
EXPLOIT-KIT Blackholev2 exploit kit jar file downloaded
Đượ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. Một dải sid được xác định như sau:
- 0-1000000: Sử dụng bởi sourcefire VRT
- 2000001-2999999: Sử dụng bởi Emerging Threats
- 3000000+: Sử dụng khi tạo rules mới
Là tùy chọn để xác định khi một rules được thay đổi. Lúc một rules mới được tạo ra, tốt nhất nên khai báo rev:1
để xác định nó là phiên bản đầu tiên của rules được tạo ra. Thay vì tạo sid mới khi thay đổi một rule, khi tạo luật nên giữ nguyên sid và thay đổi rev của nó.
Gid giống như sid. Mặc định Gid có giá trị là 1. Gid chỉ có thể nhận biết được bằng cách xem log cảnh báo
- Ví dụ dưới đây được check tại
fast.log
. Cảnh báo cógid là 1
,sid là 2008124
vàrev là 2
.
Được dùng để nhóm các loại rules vào các dạng tấn công mạng. Mỗi classtype bao gồm short name hoặc long name và chỉ số priority.
- Ví dụ:
Cung cấp thêm thông tin về luật được tạo. Thông thường nó được thêm vào là các đường dẫn ra ngoài cung cấp cụ thể về thông tin các luật được tạo:
- Ví dụ về url reference
reference: url, www.info.nl
- Một số định dạng cho reference như sau:
system URL Prefix
bugtraq http://www.securityfocus.com/bid
cve http://cve.mitre.org/cgi-bin/cvename.cgi?name=
nessus http://cgi.nessus.org/plugins/dump.php3?id=
arachnids (No longer available but you might still encounter this in signatures.)
http://www.whitehats.com/info/IDS
mcafee http://vil.nai.com/vil/dispVirus.asp?virus_k=
url http://
Là thứ tự ưu tiên khi phân tích dữ liệu của các rules, nó có giá trị từ 1-255
. Gía trị từ 1-4 được sử dụng nhiều nhất. Rules nào có độ ưu tiên cao hơn sẽ được kiểm tra trước. Priority cao nhất là 1. Priority có thể kiểm tra tại classtype
.
- Cú pháp:
priority:<value>;
ttl được dùng để kiểm tra thời gian sống time-to-live của gói tin IP.
- Cú pháp định dạng như sau:
ttl:<number>
- Lưu ý:
Nếu ttl được thiết lập là
0
, gói tin sẽ bị hủy ngya lập tức. Time-to-live dựa theo sốhop
.
Ipopts được thiết lập tại vị trí bắt đầu của rule. Ipopts có một vài tùy chọn đặc biệt như sau:
- Cú pháp:
ipopts: <name>
sameip được dùng để kiểm tra địa chỉ nguồn và địa chỉ đích của gói tin xem có giống nhau hay không
- Cú pháp:
sameip;
Mỗi packet đều có IP ID. Khi thực hiện phân mảnh gói tin, tất cả các mảnh đều có cùng ID với nhau. Điều này giúp cho bên nhận sẽ biết được các phân mảnh này thuộc cùng 1 gói tin và dễ dàng lắp ghép lại thành gói tin hoàn chỉnh.
- Cú pháp:
id:<number>;
Geoip là từ khóa để thiết lập xem gói tin xuất phát từ đâu, muốn đi đến đâu, xuất phát đến vùng nào, có vị trí địa lý ở đâu
- Cú pháp:
geoip: src, RU; # source address khớp với vùng miền được khai báo
geoip: both, CN, RU; # source và dst address khớp với vùng miền được khai báo
geoip: dst, CN, RU, IR;
geoip: both, US, CA, UK;
geoip: any, CN, IR;
Fragbits được dùng để kiểm tra về tính phân mảnh của gói tin, nó được thiết lập trong tiêu đề của gói tin và nằm tại vị trí đầu của rule.
- Cú pháp:
fragbits:[*+!]<[MDR]>;
fragbits: - M: tiếp tục phân mảnh gói tin
- D: không phân mảnh
- R: Reversed bit
Một vài tuy chọn đi kèm theo như:
+ : Khóp với bit được chỉ định
* : Khớp với bất kì bit nào được thiết lập
! : Khớp nếu không có bit nào được thiết lập
Seq được dùng để kiểm tra TCP sequence number. Số thứ tự SN tăng lên 1 mỗi khi byte dữ liệu được truyền đi
- Cú pháp:
seq:0;
Window được dùng để kiểm tra kích thước cửa sổ trượt. Window size có giá trị từ 2 cho tới 65535.
- Cú pháp:
window:[!]<number>;
Tham khảo thêm về ICMP keyword Tại đây
pcre - Perl compatible Regular expressions: Trong một số trường hợp không thể sử dụng các phương pháp thông thường để nhận dạng các dấu hiệu tấn công mạng. Đối với các trường hợp này, có thể sử dụng tới regex
để xác định các dấu hiệu tấn công mạng. Regex là một ngôn ngữ mạng trong việc xác định và nhận dạng các dạng chuối, kí tự... Hiện nay được sử dụng rộng rãi, đặc biệt là trong việc nhận dạng tấn công mạng của các sản phẩm an toàn thông tin.
Trong mỗi rules sẽ có thêm keyword pcre
để xác định các dạng dấu hiệu. Ví dụ rule phát hiện các credit có thể được viết như sau:
alert ip any any -> any any (msg:“ET POLICY SSN Detected in Clear Text (dashed)”; pcre:”/ ([0-6]\d\d|7[0-2 56]\d|73[0-3]|77[0-2])-\d{2}-\d{4} /”;reference:url,doc.emergingthreats.net/2001328; classtype:policy-violation; sid:2001328; rev:13;)
- Cấu trúc cú pháp của pcre như sau:
pcre:<regular expression>;
Trong cấu trúc rule của Suricata, mỗi rule chỉ sử dụng duy nhất 1 nội dung content
để giám sát các gói tin mạng trong môi trường Multi Pattern Matcher(MPM). Nếu trong rule có nhiều hơn một content được khai báo, Suricata sẽ sử dụng content có độ dài nhất và nọi dung chi tiết nhất.
Ví dụ sau khai báo 3 nội dung, content đầu tiên dài nhất sẽ được ưu tiên sử dụng.
User-agent: Mozilla/5.0 Badness;
content:”User-Agent|3A|”;
content:”Badness”; distance:0;
Với từ khóa fast_pattern
, có thể chỉ định Suricata sử dụng bất kì 1 content nào trong rule. Thây vì sử dụng content User_Agent
, ta sẽ chỉ định content Badness
với keyword fast_pattern
ở phía sau
content:”User-Agent|3A|”;
content:”Badness”; distance:0; fast_pattern;
Keyword này được sử dụng để match với 1 phần nào đó được chỉ định trong content
- Ví dụ thực hiện kiểm tra 4 kí tự cuối trong content
content: “aaaaaaaaabc”; fast_pattern:8,4;
Là dấu hiệu để xác định các mối hiểm họa an ninh mạng có thể xyar ra. Dấu hiệu có thể được sử dụng kết hợp nhiều dấu hiệu khác.
- Cú pháp:
content: ”............”;
content:“USER”; content:!“anonymous”;
Một vài kí tự đặc biệt có thể được biểu diễn như sau:
“ |22|
; |3B|
: |3A|
| |7C|
Sử dụng trong content để giúp các luật không phân biệt chữ hoa và chữ thường.
- Cú pháp:
nocase;
- Ví dụ:
content:"root";nocase;
Ví dụ trên giúp hệ thống phát hiện tất cả các từ khóa root
mà không phân biệt chữ hoa và chữ thường
Xác định vị trí bắt đầu phân tích trong một payload, thông thường nếu không khai báo gì thì hệ thống sẽ phân tích gói tin từ đầu tới hết, còn nếu là 1
thì hệ thống chỉ bắt đầu phân tích gói tin từ byte thứ 2 đến hết. Ngoài ra, nó còn cho phép xác định vị trí các dấu hiệu cần được kiểm tra để cảnh báo và giảm thiểu các cảnh báo sai.
- Ta cùng so sánh 2 ví dụ sau đây:
alert tcp $HOME_NET any ->67.205.2.30 21 (msg:“Suspicious FTP Login”;
content:“guest”; sid:5000000; rev:1;)
alert tcp $HOME_NET any -> 67.205.2.30 21 (msg:“Suspicious FTP Login”
content:“guest”; offset:5; sid:5000000; rev:1;)
Hai ví dụ trên xác định luật cho hệ thống khi có người dùng đăng nhập vào tài khoản guest, nhưng trong trường hợp này nếu không có offset thì hệ thống cảnh báo dễ bị nhầm lẫn khi có người dùng khác cùng đăng nhập vào tài khoản khác nhưng truy cập vào thư mực guest. Để giảm thiểu các cảnh báo sai, khi tạo luật cần chỉ rõ vị trí của giá trị cần kiểm tra.
Depth và offset có thể suer dụng đồng thời với nhau
Sử dụng khi có nhiều giá trị kiểm tra trong thành phần content của rules. Mục đích là xác định khoảng cách để tiếp tục kiểm tra các giá trị tiếp theo trên payload của dữ liệu
- ví dụ sau đây cho thấy, sau khi kiểm tra nội dung giá trị payload thứ nhất thì sau 16 byte mới tiếp tục kiểm tra nội dụng content thứ 2
alert tcp $HOME_NET 1024: -> $EXTERNAL_NET 1024: (msg:“ET P2P Ares Server Connection”; flow:established,to_server; dsize:<70; content:“r|be|bloop|00|dV”; content:“Ares|00 0a|”;
distance:16;reference:url,aresgalaxy.sourceforge.net;reference:url,doc.emergingthreats.net/bin/view/Main/2008591; classtype:policy-violation;
sid:2008591; rev:3;)
Distance có thể sử dụng số âm. Ví dụ sau:
Isdatat là từ khóa để kiểm tra 1 vị trí bất kì trong payload. Ngoài ra còn có 1 keyword khác nữa là relative
, được sử dụng để kiểm tra payload tại 1 vị trí bất kì kể từ content trước.
- Ví dụ sau thực hiện kiểm tra byte thứ 512 của payload. Dòng thứ 2 kiểm tra byte thứ 50 của payload kể từ content thứ nhất.
isdataat:512;
isdataat:50, relative;
Từ khóa này dùng kể kiểm tra kích thước của payload, nó còn thuận tiện trong việc xem hệ thống có bị tràn bộ đệm hay không
- Cú pháp:
dsize:<number>;
Replace là keyword chỉ có thể sử dụng trong chế độ IPS
. Ví dụ sau sẽ thay đổi content abc
thành def
phục vụ cho mục đích ngăn chặn xâm hại
Flowbits gồm 2 phần. Phần đầu tiên mô tả hành động mà nó sẽ thực hiện, phần thứ 2 chỉ ra tên của Flowbits
Có nhiều packet thuộc về 1 flow. Suricata lưu giữ các flow này trong memory. Để biết thêm thông tin chi tiết, truy cập Flow Settings. Flowbits sẽ tạo ra một cảnh báo khi mà hai gói tin khác nhau lại có sự giống nhau về dữ liệu bên trong.
Flowbits có các hành động như sau:
flowbits: set, name # thiết lập điều kiện `name` trong flow nếu có
flowbits: isset, name # được sử dụng để tạo ra cảnh báo nếu rule phát hiện trùng khớp với điều kiện đã được thiết lập
flowbits: toggle, name # đảo ngược lại cài đặt hiện tại đã theiets lập cho flow
flowbits: unset, name # bỏ điều kiện trong flow
flowbits: isnotset, name # tạo ra cảnh báo khi rule khớp và điều kiện không được thiết lập trong flow
flowbits: noalert # không có cảnh báo
- Ví dụ:
Chỉ ra nơi mà gói tin xuất phát hoặc đích mà gói tin cần đến. Một vài hành động của flow như:
- to_client: Các gói tin từ server tới client
- to_server: Các gói tin từ client tới server
- from_client: Giống như to_server
- from_server: Giống như to_client
- established: Đang thiết lập kết nối
- not_established: Ngược lại với established
- stateless: Match on packets that are and are not part of an established connection.
- only_stream: Match on packets that have been reassembled by the stream engine
- no_stream: Match on packets that have not been reassembled by the stream engine. Will not match packets that have been reeassembled.
- only_frag: Kết hợp gói tin từ các mảnh
- no_frag: Kết hợp gói tin chưa được tập hợp từ các mảnh
Ví dụ về TCP connection thiết lập kết nối bắt tay 3 bước
Đối với các giao thức khác, ví dụ như UDP, kết nối được coi là được thiết lập sau khi nhìn thấy lưu lượng truy cập từ cả hai phía
Đặt, bỏ đặt, chuyển đổi và kiểm tra các bit được lưu trữ trên mỗi host hoặc ip_pair
- Cú pháp:
xbits:noalert;
xbits:<set|unset|isset|toggle>,<name>,track <ip_src|ip_dst|ip_pair>;
xbits:<set|unset|isset|toggle>,<name>,track <ip_src|ip_dst|ip_pair> \
[,expire <seconds>];
xbits:<set|unset|isset|toggle>,<name>,track <ip_src|ip_dst|ip_pair> \
[,expire <seconds>];
- Chỉ ra tên file
- Cú pháp:
filename:<string>;
filename:"secret";
- Chỉ ra định dạng của file
- Cú pháp:
fileext:<string>;
fileext:"jpg";
- Matches on the information libmagic returns about a file.
- Cú pháp:
filemagic:<string>;
filemagic:"executable for MS Windows";
- Chỉ ra vị trí lưu giữ file
- Cú pháp:
filestore:<direction>,<scope>;
direction là 1 trong các trường hợp sau:
- request/to_server: store a file in the request / to_server direction
- response/to_client: store a file in the response / to_client direction
- both: store both directions
scope can be:
- file: only store the matching file (for filename,fileext,filemagic matches)
- tx: store all files from the matching HTTP transaction
- ssn/flow: store all files from the TCP session/flow.
- Match file MD5 against list of MD5 checksums.
- Cú pháp:
filemd5:[!]filename;
- Match on the size of the file as it is being transferred.
- Cú pháp:
filesize:<value>;
filesize:100; # exactly 100 bytes
filesize:100<>200; # greater than 100 and smaller than 200
filesize:>100; # greater than 100
filesize:<100; # smaller than 100
- Thresholding can be configured per rule and also globally
- Được sử dụng để kiểm soát tần suất xuất hiện cảnh báo. Nó có 3 mode là: threshold, limit hoặc both
- Cú pháp:
threshold: type <threshold|limit|both>, track <by_src|by_dst>, count <N>, seconds <T>
Loại này được sử dụng để đặt ngưỡng tối thiểu cho quy tắc trước khi nó tạo ra 1 cảnh báo.
- Ví dụ:
alert tcp !$HOME_NET any -> $HOME_NET 25 (msg:"ET POLICY Inbound Frequent Emails - Possible Spambot Inbound"; \
flow:established; content:"mail from|3a|"; nocase; \
threshold: type threshold, track by_src, count 10, seconds 60; \
reference:url,doc.emergingthreats.net/2002087; classtype:misc-activity; sid:2002087; rev:10;)
Rule này sẽ thiết lập cảnh báo khi máy chủ nhận được 10 emails từ cùng 1 máy trạm trong khoảng thời gian 1 phút
Giới hạn số lần cảnh báo khi rule match
- Ví dụ:
alert http $HOME_NET any -> any $HTTP_PORTS (msg:"ET USER_AGENTS Internet Explorer 6 in use - Significant Security Risk"; \
flow:to_server,established; content:"|0d 0a|User-Agent|3a| Mozilla/4.0 (compatible|3b| MSIE 6.0|3b|"; \
threshold: type limit, track by_src, seconds 180, count 1; \
reference:url,doc.emergingthreats.net/2010706; classtype:policy-violation; sid:2010706; rev:7;)
Ví dụ trên nói rằng sẽ có 1 cảnh báo được tạo ra trong vòng 3 phút nếu nội dung MSIE 6.0 được phát hiện
Loại này kết hợp 2 loại trên
- Ví dụ:
alert tcp $HOME_NET 5060 -> $EXTERNAL_NET any (msg:"ET VOIP Multiple Unauthorized SIP Responses TCP"; \
flow:established,from_server; content:"SIP/2.0 401 Unauthorized"; depth:24; \
threshold: type both, track by_src, count 5, seconds 360; \
reference:url,doc.emergingthreats.net/2003194; classtype:attempted-dos; sid:2003194; rev:6;)
Rule này chỉ ra rằng cảnh báo chỉ được tạo ra nếu trong vòng 6 phút có từ 5 responses SIP TCP 401 trái phép trở lên và nó chỉ cảnh báo 1 lần trong vòng 6 phút này
Từ khóa detect_filter được sử dụng để cảnh báo trên mỗi rule sau khi nó đạt đến giá trị ngưỡng. Nó khác với threshold và type threshold ở chỗ nó tạo ra cảnh báo cho mỗi rule khi nó đạt ngưỡng đã được set, trong khi đó lần thứ 2 sẽ đặt lại giá trị bộ đếm và cảnh báo lại khi ngưỡng lại đạt đến giá trị đã được set
- Ví dụ:
alert http $EXTERNAL_NET any -> $HOME_NET any \
(msg:"ET WEB_SERVER WebResource.axd access without t (time) parameter - possible ASP padding-oracle exploit"; \
flow:established,to_server; content:"GET"; http_method; content:"WebResource.axd"; http_uri; nocase; \
content:!"&t="; http_uri; nocase; content:!"&|3b|t="; http_uri; nocase; \
detection_filter:track by_src,count 15,seconds 2; \
reference:url,netifera.com/research/; reference:url,www.microsoft.com/technet/security/advisory/2416728.mspx; \
classtype:web-application-attack; sid:2011807; rev:5;)
Rule trên chỉ ra rằng sau 15 lần match trong 2s thì sẽ tạo ra cảnh báo