Giảng viên hướng dẫn : Nguyễn Ngọc Như Hằng
Nhóm sinh viên thực hiện :
Nguyễn Quỳnh MSSV:070073
Phù Sử Hùng MSSV:070156
Lớp : VT071
Tháng 12 /năm 2010
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC HOA SEN
KHOA KHOA HỌC VÀ CÔNG NGHỆ
PHIẾU GIAO ĐỀ TÀI KHÓA LUẬN TỐT NGHIỆP
1. Mỗi sinh viên phải viết riêng một báo cáo
2. Phiếu này phải dán ở trang đầu tiên của báo cáo
1. Họ và tên sinh viên/ nhóm sinh viên được giao đề tài (sĩ số trong nhóm:____)
(1) .............................................................MSSV:......................khóa:.............................
(2) .............................................................MSSV:......................khóa:.............................
(3) .............................................................MSSV:......................khóa:.............................
Chuyên ngành: Mạng máy tính Khoa: Khoa Học - Công Nghệ........................
2. Tên đề tài: Xây dựng hệ thống IDS – Snort trên hệ điều hành Linux........................
.....................................................................................................................................
3. Các dữ liệu ban đầu:
Snort được xây dựng với mục đích phát hiện xâm nhập vào hệ thống. Snort có khả năng
phát hiện một số lượng lớn các kiểu thăm dò, xâm nhập khác nhau như : buffer
overflow, ICMP, virus…Snort là phần mềm open source cung cấp cho nhà quản trị các
thông tin cần thiết để xử lý các sự cố khi bị xâm nhập.....................................................
...........................................................................................................................................
...........................................................................................................................................
4. Các yêu cầu đặc biệt:
Hiểu được khái niệm, cách hoạt động của IDS - Snort. Cài đặt, cấu hình Snort trên hệ
điều hành Ubuntu. Kiểm chứng kết quả đạt được sau khi cài đặt thành công..................
...........................................................................................................................................
...........................................................................................................................................
thống từ đó có thể ứng dụng trong mô hình mạng thực tế.
4
Xây dựng hệ thống IDS – Snort trên hệ điều hành Linux 2010
Mục Lục
5
Xây dựng hệ thống IDS – Snort trên hệ điều hành Linux 2010
Chúng tôi xin chân thành cảm ơn cô Nguyễn Ngọc Như Hằng - giảng viên trực tiếp
hướng dẫn nhóm chúng tôi thực hiện khóa luận tốt nghiệp này này, đã tận tình hướng
dẫn và hỗ trợ và giúp chúng tôi giải quyết khó khăn trong quá trình nghiên cứu đề tài
này. Chúng tôi chân thành cảm ơn sự nhiệt tình của cô, cô đã giúp chúng tôi giải đáp
những thắc mắc cũng như cung cấp những tài liệu cần thiết cho quá trình nghiên cứu đề
tài của chúng tôi. Một lần nữa xin chân thành cảm ơn cô.
Chúng tôi xin gửi lời cảm ơn đến những giảng viên của ngành Mạng Máy Tính trường
đại học Hoa Sen đã tận tình giảng dạy và tạo điều kiện cho chúng tôi học tập, nghiên
cứu. Để từ đó chúng tôi có được một nền tảng kiến thức vững chắc làm tiền đề giúp
cho chúng tôi thực hiện tốt đề tài tốt nghiệp của mình.
6
Xây dựng hệ thống IDS – Snort trên hệ điều hành Linux 2010
NHẬN XÉT CỦA NGƯỜI HƯỚNG DẪN
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
................................................................................................................................................................
lập và cấu hình thông qua command line. Điều này cho phép người dùng có thể thay
đổi cấu hình cấu hình của snort mà không cần phải thay đổi file cấu hình. Đồng thời
có thể cho phép nhiều tiến trình snort chia sẽ với nhau một file cấu hình. Để xem
các command line option trong snort được xử lý thế nào người dùng có thể xem
hàm ParseCmdLine trong file snort.c. Đồng thời qua đó người dùng cũng có thể tạo
thêm các option tùy theo ý muốn. Từ phiên bản 2.6 snort đã có hơn 40 command
line options.
1.2 Xử lý file cấu hình
File cấu hình chứa các thông số cấu hình cho snort, một số thông số cấu hình sẽ
không được hỗ trợ thông qua command line. Các thông số này bao gồm các loạigiá
trị cấu hình, preprosessor, các chỉ dẫn cho output, rule và các thông số khác.
File cấu hình của snort được định dạng theo từng dòng và được phân tích và chạy
theo từng dòng một. Snort đọc toàn bộ các line và phân tích từng line như là một
đối tượng riêng biệt. Để thực hiện việc phân tích các rule snort sử dụng hàm
ParseRulesFile trong file parser.c. Để phân tích các thành phần còn lại trong file
cấu hình snort tích hợp code dùng cho việc phân tích cho preprocessor, dectection
option, và các output plug-in vào trong các module đó.
1.3 Phân tích các rule
Mỗi rule trong snort bao gồm 2 phần: header và các option. Header của rule dùng để
phân biệt loại rule (alert, log, pass…), protocol, source và destination IP, source và
destination port mà rule đang dùng. Phần Option của rule chứa nhiều loại option
khác nhau quy định các thông tin về rule và khác detect option như sid (snort
identifier), message…Khi rule được phân tích snort sẽ tiến hành xây dựng tất cả các
rule theo dạng cây. Phần header của rule dùng để tạo thành rule tree node (RTN) và
phần option sẽ tạo thành option tree node (OTN). Một phần của OTN sẽ bao gồm
các dection option. Tất cả các OTN tương ứng với một header sẽ được nhóm lại
dưới cùng một RTN.
2. Xử lý gói tin trong snort
Snort bắt đầu với việc tiếp nhận gói tin. Sau khi gói tin được snort tiếp nhận, các gói
tin lúc này được chuyển vào packet decoder.
không thay đổi hoặc có thể bị thay đổi, reject gói tin hoặc drop gói tin mà không cần
phản hồi lại. Việc xử lý gói tin của snort khi chạy ở chế độ inline sẽ thực hiện phụ
thuộc vào cờ được gán trong lúc snort xử lý gói tin. Người dùng có thể xem chi tiết
phương thức xử lý của snort inline trong file inline.c
Snort chỉ có thể có thể xử lý một gói tin tại một thời điểm. Mặc dù pcap và API của
inline đều có thể buffer các gói tin, nếu snort tốn quá nhiều thời gian để xử lý gói tin
trong buffer thì các gói tin này sẽ bị drop. Khi gói tin bị drop snort sẽ không có đủ
thong tin cần thiết để có thể phát hiện hành động tấn công mặc dù ở chế độ inline
drop gói tin thì đồng nghĩa với việc hành động tấn công cũng bị drop theo. Ngoài ra
việc này còn làm cho việc kết nối trong mạng gặp vấn đề và giảm khả năng hoạt
động của mạng, đồng thời làm cho preprocessors (frag3, stream4, stream5…)vì các
preprocessor này hoạt động dựa trên thông tin thu thập từ nhiều gói tin khác có liên
quan với nhau. Và nếu một hay nhiều gói tin bị drop snort sẽ tiếp tục chờ những gói
tin bị mất và thiếu, do đó các gói tin tiếp theo sẽ được đưa vào hang đợi. Trong quá
trình chờ đợi như vậy snort sẽ tiêu thụ nhiều bộ nhớ và CPU của hệ thống.
2.2 Giải mã gói tin
Sau khi snort có được gói tin, gói tin được chuyển qua cho các decoder ở lớp trên và
việc gói tin được chuyển cho decoder nào sẽ dựa vào loại link layer của gói tin đó.
Snort hỗ trợ các loại linklayer sau: Ethernet, 802.11, Token Ring, FDDI, Cisco
HDLC, SLIP, PPP và OpenBSD’s PF. Đồng thời snort hỗ trợ nhiều protocol sau
đây: IP, Internet Control Message Protocol (ICMP),TCP, and User Datagram
Protocol (UDP). Người dùng có thể xem về các decoder trong file decode.c.
Sau khi một link layer đã được xác định và decoder đã được chọn, các con trỏ sẽ
được dùng để trỏ đến các phần khác nhau của gói tin. Dựa vào thông tin decode
được, nó sẽ gọi tiếp các decoder cho những lớp tiếp theo cho đến khi nào không còn
decoder nào được gọi nữa. Trong khi decode snort sẽ kiểm tra tính sự hợp lệ của gói
tin tại mỗi lớp và sẽ xếp các sự kiện nếu phát hiện một gói tin nào đó bất thường.
Quá trình giải mã một gói tin
Trong sơ đồ trên mô phỏng gói tin được đưa vào decoder dành cho ethernet, hàm
DecodeEthPkt được dùng. Sau khi decode gói tin, thông tin về source và destination
snort dùng fast pattern matcher, fast pattern matcher xác định một tập hợp các OTN
và OTN nào sẽ được đánh giá. Sau đó snort kiểm tra từng OTN và xắp xếp thành
một hằng đợi gồm các OTN đã khớp với nội dung trong gói tin.
3.1 Ghi log và cảnh báo
Sau khi tất cả các preprocessor toàn tất công việc của chúng và gói tin lúc này đã
được đánh giá bởi tập các rule thông qua detection engine. Snort bắt đầu công việc
ghi lại log và đưa ra cảnh báo.
Snort không đưa ra cảnh báo ngay lập tức khi gói tin khớp với rule đầu tiên trong
tập rule mà sẽ ghi lại sự kiện và cảnh báo đó vào một hàng đợi, sau khi gói tin được
so sánh hết trong tập rule, snort sẽ đánh giá xem cảnh báo nào sẽ được đưa ra.
3.2 Hàng đợi các sự kiện cảnh báo
Event queue cung cấp 2 chức năng sau:
• Khả năng điều khiển các rule, rule nào sẽ được chọn nếu có nhiều rule khớp
với nội dung trong gói tin
• Khả năng đưa ra nhiều cảnh báo trên cùng một rule
Ở những phiên bản trước của snort, snort đưa ra cảnh báo ngay từ rule đầu tiên và
những rule nào có độ ưu tiên thấp sẽ bị bỏ qua. Người dùng có thể sắp xếp thứ tự
các rule sẽ được đánh giá, nhưng điều này phức tạp và đòi hỏi phải xây dựng rule
lại từ đầu. Với event queue thay vì cảnh báo ngay từ rule đầu tiên (hoặc decoder và
preprocessor có thể đưa ra cảnh báo) lúc này các sự kiện sẽ được xếp vào một hàng
đợi. Sau khi hàng đợi đã đầy hoặc khi snort đã hoàn thành việc xử lý hết tất cả các
rule. Nó sẽ kiểm tra event queue và quyết định những cảnh báo nào sẽ được đưa ra.
Người dùng có thể cấu hình trong snort để xắp xếp thứ tự cảnh báo theo rule nào
khớp nhiều nhất với gói tin hoặc theo thứ tự ưu tiên của các rule. Nếu người dùng
cấu hình snort đưa ra nhiều cảnh báo trên cùng một gói tin thì lúc này snort sẽ tiến
hành kiểm tra hết hàng đợi hoặc cho đến khi nó đưa ra hết số lượng cảnh báo tối đa
cho phép. Theo mặc định snort sẽ đưa ra cảnh báo theo rule nào khớp nhiều nhất
với tin và đưa ra 3 cảnh báo cho một gói tin. Người dùng có thể thay đổi giá trị
event_queue option trong file snort.conf.
3.3 Ngưỡng đưa ra cảnh báo
hiệu hóa rule.
Ví dụ: bằng cách cấu hình thông qua file snort.conf người dùng có thể ngăn không
cho snort đưa ra cảnh báo khi có hành động xảy ra nếu destination ip là 10.1.1.1.
suppress gen_id 1, sig_id 1852, track by_dst, ip 10.1.1.1
4. Khảo sát Detection Engine
Hầu hết khả năng nhận dạng và phòng chống tấn công của snort được xây dựng bên
trong rule và tạo thành detection engine. Hầu hết công việc của detection engine
thực hiện là cảnh báo nào sẽ được đưa ra cho những gói tin vi phạm.
Rule option là thành phần chủ yếu được dùng cho việc đánh giá gói tin và phát hiện
xâm nhập. Một số rule option có cấu trúc phức tạp và có vai trò quan trọng trong
detection engine như content, bytetest, bytejump, PCRE hay flowbits rule options.
4.1 Bộ phận nhận dạng - pattern matcher
Trong các phiên bản trước của snort, snort đánh giá gói tin bằng cách so sánh trực
tiếp với rule tree cho đến khi tìm thấy rule được khớp hoặc tất cả các rule được
được kiểm tra hết. Đây là một cách dễ dàng triển khai và dễ hiểu. Tuy nhiên trong
một mạng có lượng traffic lớn và có tốc độ cao thì cần có một phương pháp kiểm
tra nhanh hơn.
Được phát triển của Marc Norton, một kỹ sư phần mềm của công ty Sourcefire,
pattern matcher là thành phần cốt lõi cho dectection engine ngày nay.
4.2 Xây dựng pattern matcher
Việc xây dựng pattern matcher bắt đầu mỗi rule tree, mục đích chính của rule tree là
giảm số lượng rule cần được kiểm tra với gói tin, bằng cách giảm số lượng rule thì
sẽ giảm được thời gian tìm kiếm trên rule đối với một gói tin. Điều này sẽ làm giảm
thời gian snort xử lý gói tin và tăng khả năng hoạt động trên những mạng có tốc độ
cao.
Pattern matcher bắt đầu bằng việc nhóm các rule lại với nhau dựa trên destination
port của rule. Sau đó với mỗi destination port, snort xác định trường content string
dài nhất trong content option của rule. Khi snort hoàn tất việc tập hợp content string,
snort bắt đầu biên dịch pattern mather thông qua nhiều thuật toán khác nhau. Khi
một gói tin đi vào pattern matcher, một nhóm các pattern sẽ được chọn dựa vào
4.3 Dynamic detection engine
Share object rule hay còn gọi là dynamic detection engine cung cấp 2 chức năng
chính cho người dùng. Thứ nhất share object rule cung cấp chức năng phát hiện nó
có ý nghĩa quan trọng và phức tạp hơn nhũng rule bình thường. Share Object Rule
cho phép snort cập nhật hành động tấn công một cách nhanh chóng. Thứ hai, shared
object rule cho phép triển khai một loại rule được gọi tên là “black box” rule. Vì
rule này được biên dịch bên trong một share object nên nó cho phép che dấu nội
dung của rule khỏi những người quản trị các sensor.
Để sử dụng dược các dynamic detection engine và share rule người dùng cần thêm
lệnh –enable-dynamicplugin khi biên dịch. Khi đó khi chạy lệnh make install snort
sẽ cài vào các share object module và xây dựng các share object rule. Thêm vào đó
người dùng phải cấu hình snort để load các engine và những module rule cần thiết.
• --dynamic-engine-lib <file> : load một dynamic engine từ một file chỉ định
• --dynamic-detection-lib <file> : load dynamic rule từ một file
• --dynamic-detection-lib-dir <path>: load dynamic rule từ tất cả các rule
trong một thư mục
Mỗi option trên tương đương với việc cấu hình trong file snort.conf như sau:
• dynamicengine <file> : load một dynamic engine từ một file chỉ định
• dynamicdetection file <file> : load dynamic rule từ một file
• dynamicdetection directory <path> : load dynamic rule từ tất cả các rule
trong một thư mục
5. Snort Inline Mode
5.1 Các mode chính của snort
• Sniffer mode: ở mode này snort chỉ log lại gói tin và in ra màn hình
• Packet Logger mode: ở mode này snort chỉ log lại gói tin và ghi vào hệ thống
đĩa
• Network Intrusion Detection System (NIDS) mode: đây là mode phức tạp
nhất của snort, ở mode này snort phân tích traffic trong mạng, từ đó phát
hiện được những hành động thâm nhập hoặc tấn công trong mạng.
• Inline mode :trong mode này snort sẽ tiếp nhận gói tin từ iptables thay vì từ
Preprocessor là một đoạn code được biên dịch vào snort engine nhằm xây dựng lại
packet, traffic flow và kiểm tra traffic trong mạng để phát hiện tấn công và đưa ra cảnh
báo.
Protocol Decoder
Traffic đầu tiên phải đi vào decoder, để decode các
thông tin ban đầu.
IP Defragmentation
(frag3)
frag3 là preprocessor để xây dựng lại gói tin từ những
gói tin đã bị phân mảnh trong quá trình truyền.
Stateful Inspection
(stream5)
stream5 sau đó sẽ kiểm tra xem gói tin đó có phải là
một phần của session hay không.
Stream Reasesembly
(Stream5)
stream5 tiến hành xây dựng lại thành 1 TCP stream từ
những thông tin nó thu được.
Application
Layer Preprocessor
Những preprocessor này được dùng để xây dựng lại
những gói tin những protocol thông thường và thậm
chí có thể đưa ra cảnh báo nếu cần.
Detection Engine
Sau cùng gói tin sẽ được chuyển cho detection engine
để tiến hành đánh giá dựa vào các rule.
1 Preprocessor frag3
Preprocessor frag3 được phát triển nhằm thay thế cho frag2,frag3 có tốc độ xử lý
nhanh hơn frag2, quản lý data phức tạp hơn frag2 và chống những thủ thật nhằm
vượt qua frag2.
IRIX64 6.4 BSD
Linux 2.2.10 Linux
Linux 2.2.14-5.0 Linux
Linux 2.2.16-3 Linux
Linux 2.2.19-6.2.10smp Linux
Linux 2.4.7-10 Linux
Linux 2.4.9-31SGI 1.0.2smp Linux
Linux 2.4 (RedHat 7.1-7.3) Linux
MacOS (version unknown) First
NCD Thin Clients BSD
OpenBSD (version unknown) Linux
OpenBSD (version unknown) Linux
OpenVMS 7.1 BSD
OS/2 (version unknown) BSD
OSF1 V3.0 BSD
OSF1 V3.2 BSD
OSF1 V4.0,5.0,5.1 BSD
SunOS 4.1.4 BSD
SunOS 5.5.1,5.6,5.7,5.8 First
Tru64 Unix V5.0A,V5.1 BSD
Vax/VMS BSD
Windows (95/98/NT4/W2K/XP) First
5.3 Cấu hình frag3
Để frag3 có thể hoạt động thì cần ít cần ít nhất hai preprocessor khác.
frag3_global preprocessor
• max frags <number> : số lượng phân mảnh tối đa mà frag3 có thể theo dõi
mặc định là 8.192.
• memcap <bytes> : Số lượng bộ nhớ lớn nhất là frag3 có thể sử dụng.
• prealloc_frags <number> : bộ nhớ phụ, dùng để cấp phát trước cho các
fragment node
bằng cờ FIN và được hai bên xác nhận bằng cờ ACK. Với UDP một session
được xác định thông qua một chuỗi các gói tin UDP được trao đổi giữa 2 bên
thông qua các port. ICMP sẽ được theo dõi cho mục đích kiểm tra unreachable
và unavailable service của TCP và UDP.
Target-based
Preprocessor stream5 cũng giống như frag3, stream5 đưa ra khái niệm target-
based để xử lý hiện tượng dữ liệu trùng lắp giữa những gói tin và những giao
dịch TCP bất thường. Phương pháp dùng để xử lý trùng lắp dữ liệu, TCP
Timestamps, Data on SYN, FIN và khởi tạo lại sequence numbers…và policy hỗ
trợ bởi stream5 là kết quả của việc mở rộng nghiên cứu trên nhiều hệ điều hành
khác nhau để có từng policy cụ thể cho từng hệ đều hành.
Stream API
Preprocessor stream5 hỗ trợ stream API, cho phép các bộ phận kiểm tra tính
hợp lệ của protocol và preprocessor cấu hình việc tập hợp gói tin theo yêu cầu
của ứng dụng ở lớp của application, xác định session nào nên bỏ qua và cập nhật
thông tin nhận dạng về session như protocol, hướng gói tin…
Nhận dạng sự bất thường
Protocol TCP bất thường, thường là những gói tin SYN nhưng có kèm theo data
hay dữ liệu nằm ngoài TCP windows size…những chức năng này thường được
cấu hình thông qua tùy chọn detect_anomalies của Stream5 TCP preprocessor.
6.2 Cấu hình stream5_global preprocessor
preprocessor stream5_global: \
[track_tcp <yes|no>], [max_tcp <number>], \
[memcap <number bytes>], \
[track_udp <yes|no>], [max_udp <number>], \
[track_icmp <yes|no>], [max_icmp <number>], \
[flush_on_alert], [show_rebuilt_packets], \
[prune_log_max <bytes>], [disabled]
track_tcp <yes|no>: Track session của TCP, mặc định là yes
max_tcp <number>: Số TCP session tối đa có thể track cùng lúc. Mặc định