Tải bản đầy đủ
CHƯƠNG II: TÌM HIỂU VỀ PHẦN MỀM SNORT

CHƯƠNG II: TÌM HIỂU VỀ PHẦN MỀM SNORT

Tải bản đầy đủ

28

Hình 2.1: Mô hình kiến trúc của hệ thống Snort

Khi Snort hoạt động nó sẽ thực hiện việc lắng nghe và thu bắt tất cả các
gói tin nào di chuyển qua nó. Các gói tin sau khi bị bắt được đưa vào Module
giải mã gói tin. Tiếp theo gói tin sẽ được đưa vào Module Tiền xử lý, rồi
Module phát hiện. Tại đây, tùy theo việc có phát hiện được xâm nhập hay
không mà gói tin có thể được bỏ qua để lưu thông tiếp hoặc được đưa vào
Module Log và cảnh báo để xử lý. Khi các cảnh báo được xác định Module
kết xuất thông tin sẽ được hiện việc đưa cảnh báo ra theo đúng định dạng
mong muốn. Sau đây ta sẽ đi sâu vào chi tiết hơn về cơ chế hoạt động và chức
năng của từng thành phần.
2.2.1 Module giải mã gói tin
Snort sử dụng thư viện pcap để bắt mọi gói tin trên mạng lưu thông qua
hệ thống. Một gói tin sau khi được giải mã sẽ được đưa tiếp vào Module tiền
xử lý. Hình sau mô tả việc một gói tin Ethernet sẽ được giải mã thế nào:

29

Hình 2.2: Xử lý một gói tin Ethernet

2.2.2 Module tiền xử lý
Module tiền xử lý là một module rất quan trọng đối với bất kỳ một hệ
thống IDS nào để có thể chuẩn bị gói dữ liệu và chuyển cho Module phát hiện
phân tích. Ba nhiệm vụ chính của Module này là:
Kết hợp lại các gói tin: Khi một lượng dữ liệu lớn được gửi đi, thông
tin sẽ không đóng gói toàn bộ vào một gói tin mà phải thực hiện phân mảnh,
chia gói tin ban đầu thành nhiều gói tin rồi mới gửi đi. Khi Snort nhận được
các gói tin này nó phải thực hiện việc ghép nối lại để có được dữ liệu nguyên
dạng ban đầu, từ đó mới thực hiện dược các công việc xử lý tiếp. Như ta đã
biết khi một phiên làm việc của hệ thống diễn ra, sẽ có rất nhiều gói tin được
trao đổi trong phiên đó. Một gói tin riêng lẻ sẽ không có trang thái và nếu
công việc phát hiện xâm nhập chỉ dựa hoàn toàn vào gói tin đó sẽ không đem
lại hiệu quả cao. Module tiền xử lý stream giúp Snort có thể hiểu được các

30

phiên làm việc khác nhau từ đó giúp đạt được hiệu quả cao hơn trong việc
phát hiện xâm nhập.
Giải mã và chuẩn hóa giao thức (decode/normalize): Công việc phát
hiện xâm nhập dựa trên dấu hiệu nhận dang nhiều khi bị thất bại khi kiểm tra
các giao thức có dữ liệu có thể được thể hiện dưới nhiều dạng khác nhau.
Phát hiện các xâm nhập bất thường (nonrule/anormal): Các plugin tiền
xử lý dạng này thường dùng để đối phó với các xâm nhập không thể hoặc rất
khó phát hiện được bằng các luật thông thường hoặc các dấu hiệu bất thường
trong giao thức. Các module tiền xử lý dạng này có thể thực hiện việc phát
hiện xâm nhập theo bất cứ cách nào mà ta nghĩ ra từ đó tăng cường thêm tính
năng cho Snort.
2.2.3 Module phát hiện
Đây là module quan trọng nhất của Snort. Nó chịu trách nhiệm phát
hiện các dấu hiệu xâm nhập. Module phát hiện sử dụng các luật được định
nghĩa trước để so sánh với dữ liệu thu thập được từ đó xác định xem có xâm
nhập xảy ra hay không. Rồi tiếp theo mới có thẻ thực hiện một số công việc
như ghi log, tạo thông báo và kết xuất thông tin.
Một vấn đề rất quan trọng trong module phát hiện là vấn đề thời gian
xử lý các gói tin: Một IDS thường nhận được rất nhiều gói tin và bản thân nó
cũng có rất nhiều các luật xử lý. Có thể maatsnhuwngx khoảng thời gian khác
nhau cho việc xử lý các gói tin khác nhau. Và khi thông lượng mạng quá lớn
có thể xảy ra việc bỏ sót hoặc không phản hồi được đúng lúc. Khả năng xử lý
của module phát hiện dựa trên một số yếu tố như: số lượng các luật, tốc độ
của hệ thống đang chạy Snort, tải trên mạng. Một số thử nghiệm cho biết,
phiên bản hiện tại của Snort khi được tối ưu hóa chạy trên hệ thống có nhiều
bộ vi xử lý và cấu hình máy tính tương đối mạnh thì có thể hoạt động tốt trên
cả các mãng cỡ Giga.
Một module phát hiện cũng có khả năng tách các phần của gói tin ra và
áp dung các luật trên từng phần nào của gói tin đó. Các phần đó có thể là:
• IP header
• Hearder ở tầng giao vận: TCP, UDP
• Header ở tầng ứng dụng: DNS header, HTTP header, FTP deader, …
• Phần tải của gói tin

31

Một vấn đề nữa trong module phát hiện đó là việc xử lý thế nào khi một
gói tin bị phát hiện bởi nhiều luật. Do các dòng luật trong Snort cũng được
đánh thứ tự ưu tiên, nên một khi gói tin bị phát hiện bởi nhiều luật khác nhau,
cảnh báo được lấy ra sẽ là cảnh báo ứng với luật có mức ưu tiên cao nhất.
2.2.4 Module log và cảnh báo
Tùy thuộc vào việc Module phát hiện có nhận dạng được xâm nhập hay
không mà gói tin có thể bị ghi log hoặc đưa ra cảnh báo. Các file log là các
file text dữ liệu trong đó có thể được ghi dưới nhiều định dạng khác nhau,
chẳng hạn tcpdump.
2.2.5 Module kết xuất thông tin
Module này có thể thực hiện các thao tác khác nhau tùy theo việc ta
muốn ghi kết quả xuất ra như thế nào. Tùy theo việc cấu hình hệ thống mà nó
có thể thực hiện các công việc như:
• Ghi log file
• Ghi syslog: Syslog là một chuẩn lưu trữ các file log được sử dụng rất
nhiều trên các hệ thống Unix, Linux
• Ghi cảnh báo vào cơ sở dữ liệu
• Tạo file log dang xml: Việc ghi log file dạng xml rất thuận tiện cho
việc trao đổi và chia sẻ dữ liệu.
• Cấu hình lại Router, firewall
• Gửi các cảnh báo được gói trong gói tin sử dụng giao thức SNMP.
Các gói tin SNMP này sẽ được gửi tới một SNMP server nào đó
giúp cho việc quản lý các cảnh báo và hệ thống IDS một cách tập
trung và thuận tiện hơn.
• Gửi các thông điệp SMB tới các máy tính windows.
Nếu không hài lòng với các cách kết xuất thông tin như trên, ta có thể
viết các module kết xuất thông tin riêng tùy theo mục đích sử dụng.
2.3 Cấu trúc luật của Snort
2.3.1 Khái niệm cơ sở
Snort dùng một ngôn ngữ mô tả các luật sáng sủa và đơn giản, nó cũng
linh động và tương đối mạnh. Hầu hết các luật Snort được viết trên một dòng.

32

Trong các phiên bản trước 1.8 thì điều này là bắt buộc. Trong các bản hiện
nay, các luật có thể được viết trên nhiều dòng bằng việc thêm dấu “/” vào cuối
mỗi dòng. Nếu xét về mặt logic thì các luật Snort được chia làm 2 phần, phần
header và phần các tuỳ chọn. Phần header gồm có các thông tin về các giao
thức, action, các địa chỉ nguồn, đích và mặt nạ mạng địa chỉ cổng nguồn,
đích.
Phần tuỳ chọn chứa các thông điệp cảnh báo và các thông tin cho biết
phần nào của gói tin sẽ được phân tích để xác định action được thực hiện.
Ví dụ minh họa một luật Snort đơn giản:
alert tcp any ->192.168.1.0/24 111{content:”/00 01 86 a5/”: msg:
“mounld avvess”:}
Từ đầu dòng đến dấu ngoặc đơn đầu tiên là phần header và phần nằm
trong cặp nguồn là phần tuỳ chọn. Các từ nằm trong cặp dấu “//” là từ khoá
tuỳ chọn. Lưu ý là phần tuỳ chọn là không được luật nào yêu cầu cụ thể,
chúng chỉ để dùng với mục đích xác định rõ gói tin để tập hợp và cảnh báo
(hoặc huỷ). Tất cả các thành phần cấu thành luật phải đúng để các action được
thực hiện. Khi được đặt cùng nhau, các thành phần có thể được xem như hình
thành nên một câu lệnh AND về mặt logic và các luật trong file thư viện có
thể được xem như tạo nên một câu lệnh OR. [5]
2.3.1.1 Includes
Từ khoá include cho phép các file luật khác được nằm trong file luật
mà dòng lệnh Snort chỉ ra. Nó làm việc giống như # include trong ngôn ngữ
lập trinh C, đọc các content của file được chỉ ra và đặt chúng vào trong file
nơi include xuất hiện.
Định dạng:
include: < include đường dẫn/ tên file>

33

Lưu ý không có dấu: ở cuối mỗi dòng. Các file include sẽ thay các biến
được định nghĩa trước vào trong các biến tham chiếu của nó.
2.3.1.2 Các biến
Các biến có thể được định nghĩa trong Snort. Đây là các biến thay thế
đơn giản được đặt cùng với từ khoá var:
Định dạng:
var:
var: MY_NET [192.168.1.0/24, 10.1.1.0/24]
alert tcp any any -> S MY_NET any (flag: S; msg: “ SYN packet”;)
Có một số các định nghĩa tên biến, có thể định nghĩa biến meta dùng
toán tử S và các toán tử bổ xung, ? và * S var-định nghĩa biến meta, *(S var)- thay bằng giá trị của biến var, *
S (var: - default) – thay bằng giá trị của biến var hoặc giá trị default nếu var
không được định nghĩa. * S var:? message) – thay bằng giá trị của biến var
hoặc in ra thông báo lỗi và thoát.
Xem về các bổ sung của những luật này trong action:
var MY_NET 192.168.1.0/24
2.3.1.3 Config
Rất nhiều cấu hình và các tuỳ chọn của dòng lệnh Snort có thể được
định nghĩa trong file cấu hình
Định dạng:

config [“]

Directives:
order: Thay đổi trật tự thi hành của luật (Snort -0)
alertfile: Thiết lập file cảnh báo. Ví dụ: config alerfile: alerts

34

clasification Xây dựng các phân lớp ưu tiên cho các luật
decode_arp Bật chức năng giải mã arp (Snort –a)
dum_chars _only Bạt các kết xuất ký tự (Snort –C)
dump_payload Kết xuất dữ liệu lớp ứng dụng (Snort – d)
decode_data _lik Giải mã phần header của lớp data link (Snort –e)
bpf_file Quy định các bộ lọc BPF (Snort –F)
Ví dụ: config bpf_file: filename.bpf
set_gid

Chuyến đến GID này (Snort – g)

Ví dụ: config set_gid: Snort_group
daemon

Chạy như một daemon (Snort –D)

reference_net Thiết đặt home network (Snort –h)
interface

Thiết đặt giao tiếp mạng (Snort –i)

alert_with _interface_name Thêm tên giao tiếp mạng vào cảnh báo
(Snort –I)
logdir

Đặt thư mục log (Snort -1). Ví dụ: config logdir:/var/log/Snort

umask

Che mặt nạ khi đang chạy (Snort –m). Ví dụ: config umask:

022
pkt_count Thoát sau N gói tin (Snort-n). Ví dụ: cấu hình pkt_count:13
nolog

Không cho phép log. Lưu ý là vấn có các cảnh báo. (Snort –N)

obfucate

Làm rối các địa chỉ IP (Snort –O)

no_prromisc
quiet

Không cho phép kiểu hỗn hợp (Snort –p)

Không cho phép các thông báo trạng thái và cấm (Snort –q)

35

checksum_mode

Kiểu của các gói tin để tính toán kiểm tra tổng. Các

giá trị nine, noip, noicmp, noudp, all
utc

Dùng TTC thay cho thời gian nội tại đối với các nhãn thời gian

(Snort –U)
verbose Dùng Verbose logging đến stdout (Snort- p)
dump_payload_verbose

Kết xuất các gói tin thô bắt đầu tại lớp liên

kết (Snort-X)
show_year Chỉ rõ năm trong các nhãn thời gian (Snort –U)
stateful

Đặt mode bảo đảm cho strream4 (est).

min_ttl

Đặt ttl nhỏ nhất để bỏ qua tất cả các lưu lượng.

disable_decode_alerts

Tắt các cảnh báo dinh ra trong lúc giải mã

Snort
disable_tcpot_experimental_alerts

Tắt các cảnh báo sinh ra bởi các

tuỳ chọn tcp thực nghiệm.
disable_tcpopt_ttcp_alerts

Tắt các cảnh báo sinh ra bởi các tùy chọn

T/TCP
disable_ipopt_alerts

Không cho phép các cảnh báo sự hợp lệ của độ

dài các tuỳ chọn TCP
disable_ipopt_alerts

Không cho phép các cảnh báo sự hợp lệ của độ

dài các tuỳ chọn IP
detection Cấu hình detection engine (Ví dụ: search –method lowmem)
reference Thêm một hệ thống tham chiếu mới đến Snort

36

