báo cáo thực tập tốt nghiệp
TRANSCRIPT
ĐẠI HỌC BÁCH KHOA HÀ NỘI
Chương trình kỹ sư Chất lượng cao
BÁO CÁO THỰC TẬP TỐT NGHIỆP
SNORT IDS
Giảng viên: PGS TS. Nguyễn Linh Giang
Sinh viên thực hiện: Ngô Doãn Dương
SHSV: 20090596
Lớp: HTTT và truyền thông - KSCLCK54
Hà Nội, 04/2014
2
Mục lục
Lời nói đầu ....................................................... 3
Phần 1. Tổng quan về IDS Snort ........................ 4 Phát hiện xâm nhập là gì?.............................................................................................. 4
Các thành phần và cơ chế hoạt động của Snort .............................................................. 8
Tập luật trong Snort .................................................................................................... 13
Cấu hình Snort ............................................................................................................ 27
Phần 2. Snort và các sản phẩm kết hợp ............ 34
Phần 3. Thử nghiệm khả năng phản ứng của Snort
IDS ................................................................... 43
Phần 4. Kết luận ............................................... 47
3
Lời nói đầu
Bảo mật là một vấn đề lớn đối với tất cả các mạng trong môi trường
doanh nghiệp ngày nay. Hacker và intruder (kẻ xâm nhập) đã nhiều lần thành công
xâm nhập vào mạng công ty và đem ra ngoài rất nhiều thông tin giá tri.. Nhiều
phương pháp đã phát triển để đảm bảo cho hạ tầng mạng và giao tiếp trên
Internet, giữa chúng là sử dụng firewall (tường lửa), encryption (mã hóa), và
VPN (mạng riêng ảo). Phát hiện xâm nhập là một công nghệ mới. Các phương
pháp phát hiện xâm nhập bắt đầu xuất hiện những năm gần đây. Sử dụng
phương thức phát hiện xâm nhập, có thể thu thập và sử dụng thông tin từ
những loại tấn công đã biết và tìm ra một ai đó cố gắng tấn công vào mạng hay
máy cá nhân. Thông tin thu thập theo cách này có thể sử dụng làm cho mạng
chúng ta bảo mật hơn, nó hoàn toàn hợp pháp. Sản phẩm thương mại và mã
nguồn mở đều sẵn có cho mục đích này. Nhiều công cụ đánh giá tình trạng nguy
hiểm cũng sẵn có trên thị trường , nó dùng để đánh giá nhiều loại hình bảo mật
khác nhau và vai trò của nó trong mạng.
Snort là một hệ thống phát hiện xâm nhập mạng (NIDS) mã nguồn mở, là
miễn phí. NIDS là một dạng IDS, được sử dụng để quét luồng dữ liệu trên mạng.
Cũng có những IDS cơ bản trên host (host-based), nó được cài đặt trên host
riêng và phát hiện những cuộc tấn công chỉ trên host đó thôi. Mặc dù tất cả
phương pháp phát hiện xâm nhập vẫn còn mới, nhưng Snort giữ một vị trí là hệ
thống chất lượng thuộc loại top (hàng đầu) ngày nay.
Snort có thể làm việc chung với những sản phẩm khác. Những sản phẩm đó
bao gồm cơ sở dữ liệu MySQL (http://mysql.org) và điều khiển phân tích cho cơ sở
dữ liệu xâm nhập (ACID) (http://www.cert.org/kb/acid). Snort có khả năng ghi dữ
liệu thu thập được (như là những cảnh báo – alerts – và những thông điệp dạng
log khác) vào một cơ sở dữ liệu. MySQL được sử dụng làm cơ sở dữ liệu thông
dụng, nó là nơi mà dữ liệu sẽ lưu giữ. Sử dụng Apache web server
(http://apache.org) và ACID, có thể phân tích dữ liệu này. Sự kết hợp của
Snort, Apache, MySQL, và ACID giúp ta ghi dữ liệu phát hiện xâm nhập vào trong
cơ sở dữ liệu và xem, phân tích nó về sau, bằng một giao diện web cơ bản.
4
Phần 1. Tổng quan về IDS Snort
1. Phát hiện xâm nhập là gì?
Phát hiện xâm nhập là một tập những công nghệ và phương thức
dùng để phát hiện hành động khả nghi trên cả host và mạng. Hệ thống phát
hiện xâm nhập (IDS)có 2 loại cơ bản sau: IDS signature-based (IDS dựa trên
dấu hiệu) và IDS anomaly-based (IDS dựa trên sự bất thường). Intruder có
những dấu hiệu, giống như virus máy tính - có thể được phát hiện bằng cách
sử dụng phẩn mềm quét virus. có thể cố gắng tìm những gói dữ liệu có chứa
những dấu hiệu liên quan đến xâm nhập đã biết hay những điều bất thường
liên quan đến giao thức. Dựa trên những tập signature và rules, hệ thống
phát hiện có thể tìm và ghi những hành động xâm nhập và phát ra cảnh báo.
Sự phát hiện xâm nhập dựa trên sự bất thường thường phụ thuộc vào tính
bất thường của tiêu đề (header) giao thức trong gói dữ liệu. Trong nhiều
trường hợp, phương pháp này có thể đem lại kết quả tốt hơn đối với IDS
signature-based. Thông thường một IDS capture dữ liệu từ mạng và áp dụng
những rule của nó vào dữ liệu này hoặc phát hiện những anomaly trong nó.
Snort là một IDS rule-base (IDS dựa trên tập luật) chính, tuy nhiên những
input plug-in giúp phát hiện những anomaly trong tiêu đề giao thức.
Snort sử dụng những rule lưu trong những text file, nó có thể xem
được bằng một trình soạn thảo văn bản. Những rule được nhóm theo từng
loại. Những rule đi cùng với mỗi loại được lưu trữ trong những file riêng.
Những file này sau đó được tập hợp trong một file cấu hình chính, gọi là
snort.conf. Snort đọc những rule này mỗi lần chạy và xây dựng các cấu trúc dữ
liệu bên trong nó hoặc áp dụng những rule đó để capture dữ liệu. Việc tìm
những signature và sử dụng chúng trong rule là một công việc đòi hỏi phải
tinh tế, khi dùng nhiều rule, sẽ có nhiều công việc xử lý hơn được yêu cầu để
capture dữ liệu trong thời gian thực. Snort cho phép định nghĩa lại rule cho
việc phát hiện xâm nhập và rất “linh hoạt” cho ta thêm vào rule riêng của
mình.
5
Một số định nghĩa cơ bản:
1.1 IDS:
Intrusion Detection System (hệ thống phát hiện xâm nhập) hay IDS là phần
mềm, phần cứng hoặc kết hợp cả ha i, dùng để phát hiện hành động của
kẻ xâm nhập. Snort là một IDS mã nguồn mở sẵn có trên mạng. Một IDS
có nhiều khả năng khác nhau tùy thuộc vào độ phức tạp của các thành
phần trong nó. Nhiều công ty đã ứng dụng IDS kết hợp phần cứng và
phần mềm. Nói cách khác, một IDS có thể sử dụng những công nghệ dựa
trên các dấu dấu hiệu hoặcsự bất thường hoặc cả hai.
1.2 Network IDS hay NIDS:
NIDS là một IDS capture dữ liệu trong quá trình truyền dữ liệu trên
mạng (cáp, wireless) và gắn chúng vào một cơ sở dữ liệu của những
signature. Phụ thuộc vào nơi mà một gói bi phát hiện với một tín hiệu
xâm nhập, lúc đó một cảnh báo sẽ được phát sinh hoặc gói đó sẽ được
ghi vào trong một file hay cơ sở dữ liệu. Một chuyên gia sử dụng Snort như
là một NIDS.
1.3 Host IDS hay HIDS:
Những hệ thống HIDS được cài đặt như là những agent (tác nhân)
trên một host. Những hệ thống này có thể nhìn vào trong những log file
ứng dụng để phát hiện ra hành vi kẻ xâm nhập. Một vài loại là reactive,
có nghĩa nó chúng chỉ báo cho ta biết khi mà mọi việc đã xảy ra. Cũng có
một số là proactive (đoán trước), chúng quét lưu lượng mạng tại những
HIDS đã được cài đặt và phát cảnh báo ngay cho ta.
1.4 Signatures (dấu hiệu):
Khi chúng ta nhìn vào trong gói dữ liệu, ta rút ra được một mẫu (lấy
mẫu dữ liệu), mẫu đó gọi là signature. Một signature dùng để phát hiện
một hoặc nhiều loại tấn công. Cho ví dụ, chuỗi “script/iisad-min” trong gói
dữ liệu đi vào web server có thể nói cho ta biết đó là một hành vi xâm
nhập.
Signatures có thể trình bày nhiều thành phần khác nhau trong một gói
dữ liệu phụ thuộc vào cách tấn công tự nhiên. Cho ví dụ, ban có thể tìm
6
signature trong IP header, transport layer header (TCP, UDP) và/hoặc
application layer header hay payload.
Thường thì IDS phụ thuộc vào signature để tìm những hành vi xâm nhập.
Một vài sản phẩm IDS cần phải cập nhật từ nhà cung cấp những
signature mới khi có một loại tấn công nào đó ra đời.Trong IDS khác,
như Snort, có thể cập nhật signature của riêng mình.
1.5 Alerts (cảnh báo):
Alerts là những loại thông báo người dùng của một hành vi xâm nhập.
Khi một IDS phát hiện ra một intruder, nó sẽ báo cho người quản trị bảo
mật bằng cách dùng những cảnh báo này. Alerts có thể là một dạng cửa sổ
pop-up, dạng console, gửi một e-mail, v.v.. Alerts cũng có thể được lưu
trong những log file hay cơ sở dữ liệu, nơi mà chúng có thể xem lại về
sau.
Snort có thể phát ra Alerts trong nhiều hình thức và được điều khiển bởi
những output plug-ins. Snort cũng có thể gửi cùng một alert đến nhiều
điểm đích. Cho ví dụ, nó có thể ghi Alerts vào trong cơ sở dữ liệu và
phát ra SNMP trap cùng một lúc. Một vài plug-ins cũng có thể thay đổi
cấu hình firewall nhằm ngăn những host xâm phạm vào firewall hay
router.
1.6 Logs:
Thông điệp log thường được lưu trong một file. Mặc định, Snort lưu
những thông điệp này dưới thư mục /var/log/snort. Tuy hiên, vị trí của nó
có thể thay đổi bằng cách sử dụng lệnh khi khởi động Snort. Thông điệp
log có thể lưu ở dạng text (văn bản) hay binary (nhị phân). Những file
binary có thể xem sau này bằng Snort hay chương trình tcpdump. Một
công cụ mới gọi là Barnyard cũng có thể phân tích những log file nhị phân.
Ghi ở dạng nhị phân thì nhanh hơn bởi vì nó lưu theo mức cao. Ghi theo
dạng nhị phân rất hữu dụng trong trường hợp khi thực thi Snort đòi hỏi
tốc độ cao.
1.7 False Alarms (cảnh báo lỗi):
False alarm là loại cảnh báo phát ra biểu thi một dấu hiệu mà không có
7
hành vi xâm nhập nào. Cho ví dụ, những host bên trong mạng do cấu
hình sai có thể những thông điệp broadcast khớp với một rule nào đó,
kết quả là nó phát ra một cảnh báo sai. Ở một vài router như Linksys,
nó sinh ra nhiều cảnh báo “lost of UpnP realated”. Để tránh những lỗi
trên, phải thay đổi điều chỉnh những rule mặc định khác. Trong vài
trường hợp, cần phải disable một vài rule để tránh False alarm.
8
2. Các thành phần và cơ chế hoạt động của Snort:
Snort được chia thành nhiều phần. Những phần này làm việc cùng nhau
nhằm phát hiện những loại tấn công khác nhau và sinh ra trong một định
dạng yêu cầu từ hệ thống phái hiện. Một Snort IDS cơ bản gồm các thành
phần chính sau:
a. Packet Decoder : bộ giải mã gói
b. Preprocessors : Bộ tiền xử lý.
c. Detection Engine : bộ máy phát hiện
d. Logging and Alerting System : hệ thống ghi và cảnh báo.
e. Output Modules : các mô đun xuất.
Dưới đây là mô hình của các thành phần Snort:
Hình 3.1: Cơ chế hoạt động của IDS
Sau đây sẽ giới thiệu ngắn gọn những thành phần này. Thông qua đó, có
thể tạo một vài rule.
9
2.1 Packet Decoder:
Packet decoder lấy những gói từ những loại khác nhau của giao diện mạng
và chuẩn bị đưa chúng vào preprocessed hoặc gửi nó qua detection
engine. Giao diện có thể là Ethernet, SLIP, PPP, v.v..
2.2 Preprocessors:
Preprocessors là những thành phần hay những plug-in được sử dụng
cùng với Snort để sắp xếp và thay đổi những gói dữ liệu trước khi detection
engine thực hiện công việc tìm kiếm nếu gói dữ liệu đó là nguy hiểm. Một
vài preprocessor còn có thể thực hiện tìm ra những dấu hiệu bất thường
trong tiêu đề gói và sinh ra cảnh báo. Preprocessor rất là quan trọng đối với
IDS nhằm chuẩn bị những gói dữ liệu để phân tích cho việc thiết lập rule
trong detection engine. Hacker sử dụng những công nghệ khác nhau nhằm
đánh lừa một IDS bằng nhiều cách khác nhau. Cho ví dụ, có thể tạo một
rule để tìm một dấu hiệu “script/iiadmin” trong gói HTTP. Nếu so khớp
chính xác chuỗi này, có thể dễ dàng bắt lấy. Cho ví du:
“script/./iisadmin”
“script/examples/../iisadmin”
“script/iisadmin”
Để làm phức tạp trạng thái, hacker cũng có thể chèn vào Uniform
Resource Identifier (URI) ký tự nhị phân hay Unicode mà vẫn hợp quy tắc
của một web server. Chú ý rằng web server thường hiểu tất cả những chuỗi
và có thể xử lý chúng chính xác như mong muốn trong chuỗi
“script/iisadmin”. Tuy nhiên IDS vẫn theo dõi so khớp chính xác, nó không
thể phát hiện ra sự tấn công này. Một preprocessor có thể sắp xếp lại chuỗi đó
để nó có thể phát hiện được.
Preprocessor cũng có thể sử dụng cho những gói phân mảnh. Khi
một gói dữ liệu có kích thước lớn truyền vào một host, gói đó thường bị
phân mảnh. Cho ví dụ, kích thước mặc định lớn nhất cho gói dữ liệu trong
mạng Ethernet thường là 1500 byte. Giá trị này được điều khiển bởi giá trị
MTU (Maximum Transfer Unit) cho giao diện mạng. Điều này có nghĩa là nếu
gửi dữ liệu lớn hơn 1500 byte, nó sẽ cắt thành nhiều gói, mỗi gói phân mảnh
10
đó có kích thước nhỏ hơn hoặc bằng 1500 byte. Hệ thống nhận sẽ tái hợp
để thành gói dữ liệu nguyên thủy. Trên IDS, trước khi áp dụng những
rule hay tìm một signature, phải tái hợp gói. Cho ví dụ, phân nửa dấu
hiệu có thể cho thấy trong một đoạn này và nửa kia trong đoạn khác. Để
phát hiện chính xác dấu hiệu, phải kết hợp tất cả phân đoạn của mảnh.
Hacker sử dụng sự phân mảnh để đánh bại những hệ thống IDS. Preprocessor
thường được dùng để bảo vệ những loại tấn công này. Preprocessor trong
Snort có thể phân mảnh gói, giải mã HTTP URI, tái hợp luồng TCP, v.v.. Những
chức năng này rất là quan trọng trong thành phần IDS.
2.4 Detection Engine:
Detection engine là thành phần quan trọng nhất trong Snort. Nó
chịu trách nhiệm phát hiện nếu có hành vi xâm nhập trong một gói.
Detection engine tận dụng những rule Snort để làm việc này. Những rule
được đọc trong cấu trúc dữ liệu bên trong hay buộc chặt chúng vào nơi mà
chúng sẽ so khớp với tất cả các gói. Nếu một gói nào đó khớp với rule,
hành động thích hợp sẽ sinh ra, chẳng hạn gói đó sẽ bị hủy. Những hành
động đó có thể là ghi gói hay sinh cảnh báo.
Detection engine là một phần tiêu chuẩn thời gian (time-critical) của
Snort. Phụ thuộc vào sức khỏe của hệ thống và có bao nhiêu rule được định
nghĩa, nó có thể tiêu tốn bao nhiêu thời gian cho công việc đáp ứng các gói
này. Nếu lưu lượng trên hệ thống mạng của là khá cao khi Snort làm việc
trong chế độ NIDS, có thể hủy những gói. Sự vận hành của Detection
engine phụ thuộc vào các yêu tố sau:
Số rule trên đó.
Sức khỏe của hệ thống trên đó có Snort đang chạy.
Thông lượng bên trong đó.
Sức vận hành trên mạng
Khi thiết kế một NIDS, phải giữ tất cả hồ sơ kỹ thuật trong đó.
Nên nhớ rằng hệ thống phát hiện có thể khảo sát tỉ mỉ và áp dụng rule
trên nhiều phần của gói dữ liệu. Những phần này có thể là:
IP header của gói.
11
Header lớp transport. Header gồm: TCP, UDP, và những header lớp
transport khác. Nó cũng có thể làm việc trên ICMP header.
Header lớp application. Nó gồm có: DNS header, FTP header,
SNMP header, SMTP header. có thể phải sử dụng nhiều phương
pháp trực tiếp tại header lớp application, chẳng hạn như tìm kiếm
offset của dữ liệu.
Payload của dữ liệu. Điều này giúp tạo ra một rule dùng cho
detection engine để tìm một chuỗi bên trong dữ liệu.
Detection engine làm việc khác nhau trong mỗi phiên bản Snort khác
nhau. Trong tất cả phiên bản Snort 1.x, detection engine ngừng xử lý trên
gói đó khi một rule được so khớp trên gói đó. Phụ thuộc vào rule, detection
engine thực hiện những hành động thích hợp như ghi log file hay sinh một
cảnh báo. Điều này có nghĩa là nếu một gói khớp với tiêu chuần được định
nghĩa trong nhiều rule, chỉ rule đầu tiên được áp dụng vào gói đó mà không
tìm kiếm sự so khớp khác. Đây là một vấn đề. Một rule thiếu trọn vẹn sẽ
sinh ra một cảnh báo không trọn vẹn, thâm chí nếu một rule khá đầy đủ
(tương ứng với một cảnh báo tốt) có thể nằm sau rule trước nó. Vấn đề này
đã được sửa trong Snort phiên bản 2, tất cả các rule đều được so khớp vào
một gói trước khi sinh một cảnh báo. Sau khi so khớp tất cả các rule, rule nào
trọn vẹn nhất sẽ được chọn để sinh cảnh báo.
Detection engine trong Snort 2.0 đã được làm lại một cách hoàn
chỉnh để nó so sánh tốt hơn, phát hiện sớm hơn so với các phiên bản trước.
2.5 Logging và Alerting System:
Phụ thuộc vào detection engine tìm trong gói, gói có thể được
dùng để ghi hành động hay sinh cảnh báo. Việc ghi lưu trong những text file
đơn giản, loại file tcpdump hay những hình thức ghi khác. Mặc định tất cả
những log file được lưu trong /var/log/snort. có thể sử dụng dòng lệnh
“–l” để thay đổi vị trí sinh log file hay cảnh báo. Có nhiều lựa chọn dòng lệnh
sẽ được thảo luận trong phần sau và chi tiết thông tin về cách ghi log file
hay cảnh báo.
2.6 Output Modules:
12
Output modules hay plug-in thực hiện những hoạt động khác nhau
phụ thuộc muốn lưu kết quả sinh ra bởi logging và cảnh báo thế nào. Về cơ
bản, những modules này điều khiển loại kết quả sinh ra bởi hệ thống
logging và cảnh báo. Phụ thuộc vào sự cấu hình, Output modules có thể làm
những việc sau:
Đơn giản chỉ ghi vào file /var/log/snort/alerts hay những file khác
Gửi SNMP traps
Gửi thông điệp đến syslog.
Ghi vào cơ sở dữ liệu như MySQL hay Oracle.
Sinh ra dẫn xuất eXtensible Markup Language (XML)
Bổ sung cấu hình trên router và firewall.
Gửi thông điệp Server Message Block (SMP) đến hệ thống Microsoft
Window. Những công cụ khác cũng có thể gửi cảnh báo trong những
định dạng khác như e-mail hay qua giao diện web. Bảng sau đây cho
ta thấy những thành phần khác nhau của một IDS:
13
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. Trong chương 1,
đã phân tích một số kỹ thuật tấn công DoS/DDoS để tìm ra những cơ chế hoạt
động và thông tin về những công cụ và công nghệ của họ. Hơn nữa, có những
lổi cơ sở dữ liệu khiến cho những intruder muốn khai thác. Có nhiều cuộc tấn
công được biết đến cũng sử dụng signature để tìm một ai đó cố gắng khai thác
chúng. Những signature này có thể hiển thị trong phần header (tiêu đề) của
gói dữ liệu hoặc trong payload. Hệ thống phát hiện Snort dựa trên 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 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. cũng có thể sử dụng nhiều file bằng
cách gôm chúng trong một file cấu hình chính.
Trong chương này cung cấp thông tin về những loại rule khác nhau cũng
như cấu trúc cơ bản của rule. sẽ tìm thấy nhiều ví dụ của những rule chung
cho hành vi phát hiện xâm nhập trong phần sau.
3.1. 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.
Hình 3.2: Cấu trúc Rule
14
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 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. 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.
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: "Ping with TTL=100"; \
ttl: 100;)
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”,
15
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 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. 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.
16
3.2. 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 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.
đã 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 “:”. Chẳng hạn như:
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.
3.2.1. Về nội dung (lớp application):
Từ khóa content:
Một chức năng quan trọng của Snort, nó có khả năng tìm mẫu dữ liệu
bên trong gói. Mẫu này có thể hiển thị ở dạng chuỗi ASCII hay nhị phân
trong hình thức mã hexa.
Rule sau đây phát hiện một mẫu “GET” trong phần dữ liệu của gói
TCP xuất phát từ địa chỉ 192.168.1.0. từ khóa GET thường được sử
dụng cho nhiều loại tấn công HTTP; tuy nhiên ở đây rule chỉ giúp cho
hiểu như thế nào từ khóa này làm việc mà thôi:
alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any \
(content: "GET"; msg: "GET matched";)
Rule dưới đây cũng tương tự nhưng nó liệt kê ở dạng hexa:
alert tcp 192.168.1.0/24 any -> ![192.168.1.0/24] any \
(content: "|47 45 54|"; msg: "GET matched";)
17
Số 47 tương đương mã ASCII là G, 45 = E, 54 = T. cũng có thể kết hợp
dạng
ASCII và nhị phân trong hexa vào một rule. Ký tự hexa nằm trong cặp dấu “||”.
Có 3 từ khóa khác nhau dùng chung với content. Những từ khóa này là
tiêu chuẩn trong khi tìm một mẫu bên trong gói. Đó là:
Offset
Depth
Nocase
Từ khóa offset:
Từ khóa offset sử dụng để bắt đầu tìm trong khoảng nào đó từ
điểm bắt đầu của phần dữ liệu của gói. Dùng một con số làm đối số cho
từ khóa này. Ví dụ sau sẽ bắt đầu tìm từ “HTTP” sau 4 byte kể từ byte đầu
tiên trong gói.
alert tcp 192.168.1.0/24 any -> any any \
(content: "HTTP"; offset: 4; msg: "HTTP matched";)
Từ khóa depth định nghĩa điểm để Snort ngừng tìm kiếm mẫu.
Từ khóa depth:
Chỉ định một giới hạn dưới cho việc lấy mẫu. Dùng depth cho phép
chỉ định một khoảng bắt đầu từ byte đầu tiên của gói. Dữ liệu sau
khoảng này không lấy mẫu nữa. Nếu kết hợp offset và depth cùng với
content, có thể chỉ ra vùng dữ liệu mà muốn lấy mẫu. Ví dụ muốn tìm
từ “HTTP”, lấy mẫu 4 byte và chỉ xét trong
40 byte đầu tiên:
alert tcp 192.168.1.0/24 any -> any any (content: \
"HTTP"; offset: 4; depth: 40; msg: "HTTP matched";)
Nó rất quan trọng khi muốn giới hạn công việc tìm kiếm trong gói.
Cho ví dụ, thông tin về yêu cầu HTTP GET được tìm thấy từ đầu gói.
Không cần phải tìm toàn bộ gói. Nhiều gói được capture với kích thước
18
rất lớn, nó sẽ tốn nhiều thời gian để tìm kiếm.
Từ khóa nocase:
Nocase thường kết hợp với content. Nó không có đối số. Nó chỉ giúp tìm
mẫu trong
dữ liệu không phân biệt chữ hoa hay thường.
Từ khóa flow:
Flow được sử dụng để áp dụng một rule trên những phiên TCP đến
những gói trong phương hướng riêng. Từ khóa này dùng xác định
phương hướng. Những lựa chọn có thể sử dụng cho từ khóa này xác định
phương hướng:
to_client
to_server
from_client
from_server
Những lựa chọn này lần đầu có thể gây cho khó hiểu. Từ “to” mang ý
nghĩa là đáp ứng (response) và “from” mang nghĩa là yêu cầu (request).
Những lựa chọn khác dưới đây cũng có thể sử dụng để áp dụng rule
vào các trạng thái khác nhau của kết nối TCP.
Lựa chọn stateless, áp dụng rule mà không cần xem trạng thái của
phiên TCP
Lựa chọn established, áp dụng rule mà để xác lập chỉ những phiên
TCP
Lựa chọn no_stream, bật những rule để áp dụng vào gói mà không
cần xây dựng từ một luồng
Lựa chọn stream_only, áp dụng rule chỉ trên những gói đã xây dựng
từ một luồng.
Luồng TCP (TCP Stream)được xử lý bởi bộ tiền xử lý stream4 (thảo
luận trong phần sau). Lựa chọn stateless và established liên kết đến
trạng thái TCP.
19
3.2.2. Lựa chọn về IP:
Từ khóa fragbits:
Tiêu đề IP (IP header) chứa 3 cờ bit, dùng để phân mảnh và
tái hợp gói IP. Chức năng các cờ như sau:
Bit dành riêng (RB – Reserved Bit), dùng cho tương lai.
Bit không phân mảnh (DF – Don’t Fragment Bit). Nếu bit
này bật, nó cho
biết gói IP sẽ không phân mảnh.
Bit có nhiều phân mảnh (MF – More Fragments Bit).
D tương đương DF. Tương tự, R là RB, M là MF. cũng có
thể dùng dấu “!” trong rule. Ngoài ra, đi chung với
“D,R,M”, ta cũng thường thấy các từ “+,-”. Nó có ý nghĩa,
nếu là “+” tức là gắn thêm bit cờ với những bit khác, nếu là
“-” thì bỏ bớt một số bit.
Từ khóa ipopts:
Trong IPv4, tiêu đề là 20 byte. có thể thêm những lựa chọn cho
tiêu đề IP này. Chiều dài của phần lựa chọn có thể lên đến 20
byte. Lựa chọn IP dùng cho những mục đích khác nhau, đó là:
Record Route (rr)
Time Stamps (ts)
Lose Source Routing (lsrr): định tuyến nguồn nới lỏng
Strict Source Routing (ssrr); định tuyến nguồn siết chặc
Trong Snort rule, hầu hết những lựa chọn thường dùng liệt kê
trong RFC 791 tại http://www.rfc-editor.org/rfc/rfc791.txt. Hacker có thể
dùng những lựa chọn này để tìm thông tin về tổ chức mạng. Ví dụ,
loose và strict source routing có thể giúp hacker khám phá ra đườn dẫn
của một mạng nào đó tồn tại hay không.
Dùng những Snort rule, có thể phát hiện những nổ lực tìm kiếm
của hacker bằng từ khóa ipopts. Rule sau áp dụng cho Losse Source
Routing: alert ip any any -> any any (ipopts: lsrr; \ msg: "Loose source
routing attempt";)
cũng có thể dùng từ khóa logto để ghi thông điệp vào một file. Tuy
20
nhiên, không thể chỉ định nhiều từ khóa lựa chọn IP trong một rule.
Từ khóa ip_proto:
Ip_proto sử dụng IP Proto plug-in để xác định con số giao thức trong IP
header. Từ khóa yêu cầu con số giao thức như một đối số. có thể sử
dụng một tên cho giao thức nếu nó đã định nghĩa trong file
/etc/protocols. Xem mẫu file tương tự như sau:
ax.25 93 AX.25 # AX.25 Frames
ipip 94 IPIP # Yet Another IP
encapsulation micp 95 MICP # Mobile
Internetworking Control Pro.
scc-sp 96 SCC-SP # Semaphore Communications
Sec. Pro.
etherip 97 ETHERIP # Ethernet-
within-IP Encapsulation
encap 98 ENCAP # Yet Another IP encapsulation
# 99 # any private
encryption scheme
gmtp 100 GMTP # GMTP
ifmp 101 IFMP # Ipsilon Flow Management
Protocol
pnni 102 PNNI # PNNI over IP
Rule sau kiểm tra nếu giao thức IPIP là đang sử dụng bởi
gói dữ liệu:
alert ip any any -> any any (ip_proto: ipip; \
msg: "IP-IP tunneling detected";)
Tiếp theo, ta dùng một số thay vì tên (hiệu quả hơn)
alert ip any any -> any any (ip_proto: 94; \
msg: "IP-IP tunneling detected";)
Những giao thức mới nhất có thể tìm thấy từ ICANN tại
21
http://www.icann.org tại IANA http://iana.org.
Từ khóa id:
Id dùng để so sánh trường ID phân mảnh của tiêu đề IP. Mục đích
của nó là phát hiện ra những tấn công mà có dùng ID cố định trong IP
header. Định dạng của nó là:
id: "id_number"
Nếu giá trị của trường id trong IP header bằng 0, nó cho biết đây là
phân mảnh cuối cùng của một gói IP (nếu gói IP đó bị phân mảnh). Giá trị
0 cũng cho biết rằng nó chỉ phân mảnh nếu gói đó là không phân mảnh.
Id trong Snort rule dùng để xác định phân mảnh cuối cùng trong gói IP.
Từ khóa tos:
Tos dùng để phát hiện ra một giá trị nào đó trong trường TOS (Type of
Service) của IP header. Ví dụ như sau:
tos: 1;
• Từ khóa ttl: Ttl được dùng để phát hiện giá trị Time o Live trong IP
header của gói. Từ khóa có một giá trị cho biết chính xác giá trị TTL.Từ khóa
này có thể sử dụng với tất cả loại giao thức xây dựng trên giao thức IP, bao
gồm ICMP, UDP và TCP. Định dạng chung của nó như sau:
ttl: 100;
Tiện ích traceroute sử dụng TTL để tìm bộ định tuyến kế tiếp trong
đường đi của gói. Traceroute gửi những gói UDP với giá trị TTL tăng dần.
Giá trị TTL được giảm dần tại mỗi hop. Khi nó có giá trị là 0, router sinh ra
một gói ICMP đến nguồn. Sử dụng gói ICMP này, tiện ích traceroute tìm ra
địa chỉ IP của router. Ví dụ, để tìm router thứ 5, traceroute sẽ gửi những
gói UDP với TTL đặt là 5. Khi gói này đến router thứ 5, nó có giá trị là 0 và
một gói ICMP được sinh ra.
Sử dụng ttl, có thể tìm ra nếu một ai đó cố gắng traceroute qua mạng
của .
Từ khóa cần chính xác giá trị TTL để mà so khớp.
22
3.2.3. Lựa chọn về TCP:
Từ khóa seq:
Seq trong Snort rule kiểm tra sequence number của gói TCP. Đối số
này là một sequence number. Nó có định dạng:
seq: "sequence_number";
Sequence number là một phần trong tiêu đề TCP.
Từ khóa flags:
Flags dùng để tìm ra cờ bit được bật trong tiêu đề TCP gói. Mỗi cờ có
thể dùng như một đối số cho flags trong Snort rule. có thể tham khảo
thêm cờ flag trong TCP tại RFC 793 tại http://www.rfc-
editor.org/rfc/rfc793.txt. Cờ bit này được sử dụng cho nhiều công cụ
bảo mật nhằm mục đích khác nhau bao gồm công cụ quét cổng như
nmap. Snort hỗ trợ những loại cờ bit trong mục 1:
Cũng có thể dùng dấu “!,+,*” giống như cờ bit trong tiêu đề IP, tương
ứng với phép AND, OR và NOT.
alert tcp any any -> 192.168.1.0/24 any (flags: SF; \
msg: “SYNC-FIN packet detected”;)
Từ khóa ack:
TCP header có một trường Acknowledgemant Number, có chiều dài 32
bit. Trường cho biết là sequence number tiếp theo của gói TCP bên gửi
đang chờ đợi từ bên nhận. Trường này chỉ có ý nghĩa khi cờ ACK trong TCP
header được bật.
Công cụ nmap (http://nmap.org) sử dụng tính năng của gói TCP này
đế ping một máy. Cho ví dụ, nó có thể gửi một gói TCP tới port 80 với
cờ ACK bật và sequence number là 0. Khi gói này không truy cập được
do bên nhận có áp dụng rule đối với TCP, nó sẽ gửi về một gói RST. Khi
nmap nhận được gói RST này, nó chỉ ra rằng host đó vẫn còn hoạt động.
Phương pháp này làm việc trên những host mà không đáp ứng những
gói ICMP ECHO REQUEST.
23
Để phát hiện loại ping TCP này, có thể tạo một rule như sau:
alert tcp any any -> 192.168.1.0/24 any (flags: A; \
ack: 0; msg: "TCP ping detected";)
Rule này cho biết là thông điệp cảnh báo sẽ phát ra khi nhận một gói
TCP với cờ A bật và ACK chứa có giá trị 0. Những cờ TCP được liệt kê
trong bảng dưới. Host đích là 192.168.1.0/24. có thể sử dụng giá trị
của ACK trong rule, tuy nhiên nó thêm vào Snort chỉ phát hiện cho loại
tấn công này. Thường thì khi cờ A được bật, giá trị ACK không còn là 0.
3.2.4. Lựa chọn về ICMP:
Từ khóa icmp_id:
Lựa chọn icmp_id phát hiện ra ID của gói ICMP. Cú pháp của nó là:
icmp_id: <ICMP_id_number>
Trường nhận dạng một ICMP tìm thấy trong thông điệp ICMP ECHO
REQUEST và ICMP ECHO REPLY (xem RFC 792). Trường này được sử dụng
để so sánh ECHO REQUEST và ECHO REPLY. Thường thì khi sử dụng lệnh
ping, cả hai loại ICMP đó được trao đổi giữa bên gửi và bên nhận. Bên
gửi gửi gói ECHO REQUEST và bên nhận đáp ứng lại gói ECHO REPLY.
Trường này có ích cho việc nhận ra cái gói đáp ứng cho gói yêu cầu. Luật
sau kiểm tra nếu ICMP IP trong tiêu đề ICMP bằng 100 thì sinh một cảnh
24
báo.
alert icmp any any -> any any (icmp_id: 100; \
msg: "ICMP ID=100";)
Từ khóa icmp_seq:
Lựa chọn icmp_seq tương tự như icmp_id. Cú pháp của nó là:
icmp_seq: <ICMP_id_number>
sequence number cũng là một trường trong tiêu đề ICMP và cũng có
ích trong việc so sánh ECHO REQUEST và ICMP ECHO REPLY (xem RFC
792). Từ khóa này cho phép tìm một sequence number đặc trưng. Tuy
nhiên, ít ai mà dùng từ khóa này. Xem rule sau, nếu sequence number
là 100 thì sinh cảnh báo:
alert icmp any any -> any any (icmp_seq: 100; \
msg: "ICMP Sequence=100";)
Từ khóa itype:
Tiêu đề ICMP đến sau tiêu đề IP và chứa một trường type.Từ khóa
itype nhằm phát hiện những tấn công sử dụng trường type trong tiêu đề
ICMP. Đối số cho nó là một số và có định dạng sau:
itype: "ICMP_type_number"
Trường type trong ICMP header của gói dữ liệu được sử dụng để xác
định loại gói ICMP. Danh sách các loại ICMP khác nhau và giá trị của
trường type tương ứng:
25
Ví dụ, nếu muồn sinh một cảnh báo cho loại thông điệp source quench,
sử dụng rule sau:
alert icmp any any -> any any (itype: 4; \
msg: "ICMP Source Quench Message received";)
Từ khóa icode:
Trong những gói ICMP, ICMP header đến sau IP header. Nó chứa một
trường code. Từ khóa icode dùng để phát hiện trường code trong tiêu
đề gói ICMP. Đối số cho trường này là một số và có định dạng sau:
icode: "ICMP_codee_number"
Trường type trong tiêu đề ICMP cho biết loại thông điệp ICMP. Trường
code cho biết chi tiết loại đó. Ví dụ, nếu trường type có giá trị là 5
thì loại ICMP là “ICMPredirect”. Có thể có nhiều lý do sinh ra một
ICMP redirect. Trường code cho biết rõ những loại lý do đó:
Nếu trường code bằng 0, gửi gói ICMP đến một mạng.
Nếu trường code bằng 1, gửi gói ICMP đến một host
Nếu trường code bằng 2, gói ICMP là loại của dịch vụ và mạng.
Nếu trường code bằng 3, gói ICMP là loại của dịch vụ và host.
Icode trong Snort rule sử dụng để tìm giá trị trường code trong ICMP
header. Rule sau sinh ra một cảnh báo cho những gói ICMP đến host:
26
alert icmp any any -> any any (itype: 5; \ icode: 1; msg: "ICMP ID=100";)
Hai từ khóa itype và icode thường dùng chung với nhau. Nếu icode
dùng một mình thường không đạt được công việc tốt bởi vì những loại
ICMP khác cũng có thể có cùng giá trị code giống nhau.
27
4. Cấu hình Snort:
Snort sử dụng một file cấu hình cho mỗi lần chạy. Thường tên file cấu hình
của nó có tên snort.conf. Tuy nhiên cũng có thể sử dụng tên khác, nhưng khi
chạy dòng lệnh phải chỉ đúng tên file cấu hình yêu cầu.
Tập tin cấu hình chứa 6 phần cơ bản:
Định nghĩa tham biến. Những tham biến này sẽ dùng cho rule Snort.
Cấu hình các tham số. Các tham số này định rõ những lựa chọn cấu hình
Snort khác nhau. Chúng cũng có thể dùng trên dòng lệnh.
Cấu hình preprocessor.
Cấu hình Ouput plug_in (Output module).
Định nghĩa kiểu hành động mới.
Cấu hình đường dẫn đến tập luật (rules file).
4.1 Định nghĩa các tham biến sử dụng trong rule:
Định nghĩa tham biến giúp thuận tiện hơn khi viết rule. Ví dụ, có thể
định nghĩa tham biến HOME_NET trong file cấu hình như sau:
Var HOME_NET 192.168.1.0/24
Sau này có thể thấy trong rule:
alert ip any any -> $HOME_NET any (ipopts: lsrr; \
msg: “Loose source routing attempt”; sid: 1000001;)
Ngoài ra có thể định nghĩa cho danh sách các mạng trong
tham biến: var HOME_NET [192.168.1.0/24,192.168.10.0/24]
Định nghĩa tên giao diện trong tham biến:
var HOME_NET $eth0_ADDRESS
var EXTERNAL_NET $eth1_ADDRESS
Sử dụng từ khóa any nếu muốn kiểm tra bất kỳ nguồn gốc nào đến.
var EXTERNAL_NET any
4.2 Cấu hình các tham số chỉ dẫn (directive):
28
Cấu hình directive giúp người dùng cấu hình nhiều hình thức thiết
lập chung cho Snort. Chẳng hạn như chỉ định nơi chứa log file, chỉ định rule
ứng dụng. Ta có thể dùng directive để thay thế các lựa chọn bằng dòng lệnh.
Cú pháp của nó:
config directive_name[: value]
Danh sách các directive được liệt kê trong bảng sau:
29
30
4.3 Cấu hình preprocessor:
Preprocessor hay còn gọi là input plug_in nhận gói và xử lý nó trước khi
rule áp dụng lên gói. Cấu hình preprocessor rất quan trọng. Cú pháp:
Preprocessor<preprocessor_name>[:
<configuration_options>]
Tên của preprcessor sau từ khóa preprocessor. Các tham số theo sau
nằm sau dấu “:”. Ví dụ, preprocessor frag2 áp dụng lên gói IP phân mảnh,
stream4 với đối số theo sau để phát hiện quá trình quét cổng (scan port):
preprocessor frag2
preprocessor stream4: detect_scans
Frag2 và Stream4 là một trong những preprocessor đã được định nghĩa
sẵn của Snort. cũng có thể viết những preprocessor cho riêng mình. Xem
hướng dẫn trực tiếp trong tập tin snort.conf.
4.4 Cấu hình Output Plug_in:
Nếu muốn ghi thông tin vào cơ sở dữ liệu hay gửi SNMP trap, phải cấu
hình ouput plug_in. Cú pháp:
output <output_module_name>[: <configuration_options>]
ví du, muốn ghi vào MySQL, phải cấu hình tên cơ sở dữ liệu, tên máy
chứa cơ sở dữ
liệu, tên tài khoản, mật khẩu như sau:
output database: alert, mysql, user=rr password=boota \
dbname=snort host=localhost
4.5 Định nghĩa những hành động mới:
Snort có sẵn những loại hành động như: alert, log,.. Tuy nhiên ta có
thể định nghĩa những hành động riêng cho mình. Một hành động có thể sử
dụng nhiều ouput plug_in. Ví dụ dưới đây định nghĩa một hành động tạo ra
31
thông điệp cảnh báo đồng thời ghi vào trong cơ sở dữ liệu và ghi một file nhị
phân.
ruletype dump_database
{
type alert
output database: alert, mysql, user=rr dbname=snort \
host=localhost
output log_tcpdump: tcpdump_log_file
}
có thể dùng hành động trên trong rule của mình:
dump_database icmp any any -> 192.168.1.0/24 any \
(fragbits: D; msg: "Don’t Fragment bit set";)
4.6 Cấu hình đường dẫn đến rule:
Cú pháp:
include <rule_name.rules>
Mặc định các file rule nằm trong thư mục rules trong thư mục cài đặt
Snort. Từ khóa include dùng để tham chiếu đến những rule đã xây dựng áp
dụng lên gói tin.
4.7 Minh hoạt một mẫu file cấu hình cho Snort:
# Variable Definitions
var HOME_NET 192.168.1.0/24
var EXTERNAL_NET any
var HTTP_SERVERS
$HOME_NET var
DNS_SERVERS $HOME_NET
var RULE_PATH ./
32
#
preprocessors
preprocessor
frag2
preprocessor stream4:
detect_scans preprocessor
stream4_reassemble
preprocessor http_decode: 80 -unicode
-cginull preprocessor unidecode: 80 -
unicode -cginull preprocessor bo: -
nobrute
preprocessor telnet_decode
preprocessor portscan: $HOME_NET 4 3
portscan.log preprocessor arpspoof
# output modules
output alert_syslog: LOG_AUTH LOG_ALERT
output log_tcpdump: snort.log
output database: log, mysql, user=rr password=boota \
dbname=snort host=localhost
output xml: log, file=/var/log/snortxml
# Rules and include files
include $RULE_PATH/bad-
traffic.rules include
$RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include
$RULE_PATH/finger.rules
include
33
$RULE_PATH/ftp.rules
include
$RULE_PATH/telnet.rules
34
Phần 2. Snort và các sản phẩm kết hợp:
IDS đem lại cho chúng ta nhiều lợi ích trong quá trình tiềm kiếm,phát hiện
những hành vi cũng như tiến trình tấn công mạng. Kết quả đó là tập những dữ
liệu quan trọng. Ngày nay với sự kết hợp các sản phẩm đi kèm với IDS mang lại
rất nhiều hiệu quả trong quá trình phân tích. Nó cũng chính là những công cụ,
tiện ích cho ta cái nhìn trực quan hơn. Mặc dù những công cụ phân tích dữ liệu
thuộc về thương mại sẵn có nhưng không thể nói những công cụ “miễn phí”
hoàn toàn kém hiệu quả. Những công cụ miễn phí đó thực sự rất mạnh. Dưới
đây là một số những công cụ đi kèm với IDS giúp ta quản lý, phân tích dòng lưu
lượng nguy hại rất tốt.
2.1. Sử dụng Snort với MySQL:
MySQL là một trong những cơ sở dữ liệu (CSDL) phổ biến ngày nay.
Snort có thể làm việc cùng với MySQL, Oracle hay những cơ sở dữ liệu
khác tương thích ODBC (Open Database Connectivity). Trong chương trước,
chúng ta cũng đã biết những output pluggin có thể kết xuất thông tin lưu
những log và alert vào một cơ sở dữ liệu. Việc ghi vào CSDL giúp ta giám sát
dữ liệu mang tính lịch sử để có thể xem lại sau này, xuất báo cáo và phân
tích thông tin. Bằng cách sử dụng những công cụ khác như ACID (sẽ được
phân tích trong phần sau), có thể lấy rất nhiều thông tin hữu ích từ CSDL.
Chẳng hạn như ta có thể lấy một bản báo cáo về 15 loại tấn công sau cùng,
thông tin về những máy tấn công vào mạng, những loại tấn công phân tán
bằng những giao thức khác nhau, v.v..
MySQL là CSDL hoàn toàn miễn phí và có thể làm việc tốt trên hệ
thống Linux và trên những hệ thống khác nhau. Ta có thể cài đặt và chạy
MySQL trên cùng một máy chạy Snort hoặc trên hai máy khác nhau
Sau đây là những bước cơ bản giúp Snort làm việc với MySQL:
Biên dịch Snort có hỗ trợ MySQL và cài đặt nó. Phải đảm bảo rằng Snort
35
làm việc bằng cách thử tạo ra một vài cảnh báo. Để Snort làm việc được
với MySQL, yêu cầu cần phải thêm vào dòng --with-mysql trong đoạn script
cấu hình Snort
Cài đặt MySQL và sử dụng MySQL client để kiểm tra CSDL đã có.
Tạo một cơ sở dữ liệu trên MySQL server cho Snort. Tôi đã đặt tên CSDL
này là
“snort”. Tuy nhiên có thể đặt tên khác tùy ý thích.
Tạo một tài khoản và mật khẩu (Username và Password) trong CSDL. Tài
khoản
này sẽ được sử dụng dùng khi Snort ghi liệu vào.
Cấu hình file snort.conf để cho phép ghi dữ liệu vào CSDL. Dùng
username và password ở trên để thực hiện ghi dữ liệu..
Khởi động lại Snort. Nếu mọi việc thực hiện tốt, Snort sẽ bắt đầu ghi
vào trong
CSDL.
Xuất một vài cảnh báo và sử dụng chương trình mysql client xem
những gì mà Snort ghi được.
Giả định rằng sau khi cấu hình CSDL và tạo những bảng và tài khoản, ta
cần soạn thảo file snort.conf. Những dòng sau đây sẽ cho phép ghi những
thông điệp log vào CSDL MySQL:
output database: log, mysql, user=huuly password=huuly \
dbname=snort host=localhost
Ý nghĩa của dòng trên là: tên CSDL là snort và MySQL server đang chạy
ở localhost. Tài khoản sử dụng CSDL là huuly, mật khẩu là huuly. Nếu tài
khoản không có mật khẩu, thì ta bỏ dòng: password=huuly.
Theo như trên, CSDL sẽ chạy trên cùng một máy với Snort. Nếu như có
một máy chủ CSDL riêng, có thể chỉ định tên của máy chủ trong tập tin
snort.conf. Ví dụ, nếu máy chủ CSDL không nằm trên một máy có Snort
đang chạy, sử dụng dòng lệnh sau:
output database: log, mysql, user=huuly password=huuly \
36
dbname=snort host=192.168.1.222
Máy chủ CSDL MySQL đang chạy trên máy 192.168.1.222. Tuy nhiên
Snort sensor và MySQL phải được cài đặt và nằm trên cùng một mạng con
với nhau. Máy chủ CSDL phải chạy trước khi khởi động Snort sensor.
Sau khi khởi động Snort sensor, sẽ thấy những thông tin sau, điều đó
chứng tỏ Snort đang làm việc với MySQL
Hình 2.1: khởi động Snort làm việc với MySQL
2.2. Sử dụng Snort với ACID
Analysis Console for Intrusion Databases (ACID) là trong những công cụ
phân tích và kiểm duyệt dữ liệu. ACID dựa trên những đoạn mã viết bằng
ngôn ngữ PHP, cung cấp giao diện giữa một trình suyệt Web (Web Browser)
và cơ sở dữ liệu Snort (như MySQL). ACID có thể xem là công cụ rất mạnh
(một tính năng tương tự như ACID còn được biết đến là BASE – Basic
Analysis and Security Engine)
ACID cung cấp những tính năng sau:
Một giao diện (interface) dùng tìm kiếm cơ sở dữ liệu và xây dựng bảng
37
truy vấn.
Việc tìm kiếm có thể được thực hiện bởi những tham số chẳng hạn
như địa chỉ IP của attacker hay những sự kiện như thời gian, ngày
tháng hay những luật “bẫy” được.
Một trình duyệt gói tin, gói tin bắt được và được giải mã thông tin ở lớp
3 và 4 sẽ được hiển thị cụ thể.
Khả năng quản lý dữ liệu, bao gồm “nhóm” những cảnh báo (nhóm
những sự kiện liên quan đến xâm nhập), xóa cảnh báo hay kết xuất thông
điệp đến hộp thư điện tử (e-mail).
Minh họa bằng đồ thị và trạng thái.
ACID hoàn toàn free và download ACID tại website www.cert.org/kb/acid
Để sử dụng được ACID, cần phải có một số thành phần kết hợp đi kèm. Sau
đây là những thủ tục cần thiết để đảm bảo ACID làm việc tốt:
Cài đặt và kiểm tra Snort làm việc tốt
Cà đặt và kiểm tra MySQL. Các thủ tục về MySQL đã giới thiệu ở trên.
Cài đặt Apache.web server Có thể download Apache tại
http://www.apache.org
Download ACID, giải nén vào thư mục /var/www/html. Trong tiến
trình này tạo thư mục có tên acid nằm trong /var/www.html. Tùy
thuộc vào mỗi ấn bản của Linux, thư mục lưu giữ có thể khác nhau,
nhưng phải đảm bảo sao cho nơi mà Apache có thể tìm thấy những
tập tin HTML.
Cài đặt PHP. Có thể download PHP tai http://www.php.net .
Download PHPLOT tại http://www.phplot.com và giải nén vào thư
mục /var/www/html. Ứng dụng của PHPLOT là tạo ra giao diện đồ họa
cho trang web
Download ADODB từ http://php.weblogs.con/adodb và cài đặt nó
vào thư mục /var/www/html. ADODB là thư viện hướng đối tượng
viết bằng PHP và được sử dụng để kết nối vào CSDL. Chi tiết về
ADODB xem tại http://php.weblogs.com/adodb_fag
38
Sau khi cài đặt các thủ tục cần thiết, ta cấu hình ACID cho phù hợp
với Snort và MySQL. Tập tin acid_conf.php phải cấu hình như sau:
Thiết lập đường dẫn đến ADODB:
$DBlib_path = "./adodb";
Thiết lập loại CSDL:
$DBtype = "mysql";
Thiết lập những thông tin chính của CSDL “snort”, noi mà Snort ghi dữ
liệu của nó vào:
$alert_dbname = "snort";
$alert_host = "localhost";
$alert_port = "";
$alert_user = "huuly";
$alert_password = "huuly";
39
Sử dụng ACID:
ACID rất đơn giản, dưới đây là giao diện chính của nó:
Hình 2.2: Giao diện chính của ACID sử dụng Web Browser
Hình trên hiển thị các trạng thái của ACID: tên, số cảnh báo (phân chia theo
giao thức), các cổng nguồn và đích, v.v.. Bằng cách click vào đường liên kết
tương ứng sẽ cho biết chi tiết về từng loại. Dưới đây là danh sách của những
cảnh báo (chúng đã được nhóm theo mỗi rule bẫy được)
40
Hình2.3: Hiển thị các cảnh báo được lấy từ MySQL
41
Mỗi một cảnh báo có những liên kết chi tiết thể hiện qua những fields
(trường). Ví dụ, muốn xem chi tiết gói tin tấn công, nhấp vào một liên kết
trong field ID. Như sau đây:
Hình 2.4: chi tiết của một cảnh báo
2.3. Sử dụng Snort với Swatch:
Swatch là một công cụ tự động giám sát những tập tin log. Nó giúp ích
trong việc gửi một E-mail trong tình trang khẩn cấp.
Sử dụng Swatch sau khi ta tạo một tập tin cấu hình đơn giản có tên là
./swatchrc:
42
Giả sử tập tin ./swatchrc nằm trong thư mục /root và swatch được cài đặt
trong thư mục /usr/local/bin. Thực hiện dòng lệnh sau để khởi động swatch:
/usr/local/bin/swatch –c /root/.swatchrc –t
/var/log/snort/canhbao.txt
Lựa chọn –c chỉ định vị trí của tập tin cấu hình Swatch và –t nói lên Swatch sẽ
“nhìn” vào tập tin log mà nó giám sát.
Khi có một sự kiện bắt được từ Snort, các thông tin ghi vào tập tin
canhbao.txt. Swatch sẽ gửi một thông điệp e-mail tương ứng trong tập tin cấu
hình của nó.
43
Phần 3. Thử nghiệm khả năng phản ứng của
Snort IDS
Truy cập vào base http://127.0.0.1/base
Lúc này chưa có cảnh báo nào vì ta chưa khởi chạy snort. giả sử ta tạo một
rules với dấu hiệu như sau:
Sau đó include nó vào file /etc/snort_inline/snort_inline.conf và khởi chạy
snort: # snort_inline -c /etc/snort_inline/snort_inline.conf -Q rồi từ một máy
khác ping đến với địa chỉcủa máy ping là 192.168.1.121 và địa chỉ của máy IDS
là 192.168.1.111 ta có kết quả sau
44
45
Như vậy snort IDS đã hoạt động tốt, ta thử rules sau cho trường hợp phát
hiện nmap scan cổng.
sau đó include scan.rules vào file /etc/snort_inline/snort_inline.conf
khởi động lại snort_inline. Từ máy tấn công bật nmap và scan cổng ta nhận
được kết quả. nhưvậy snort đã thểhiên là một IPS
46
Vào máy Snort xem kết quả:
47
Phần 4. Kết luận
Hệ thống phát hiện xâm nhập (IDS) tuy chỉ mới xuất hiện sau này nhưng
hiện đóng vai trò không kém phần quan trọng. IDS giúp con người khám phá, phân
tích một nguy cơ tấn công mới. Từ nó người ta vạch ra phương án phòng chống. Ở
một góc độ nào đó, có thể lần tìm được thủ phạm gây ra một cuộc tấn công. Một
tổ chức lớn không thể nào thiếu IDS.
Những vấn đề đạt được:
Nắm được cơ chế hoạt động Snort IDS
Có cái nhìn trực quan khi thực hiện thử nghiệm một số loại tấn công
Nắm bắt được cơ chế hoạt động của hệ thống phát hiện xâm nhập Snort – IDS cùng các tập luật.
Cài đặt và cấu hình một hệ thống phát hiện xâm nhập mã nguồn mở Snort.
Vận dụng những hiểu biết nghiên cứu để viết luật cho Snort.
Sử dụng được các sản phẩm phân tích cảnh báo trong Snort như: MySQL, ACID, Swatch, Snortsam.
Những vấn đề chưa đạt được:
Vấn đề về Snort IDS rất rộng lớn, hiện những cách thức tấn công mới ngày nay đã có những thay đổi lớn. Do đó chưa thực sự hiểu rõ cách hoạt động của nó.
Đối với Snort, hiện có rất nhiều sản phẩm đi kèm hoạt động rất hay như: Barnyard, Snort center, Snort_inline, SnortSnarf,… không được áp dụng triệt để.
Tập luật bổ sung đang trong giai đoạn tối ưu và bổ sung nên không trình bày trong báo cáo.