Xây dựng Snort 3 NIDS trên Ubuntu: Hướng dẫn thực hành phân tích lưu lượng mạng

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Vượt ra ngoài Firewall: Tại sao việc kiểm tra gói tin lại quan trọng

Một quan niệm sai lầm phổ biến trong giới IT là chỉ cần một firewall vững chắc là đủ để bảo mật máy chủ. Tôi cũng từng tin như vậy cho đến khi quản lý một máy chủ web công khai ghi nhận hơn 4.500 lần thử đăng nhập SSH thất bại chỉ trong vòng hai giờ. Ngay cả khi đã sử dụng xác thực bằng key, khối lượng tiếng ồn lớn như vậy vẫn là một hồi chuông cảnh tỉnh. Khi đó, tôi nhận ra rằng firewall chỉ giống như một cánh cửa đã khóa. Để thực sự biết ai đang cố vặn tay nắm cửa và họ đang dùng công cụ gì, bạn cần một thám tử ở bên trong.

Các firewall tiêu chuẩn như UFW hay IPTables hoạt động ở cấp độ kết nối. Chúng chặn hoặc cho phép lưu lượng dựa trên địa chỉ IP và cổng, nhưng không thể nhìn thấy nội dung (payload) độc hại ẩn bên trong gói tin. Đây là lúc Snort 3—một Hệ thống Phát hiện Xâm nhập Mạng (NIDS)—trở nên thiết yếu. Nó hoạt động như một máy phân tích tốc độ cao, so sánh lưu lượng trực tiếp với một thư viện các dấu hiệu tấn công đã biết để bắt được những mối đe dọa mà firewall bỏ sót.

Snort 3: Một công cụ bảo mật hiện đại

Snort 3, thường được gọi là Snort++, là một bản viết lại hoàn toàn từ đầu của phiên bản Snort 2 kinh điển. Khác với phiên bản tiền nhiệm, phiên bản này hỗ trợ đa luồng (multi-threaded). Kiến trúc này cho phép nó mở rộng quy mô trên các CPU đa nhân hiện đại, giúp giám sát các đường truyền 1Gbps+ mà không bị rơi gói tin. Nó cũng thay thế các tệp cấu hình cũ kỹ, cứng nhắc bằng hệ thống dựa trên Lua linh hoạt.

NIDS vs. IPS: Lựa chọn chiến lược của bạn

Trước khi bắt đầu cài đặt, bạn phải quyết định cách Snort sẽ tương tác với mạng của mình:

  • NIDS (Phát hiện): Snort giám sát một bản sao lưu lượng mạng của bạn. Nó gửi cảnh báo khi phát hiện mối đe dọa nhưng không can thiệp vào luồng dữ liệu. Đây là cách an toàn nhất để bắt đầu.
  • IPS (Ngăn chặn): Snort nằm trực tiếp trên đường truyền dữ liệu. Nếu phát hiện một dấu hiệu như tấn công SQL injection, nó sẽ hủy gói tin ngay lập tức.

Chúng ta sẽ tập trung vào chế độ NIDS cho thiết lập này. Nó giúp ngăn chặn tình trạng vô tình tự làm gián đoạn dịch vụ do các quy tắc (rules) quá cứng nhắc gây ra.

Các bước triển khai chi tiết

1. Chuẩn bị môi trường

Biên dịch Snort 3 từ mã nguồn là cách tốt nhất để đảm bảo bạn có các tối ưu hóa hiệu suất mới nhất. Mặc dù mất nhiều thời gian hơn một lệnh apt install đơn giản, nhưng nó cho phép bạn kích hoạt các tính năng như Hyperscan để khớp mẫu nhanh hơn. Hãy bắt đầu bằng cách cài đặt các công cụ xây dựng và phụ thuộc cần thiết.

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential autotools-dev libdumbnet-dev libluajit-5.1-dev \
libpcap-dev zlib1g-dev libpcre3-dev libhwloc-dev cmake libssl-dev \
pkg-config liblzma-dev python3-pip uuid-dev libunwind-dev libhyperscan-dev flex bison

2. Cài đặt LibDAQ

Thư viện Thu thập Dữ liệu (DAQ) đóng vai trò là cầu nối giữa Snort và card mạng của bạn. Snort 3 yêu cầu phiên bản DAQ hiện đại để xử lý lưu lượng đa luồng.

mkdir ~/snort_src && cd ~/snort_src
git clone https://github.com/snort3/libdaq.git
cd libdaq
./bootstrap
./configure
make
sudo make install
sudo ldconfig

3. Biên dịch Snort 3 với các tùy chỉnh hiệu suất

Bây giờ là phần cài đặt cốt lõi. Chúng ta sẽ kích hoạt tcmalloc, một bộ cấp phát bộ nhớ có thể cải thiện hiệu suất của Snort từ 10-15% khi tải nặng.