2.3.2 Phần header của luật
2.3.2.1 Các Action
Phần header của luật chứa thông tin xác định gói tin của ai, từ đâu và
loại gì cũng như hành động gì nếu tất cả thuộc tính của gói tin phù hợp với
luật, rule action cho Snort biết phải làm gì, có 5 action mặc định trong Snort
là alert, log, pass, active và dynamic
1. alert – tạo ra một cảnh báo dùng phương thức cảnh báo được lựa
chọn sau đó log gói tin.
2. log – log gói tin
3. pass – bỏ qua gói tin
4. activate – cảnh báo và sau đó kích hoạt một luật động khác
5. dynamic – tiếp tục rỗi cho đến khi được kích hoạt bởi một luật
active, sau đó thi hành như một luật log.
Người dùng có thể định nghĩa luật của chính mình và kết hợp với một
hoặc nhiều plugin. Sau đó có thể dùng các rule type như là các action trong
luật Snort.
Ví dụ sau đây sẽ tạo ra một kiểu luật sẽ chỉ log đến tcpdump:
ruletype suspicious
{
type log output
log_tcpdump: suspicious,log
}
Ví dụ sau sẽ tạo ra một kiểu luật chỉ log đến syslog và một cơ sở dữ
liệu MySQL:

37

ruletype rdalert
{
typealert output
alert_syslog: LOG_AUTH LOG_ ALERT
output database: log, mysql, uer=snort dbname=snort host=loca1host
}
2.3.2.2 Các giao thức
Có 4 giao thức mà hiện nay Snort phân tích để tìm ra các hoạt động bất
thường là: tcp, udp, icmp và ip. Trong tương lai có thể có thêm nhiều hơn như
ARP, IGRP, GRE, OSPE, RIP, IPX,...
2.3.2.3 Các địa chỉ IP
Snort không có một cơ chế cung cấp tên host tìm cho các trường địa chỉ
IP trong các luật của file. Các địa chỉ được hình thành trực tiếp bằng một địa
chỉ IP và một CIDR. CIDR chỉ ra mặt nạ mạng được áp dụng vào địa chỉ của
luật này và bất cứ gói tin nào đến được kiểm tra theo luật.
Có một toán tử cũng được áp dụng cho các địa chỉ IP là toán tử phủ
định. Toán tử này cho Snort biết phải thực hiện các địa chỉ IP trừ đi IP được
viết.
Ví dụ về luật phủ định địa chỉ IP
alert tcp! 192.168.1.0/24 any -> 192.168.1.0/24/ 111/
{content: “/00 01 86 a5/”: msg: “ external mountd access”;}
Các địa chỉ IP của luật này cho biết bất kỳ gói tin tệp nào với địa chỉ
nguồn IP không xuất hiện phát từ mạng trong đến một địa chỉ ở mạng trong

38

Cũng có thể quy định danh sách các địa chỉ IP. Một danh sách địa chỉ
IP được quy định bằng cách thêm vào dấu phẩy để phân cách các địa chỉ IP và
các CIDR block trong cặp “[]”.
alert tcp! [192.168.1.0/24.10.1.1.0/24] any-> /
{192.168.1.0/24,10.1.1.0/24} 111 (content: “/00 01 85 a5/”/
2.3.2.4 Các số hiệu cổng Port
Các số hiệu cổng có thể được quy định theo vài cách, gồm có any ports,
các định nghĩa cổng tĩnh, các phạm vi và phủ định. Các cổng tĩnh được chỉ ra
bởi một số hiệu cổng duy nhất. Phạm vi cổng được chỉ ra bằng toán tử phạm
vi ‘:’. Toán tử phạm vi có thể dùng được theo vài cách (với các ý nghĩa khác
nhau), ví dụ:
log tcp any -> 192.168.1.0/24 : 6000
Log các lưu lượng từ cổng bất kỳ đến các cổng có số hiệu nhỏ hơn hoặc
bằng 6000.
log tcp any : 1024 -> 192.168.1.0/24 : 500
Log các lưu lượng tcp từ các cổng ưu tiên nhỏ hơn hoặc bằng 1024 đến
các cổng lớn hơn hoặc bằng 500.
Ví dụ về phạm vi cổng:
Toán tử! được dùng để lấy tất cả các cổng ngoại trừ cổng được viết
trong luật. Ví dụ nếu muốn log tất cả trừ các cổng X Windows, thử dòng sau:
log tcp any -> 192.168.1.0/24! 6000: 6010
2.3.2.5 Các luật Active/Dynamic
Cặp luật Active/Dynamic cho phép Snortcó một khả năng mạnh mẽ.
Dùng một luật để kích hoạt luật khác khi nó là action được thực hiện cho một
số gói tin. Các luật activate hoạt động như luật alert, trừ khi chúng có một