4.1. Giới thiệu về Snort
4.1.3. Tập luật (rulesets) trong Snort
Giống như virus, hầu hết hành động xâm nhập có vài loại signature. Thông tin về những signature này dùng để tạo Snort rules. Những rule này lấy cơ sở từ dấu hiệu kẻ xâm nhập (signature). Snort rules có thể được sử dụng để kiểm tra những phần khác nhau của gói dữ liệu. Snort 1.x có thể phân tích ở những header ở lớp 3 và 4 nhưng không thể phân tích ở giao thức lớp ứng dụng. Snort phiên bản 2.x có hỗ trợ phần header lớp ứng dụng. Những rule được áp dụng trong một kiểu nào đó đến tất cả các gói phụ thuộc vào loại đó.
Một rule có thể sử dụng để phát ra một thông điệp cảnh báo, ghi một thông điệp, hay, trong những thuật ngữ của Snort, pass gói dữ liệu (không làm gì cả). Snort rules được viết theo cú pháp dễ hiểu nhất. Hầu hết những rules được viết trên một dòng đơn. Tuy nhiên bạn cũng có thể mở rộng trên nhiều dòng bằng cách dùng một ký tự “\” vào cuối dòng. Rules thường đặt trong một file cấu hình, chẳng hạn như là snort.conf. Bạn cũng có thể sử dụng nhiều file bằng cách gom chúng trong một file cấu hình chính.Tập luật của Snort đơn giản để ta hiểu và viết, nhưng cũng đủ mạnh để có thể phát hiện tất cả các hành động xâm nhập trên mạng.
Có 3 hành động chính được SNORT thực hiện khi so trùng 1 packet với các mẫu trong rules:
− pass: loại bỏ packet mà SNORT bắt được.
− log: tuỳ theo dạng logging được chọn, packet sẽ được ghi nhận theo.
− alert: sinh ra một alert tùy theo dạng alert được chọn và log toàn bộ packet dùng dạng logging đã chọn.
Cấu trúc của một rule: Tất cả các rule đều có 2 phần logic: rule header và rule options.
Rule Header Rule Option
Hình 3.6. Cấu trúc Rule a) Rule Header
Rule header chứa thông tin về hoạt động mà rule để lấy. Nó cũng chứa tiêu chuẩn cho việc so sánh một luật dựa vào gói dữ liệu. Rule option thường chứa một thông điệp cảnh báo và thông tin về thông điệp sẽ được sử dụng để phát sinh cảnh báo. Rule option cũng chứa tiêu chuẩn cho việc so sánh một luật dựa vào gói dữ liệu. Một rule có thể phát hiện một loại hay nhiều loại hành vi xâm nhập. Rule “thông minh” là rule có thể áp dụng lên nhiều dấu hiệu xâm nhập.
Cấu trúc chung của rule header như sau:
Action Protocol Address Port Direction Address Port
Hình 3.7. Rule Header
Action dùng để xác định loại hành động mà nó lấy về khi tiêu chuẩn gặp được và một rule được so sánh chính xác một gói dữ liệu. Những hoạt động điển hình là sinh ra một cảnh báo hoặc ghi thông điệp hoặc diện chứng cho rule khác.
Protocol dùng để áp dụng rule lên gói chỉ với một giao thức riêng. Đây là tiêu chuẩn đầu tiên giám sát trong rule. Bạn cũng có thể sử dụng những thành phần khác để ngăn chặn những địa chỉ từ một mạng đầy đủ. Chú ý rằng có 2 trường địa chỉ trong rule. Địa chỉ nguồn và đích được xác định dựa trên trên trường direction. Cho một ví dụ, nếu trường direction là
“→”, địa chỉ phía bên trái là nguồn, địa chỉ bên phải là đích.
Port: Trong giao thức TCP/UDP, port xác định cổng nguồn và đích của gói khi rule áp dụng lên đó. Trong trường hợp những giao thức lớp network như IP và ICMP, port numbers không có ý nghĩa.
Cho ví dụ, rule sau đây sẽ sinh ra cảnh báo khi nó phát hiện gói ping ICMP (ICMP ECHO REQUEST) với TTL bằng 100:
alert icmp any any -> any any (msg: "Co thang dang ping"; sid: 313131;)
Phần nằm trước dấu ngoặc đơn gọi là rule header. Phần trong dấu ngoặc đơn là rule option.
Header chứa những phần sau:
Một rule action (hành động của luật). Trong rule trên, action là “alert”, có nghĩa là một cảnh báo sẽ sinh ra khi điều kiện bắt gặp. Nhớ rằng những gói được ghi bằng mặc định khi cảnh báo phát ra. Phụ thuộc vào trường action, rule option có thể chứa tiêu chuẩn cho rule.
Protocol (giao thức). Ở đây là ICMP, nghĩa là rule chỉ áp dụng lên tất cả gói ICMP.
Trong Snort detection engine, nếu giao thức của gói không phải ICMP, rule sẽ không làm gì trên gói đó để tiết kiệm thời gian xử lý của CPU. Thành phần protocol là rất quan trọng khi bạn muốn áp dụng Snort rule chỉ trên những gói của một loại riêng biệt.
Địa chỉ nguồn và cổng nguồn. Trong ví dụ này cả hai đều là “any”, có nghĩa là rule sẽ áp dụng lên tất cả các gói đến từ nhiều nguồn. Dĩ nhiên port number sẽ không áp dụng lên gói ICMP. Port number chỉ thích hợp trong trường hợp protocol là TCP hay UDP.
Direction. Trong trường hợp này, nó là ký hiệu → từ trái sang phải. Nói lên địa chỉ và port number bên trái dấu → là nguồn còn bên phải là đích. Điều đó cũng có nghĩa rằng rule sẽ áp dụng lên gói đi từ nguồn đến đích. Bạn cũng có thể dùng dấu ← để định nghĩa địa chỉ nguồn/đích cho gói. Ký tự <> cũng có thể sử dụng để áp dụng rule lên gói đi từ 2 bên.
Địa chỉ đích là cổng đích. Trong ví dụ này cả hai đều là “any”, có nghĩa là rule sẽ áp dụng lên tất cả các gói không quan tâm đến địa chỉ đích. Direction trong rule không đóng vai trò gí cả bởi vì rule được áp dụng lên tất cả các gói ICMP di chuyển cả hai bên, do đã sử dụng từ khóa “any” trong cả hai thành phần địa chỉ nguồn và đích.
b) Rule Option
Rule option theo sau rule header và được đặt trong cặp dấu ngoặc đơn. Có thể một lựa chọn hay nhiều lựa chọn truyền vào cùng dấu . Nếu bạn sử dụng nhiều lựa chọn, dạng lựa chọn này là AND. Hành động trong rule header chỉ được gọi khi tất cả những tiêu chuẩn trong lựa chọn là đúng. Bạn đã sử dụng option như msg và ttl trong ví dụ trước rồi đó. Tất cả những lựa chọn được định nghĩa bởi từ khóa. Những Rule option chứa các đối số. Thường thì những lựa chọn có 2 phần: một từ khóa và một đối số. Những đối số truyền vào từ lựa chọn từ khóa bằng một dấu “:”.
Ví dụ:
msg: "Detected confidential";
Lựa chọn msg là từ khóa và “Detected confidential” là đối số cho từ khóa này. Sau đây là những từ khóa thông dụng . Nó hoạt động trên những giao thức riêng, cho nên có ý nghĩa khác nhau đi theo giao thức.
Các từ khóa được sử dụng trong phần option của luật Snort:
ack :
ack: < number>;
TCP header chứa một trường Acknowledgement Number dài 32 bit. Trường này chỉ ra rằng sequence number kế tiếp của người gửi được mong đợi. Trường này chỉ có ý nghĩa khi cờ flag trong trường TCP được thiết lập.
classtype
config classification: name,description,priority
name : tên được sử dụng cho việc phân loại. Tên được sử dụng với từ khóa classtype trong luật Snort.
Description : mô tả ngắn về kiểu phân loại
Priority : thứ tự ưu tiên mặc định cho sự phân loại, có thể được chỉnh sửa bằng từ khóa priority. Priority càng thấp thì độ ưu tiên càng cao.
Các luật có thể được phân loại và xếp thứ tự ưu tiên vào trong một nhóm. Để có thể hiểu hơn về từ khóa classtype, hãy xem file classification.config trong snort.conf. Mỗi dòng trong đó sẽ có cú pháp như sau:
content
content: <straight text>; content: <hex data>;
Một đặc tính quan trọng của Snort là khả năng tìm thấy một mẫu dữ liệu trong một gói tin. Mẫu đó có thể tồn tại dưới dạng một chuỗi ASCII hoặc là các kí tự thập lục phân. Giống như virut, những kẻ xâm nhập cũng có các dấu hiệu và từ khóa content để có thể tìm ra các dấu hiệu trong các gói tin. Vì Snort phiên bản 1.x không hỗ trợ các giao thức ở lớp ứng dụng nên từ khóa này, cùng với từ khóa offset, cũng có thể được sử dụng để xem xét header của lớp ứng dụng.
offset
offset: < value>;
Từ khóa offset được sử dụng kết hợp với từ khóa content. Sử dụng từ khóa này, bạn có thể bắt đầu tìm kiếm từ một vị trí xác định so với vị trí bắt đầu của gói tin. Sử dụng một con số như là đối số của từ khóa này.
depth
depth: < value>;
Từ khóa depth cũng được sử dụng kết hợp với từ khóa content để xác định giới hạn trên của việc so sánh mẫu. Sử dụng từ khóa này, bạn có thể xác định một vị trí so với vị trí bắt đầu. Dữ liệu sau vị trí này sẽ không được tìm kiếm để so mẫu. Nếu bạn dùng cả hai từ khóa offset và depth thì bạn có thể xác định một khoảng dữ liệu thực hiện việc so sánh mẫu.
nocase nocase;
Từ khóa nocase được sử dụng kết hợp với từ khóa content. Nó không có đối số. Mục đích của nó là thực hiện việc tìm kiếm trong trường hợp vô tình.
content-list
content_list: < filename>;
Từ khóa content-list được sử dụng với tên của một file như là đối số của từ khóa này.
File này sẽ chứa một danh sách các chuỗi sẽ được tìm kiếm trong một gói tin. Mỗi chuỗi được đặt trên các dòng khác nhau của file.
dsize d
size: [<|>] < number>;
Từ khóa dsize được sử dụng để tìm chiều dài một phần dữ liệu của gói tin. Nhiều cách tấn công sử dụng lổ hổng tràn bộ đệm bằng cách gửi các gói tin có kích thước lớn. Sử dụng từ khóa này, bạn có thể tìm thấy các gói tin có chiều dài dữ liệu lớn hoặc nhỏ hơn một số xác định.
flags
flags: < flags>;
Từ khóa flags được sử dụng để tìm ra bit flag nào được thiết lập trong header TCP của gói tin. Mỗi flag có thể được sử dụng như một đối số của từ khóa flags trong luật Snort.
Những bit flag này được sử dụng bởi nhiều các công cụ bảo mật với nhiều mục đích trong đó có việc quét các cổng như nmap (http://www.nmap.org).
fragbits
fragbits: < flag_settings>;
Sử dụng từ khóa này, bạn có thể tìm ra những bit RB (Reserved Bit), DF(Don't Fragment Bit), MF(More Fragments Bit) trong header IP có được bật lên hay không.
icmp_id
icmp_id: < number>;
Option icmp_id được sử dụng để phát hiện một ID cụ thể được sử dụng với một gói tin ICMP.
icmp_seq
icmp_seq: < hex_value>;
Option icmp_seq giống như từ khóa icmp_id.
itype
itype: < number>;
Header ICMP nằm sau header IP và chứa trường type. Từ khóa itype được sử dụng để phát hiện các cách tấn công sử dụng trường type trong header ICMP của gói tin.
icode
icode: < number>;
Trong gói tin ICMP, header ICMP đi sau header IP. Nó chứa một trường code. Từ khóa icode được sử dụng để phát hiện trường code trong header gói tin ICMP.
id
id: < number>;
Từ khóa id được sử dụng để đối chiếu trường fragment ID của header gói tin IP. Mục đích của nó là phát hiện các cách tấn công sử dụng một số ID cố định.
ipopts
ipopts: < ip_option>;
Header IPv4cơ bản dài 20 byte. Bạn có thể thêm các tùy chọn vào header này ở cuối.
Chiều dài của phần tùy chọn này có thể lên đến 40 byte. Các tùy chọn được sử dụng cho các mục đích khác nhau, bao gồm:
− Record Route (rr)
− Time Stamps (ts)
− Loose Source Routing (lsrr)
− Strict Source Routing (ssrr) ip_proto
ip_proto: [!] < name or number>;
Từ khóa ip_proto sử dụng plug-in IP Proto để xác định số giao thức trong header IP.
Từ khóa này cần một con số giao thức là đối số. Bạn cũng có thể sử dụng tên giao thức nếu nó có thể phân giải bằng file /etc/protocols.
logto
logto: < file_name>;
Từ khóa logto được sử dụng để ghi log các gói tin vào một file đặc biệt.
msg
msg: < sample message>;
Từ khóa msg được sử dụng để thêm một chuỗi kí tự vào việc ghi log và cảnh báo. Bạn có thể thêm một thông điệp trong hai dấu ngoặc kép sau từ khóa này.
priority
priority: < priority integer>;
Từ khóa priority gán độ ưu tiên cho một luật.
react
react: <react_basic_modifier[, react_additional_modifier...]>;
Từ khóa react được sử dụng với một luật để kết thúc một phiên, khóa một vài vị trí hoặc dịch vụ. Không phải tất cả các option với từ khóa này hoạt động. Để sử dụng từ khóa react, bạn nên biên dịch Snort với lệnh --enable-flexresp trong script cấu hình.
reference
reference : <id system>,<id>;
Từ khóa reference có thể thêm một sự tham khảo đến thông tin tồn tại trên các hệ thống khác trên mạng. Nó không đóng một vai trò nào trong cơ chế phát hiện. Có nhiều hệ thống để tham khảo như CVE và Bugtraq. Những hệ thống này giữ các thông tin thêm về các kiểu tấn công đã được biết. Bằng việc sử dụng từ khóa này, bạn có thể kết nối đến các thông tin thêm trong thông điệp cảnh báo.
resp
Từ khóa resp là một từ khóa cực kì quan trọng. Nó có thể được sử dụng để đánh bại các hành vi của hacker bằng cách gửi các gói tin trả lời cho một host mà tạo ra một gói tin thỏa luật. Từ khóa này cũng được biết như là Flexible Response (FlexResp) và được dựa trên FlexResp plug-in. Plug-in nên được biên dịch vào Snort, sử dụng lệnh (--with- flexresp)trong script cấu hình.
rev
rev: < revision integer>;
Từ khóa rev được thêm vào option của luật Snort để chỉ ra số revision của luật. Nếu bạn cập nhật luật, bạn có thể sử dụng từ khóa này để phân biệt giữa các phiên bản. Các module output cũng có thể sử dụng con số này để nhận dạng số revision.
rpc
rpc: < Số ứng dụng, Số thủ tục, Số phiên bản>
Từ khóa rpc được sử dụng để phát hiện các yêu cầu RPC cơ bản. Từ khóa này chấp nhận 3 số như là đối số :
sameip sameip;
Từ khóa sameip được sử dụng để kiểm tra địa chỉ nguồn và đích có giống nhau hay không. Nó không có đối số.
seq
seq: <hex_value>;
Từ khóa seq trong luật Snort có thể được sử dụng để kiểm tra số thứ tự sequence của gói tin TCP.
flow
Từ khóa flow được sử dụng để áp dụng một luật lên các gói tin di chuyển theo một hướng cụ thể. Bạn có thể sử dụng các option với từ khóa để xác định hướng. Các option sau đây có thể được sử dụng với từ khóa này :
− to_client
− to_server
− from_client
− from_server session
session: [printable|all];
Từ khóa có thể được sử dụng để gạt bỏ tất cả dữ liệu từ một phiên TCP.
sid
sid: < snort rules id>;
Sử dụng SID, các công cụ như ACID có thể biểu diễn luật thật sự tạo ra một cảnh báo cụ thể.
tag
tag: <type>, <count>, <metric>[, direction]
Từ khóa tag là một từ khóa rất quan trọng khác có thể được sử dụng để ghi log các dữ liệu thêm vào từ ( hoặc đến) một host xâm nhập khi một luật được kích hoạt. Dữ liệu thêm vào có thể được phân tích sau này một cách chi tiết hơn.
tos
tos: < number>;
Từ khóa tos được sử dụng để phát hiện một giá trị cụ thể trong trường TOS (Type of Service) của header IP.
ttl
ttl: < number>;
Từ khóa ttl được sử dụng để phát hiện giá trị Time to Live trong header IP của gói tin.
Từ khóa này có thể được sử dụng với tất cả các kiểu giao thức được xây dựng trên IP như ICMP, UCP và TCP. Sử dụng từ khóa ttl, bạn có thể tìm ra nếu có một người cố gắng traceroute mạng của bạn. Vấn đề duy nhất là từ khóa cần một giá trị TTL chính xác.
uricontent
uricontent: [!] "content string";
Từ khóa uricontent giống với từ khóa content ngoại trừ việc nó được sử dụng để tìm một chuỗi chỉ trong phần URI của gói tin.