cd ~/snort_src
git clone https://github.com/snort3/snort3.git
cd snort3
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
cd build
make -j$(nproc)
sudo make install

Xác nhận tệp thực thi đang hoạt động bằng cách chạy:

/usr/local/bin/snort -V

4. Kích hoạt Chế độ Promiscuous

Các giao diện mạng tiêu chuẩn chỉ xử lý các gói tin được gửi đích danh cho chúng. Để kiểm tra tất cả lưu lượng trên đường truyền, bạn phải đưa giao diện của mình vào chế độ promiscuous. Thay thế eth0 bằng tên giao diện cụ thể của bạn.

sudo ip link set dev eth0 promisc on

Lưu ý rằng thiết lập này sẽ bị mất sau khi khởi động lại. Đối với môi trường thực tế, bạn nên tự động hóa việc này thông qua một dịch vụ systemd hoặc cấu hình netplan.

5. Tạo quy tắc phát hiện đầu tiên

Logic phát hiện trong Snort được định nghĩa bởi các rule. Chúng ta sẽ tạo một tệp rule cục bộ để kiểm tra công cụ của mình. Quy tắc đơn giản này sẽ kích hoạt cảnh báo bất cứ khi nào có yêu cầu ICMP Echo (lệnh ping) gửi đến máy chủ.

sudo mkdir -p /usr/local/etc/rules
sudo nano /usr/local/etc/rules/local.rules

Thêm dòng này vào tệp:

alert icmp any any -> any any (msg:"Phát hiện ICMP Ping"; sid:1000001; rev:1;)

Quy tắc cụ thể này được phân tích như sau:

  • alert: Hành động Snort thực hiện khi các tiêu chí được đáp ứng.
  • icmp: Giao thức cần kiểm tra.
  • any any -> any any: Bao gồm bất kỳ IP nguồn và cổng nào di chuyển đến bất kỳ đích nào.
  • sid: ID của Snort. Các rule tùy chỉnh phải sử dụng ID trên 1.000.000 để tránh xung đột với các bộ rule chính thức.

6. Tích hợp Rule vào cấu hình Lua

Sau khi tạo rule, chúng ta phải chỉ cho Snort biết nơi tìm thấy nó. Mở tệp cấu hình chính, được viết bằng cú pháp Lua.

sudo nano /usr/local/etc/snort/snort.lua

Tìm bảng ips và thêm đường dẫn tệp mới của bạn:

ips =
{
    include = '/usr/local/etc/rules/local.rules'
}

7. Kiểm tra công cụ phát hiện

Chạy Snort ở chế độ foreground bằng plugin đầu ra alert_fast. Plugin này sẽ hiển thị cảnh báo trực tiếp trên terminal của bạn theo thời gian thực.

sudo snort -c /usr/local/etc/snort/snort.lua -i eth0 -A alert_fast

Từ một máy tính khác, hãy ping đến máy chủ Snort của bạn. Terminal của bạn sẽ ngay lập tức xuất hiện các cảnh báo như sau:

11/15-09:10:45.654321 [**] [1:1000001:1] "Phát hiện ICMP Ping" [**] [Priority: 0] {ICMP} 192.168.1.15 -> 192.168.1.100

Phát hiện các cuộc khai thác thực tế

Khi các lệnh ping cơ bản đã được phát hiện, bạn có thể viết các rule cho những mối đe dọa thực tế. Ví dụ, để bắt một kẻ tấn công đang cố đọc tệp mật khẩu hệ thống của bạn qua trình duyệt web, hãy sử dụng rule này:

alert tcp any any -> any 80 (msg:"Có khả năng tấn công Directory Traversal"; content:"/etc/passwd"; nocase; sid:1000002;)

Quy tắc này quét payload dữ liệu của mọi yêu cầu HTTP để tìm chuỗi “/etc/passwd”. Mức độ hiển thị chi tiết này chính là lý do tại sao Snort là công cụ không thể thiếu trong các Trung tâm Điều hành An ninh (SOC).

Các bước tiếp theo

Việc vận hành một NIDS mang lại cho bạn cái nhìn chi tiết về sức khỏe mạng mà một firewall đơn thuần không thể cung cấp. Bạn đã biên dịch thành công một công cụ hiệu suất cao và triển khai logic phát hiện tùy chỉnh.

Để tiến tới một thiết lập chuẩn sản xuất, nhiệm vụ tiếp theo của bạn là chạy Snort như một dịch vụ chạy ngầm và chuyển các cảnh báo này vào một công cụ trực quan hóa như Grafana hoặc ELK stack. Bảo mật là một chu kỳ quan sát và tinh chỉnh liên tục. Bằng cách giám sát lưu lượng mạng, bạn sẽ luôn đi trước một bước so với những bất thường có thể dẫn đến vi phạm dữ liệu.

Share: