Phát hiện xâm nhập mạng với Suricata

Hệ thống phát hiện xâm nhập, hay IDS, là phần mềm hoặc máy chủ độc lập giám sát mạng và/hoặc điểm cuối để phát hiện các mối đe dọa, xâm nhập hoặc bất kỳ hoạt động độc hại nào khác. Các giải pháp IDS có thể được chia thành hai loại chính: Network-based (NIDS) hoặc Host-based (HIDS). Sự khác biệt chính giữa hai là vị trí.
Suricata 00 1024x654
Host-based IDS : HIDS là phần mềm được cài đặt trên một điểm cuối duy nhất giám sát các chức năng bên trong của hệ thống như dịch vụ/daemon, quy trình, hệ thống tệp, sổ đăng ký, cấu hình và đôi khi là lưu lượng mạng của hệ thống đó. Một ví dụ tuyệt vời về HIDS là một giải pháp như Wazuh, một hệ thống Phát hiện và Phản hồi Điểm cuối (EDR) mã nguồn mở. Wazuh sử dụng các tác nhân, là các dịch vụ nhẹ do một máy chủ khác kiểm soát, để giám sát các điểm cuối về hành vi nội bộ độc hại và báo cáo lại cho máy chủ quản lý trung tâm. Các tác nhân Wazuh cũng có thể thực hiện kiểm tra tính toàn vẹn của tệp, phát hiện lỗ hổng, phát hiện rootkit, giám sát vi phạm chính sách và nhiều chức năng khác. Tôi đã đi sâu về chức năng của Wazuh trong bài đăng cuối cùng của mình. Các giải pháp HIDS rất tuyệt vời để phát hiện các xâm nhập đã có trên các thiết bị đầu cuối. Nhược điểm của các giải pháp Host-Based IDS là chúng không nhìn thấy những gì đang diễn ra ở phía bên kia của card mạng. Đó là nơi NIDS phát huy tác dụng.
Network-based IDS: Các giải pháp NIDS là các máy chủ hoặc một tập hợp các máy chủ được đặt một cách chiến lược trên toàn mạng để giám sát lưu lượng và phát hiện các mối đe dọa. Một NIDS hoạt động bằng cách nhận một bản sao của tất cả lưu lượng truy cập mạng, thông qua một cổng mirror (cổng SPAN) hoặc một lần chạm mạng và quyết định bỏ qua hoặc cảnh báo về lưu lượng truy cập dựa trên một bộ quy tắc được định cấu hình trước. Các quy tắc này thường được đánh số hàng nghìn. Hệ thống phát hiện xâm nhập dựa trên mạng cho phép Nhà phân tích bảo mật có thêm thông tin chi tiết về các tác nhân đe dọa bằng cách kiểm tra lưu lượng mạng của các điểm cuối. Khả năng hiển thị như vậy sẽ giúp nhà phân tích phát hiện hoạt động độc hại xảy ra trên mạng, nhưng không thể phát hiện được thông qua tệp nhật ký hoặc tác nhân HIDS. Khi kết hợp khả năng của cả HIDS và NIDS, nhà phân tích sẽ có khả năng hiển thị rộng hơn trên mạng của họ,

Suricata là gì?


Suricata là một giải pháp phát hiện xâm nhập mạng cũng là mã nguồn mở, miễn phí và được phát triển bởi Open Information Security Foundation (OSIF). Trong phần trên, tôi đã nói về phát hiện xâm nhập là gì, nhưng Suricata thực sự có chế độ hoạt động phụ: Ngăn chặn xâm nhập. Cách thức hoạt động của Suricata là nó nhập các gói đã bắt được thông qua một giao diện, sau đó so sánh từng gói với một hoặc nhiều bộ quy tắc được xác định trước. Nếu có sự phù hợp với quy tắc, thì Suricata sẽ thực hiện hành động được xác định trong quy tắc. Một hành động trong quy tắc Suricata có thể là một trong các hành động sau: alert, pass, drop, hoặc reject.

Là một Hệ thống Phát hiện Xâm nhập, Suricata sẽ chỉ thực hiện hai hành động đầu tiên, alert hoặc pass. Điều này đưa chúng ta đến chế độ hoạt động thứ hai mà Suricata có thể được cấu hình. Giải pháp Suricata được định cấu hình là Hệ thống ngăn chặn xâm nhập (IPS) sẽ không chỉ Cảnh báo về hoạt động độc hại mà còn cố gắng chấm dứt kết nối đó bằng cách sử dụng hành động “drop” hoặc “reject”. Hành động 'drop' chỉ đơn giản là bắt đầu loại bỏ các gói phù hợp với quy tắc đó. Hành động 'reject' sẽ gửi lại lỗi ICMP RESET cho người gửi.

Hệ thống ngăn chặn xâm nhập cũng sẽ được định vị khác trên mạng so với IDS thông thường. Vị trí của IPS là 'inline' với tất cả lưu lượng mạng, thường được đặt ngay trước bộ định tuyến cổng. Được định vị “inline” giúp Suricata kiểm soát hoàn toàn tất cả lưu lượng truy cập vào hoặc ra khỏi mạng. Sơ đồ dưới đây minh họa sự khác biệt giữa vị trí IDS và IPS: 
idsvsips 2
Đối với dự án này, tôi đã chọn sử dụng chế độ hoạt động của IDS vì một số lý do. Tôi sẽ sử dụng một bộ quy tắc miễn phí được viết sẵn có tên là “Emerging Threats Ruleset”. Các bộ quy tắc cần phải được điều chỉnh và tinh chỉnh liên tục để loại bỏ bất kỳ yếu tố kích hoạt dương tính giả nào. Kết quả dương tính giả trên IDS sẽ chỉ kích hoạt cảnh báo, nhưng trên IPS, điều này sẽ khiến các kết nối hợp lệ bị chặn, điều mà chúng tôi không muốn. Một lý do khác khiến tôi chọn không thiết lập IPS là vì tôi muốn cài đặt và tích hợp Suricata với máy chủ Wazuh của mình . Phần tiếp theo sẽ đề cập đến cách tôi thiết lập phòng thí nghiệm đó.

 Thiết lập môi trường phòng thí nghiệm - Lab Environment Set-Up

Một NIDS sniffer thường có hai network interface. Một interface dành cho mục đích quản lý, chẳng hạn như kết nối SSH hoặc báo cáo dữ liệu trở lại máy chủ NIDS server. Interface thứ hai được cấu hình ở “promiscuous mode”. Chế độ này cho phép card mạng nhập tất cả lưu lượng mạng được gửi đến nó, bất kể địa chỉ MAC đích cho mỗi khung là gì. Sniffing interface này thường được kết nối với một network tap hoặc một port mirror trên một switch. Network tap là một thiết bị phần cứng được đặt trực tiếp giữa hai thiết bị, sao chép lưu lượng đi qua thiết bị đó và gửi lưu lượng ra giao diện thứ ba (được kết nối với bộ dò tìm NIDS trong trường hợp này). Port mirror làm điều tương tự nhưng được cấu hình trên một switch như một cổng được chỉ định. Lý do hai network interfaces được khuyến nghị là để ngăn các gói bị rớt.

Vì kế hoạch của tôi là tích hợp Suricata với Wazuh, nên tôi đã sử dụng cùng một phòng thí nghiệm từ dự án đó và cài đặt Suricata trên cùng một máy chủ. Phòng thí nghiệm về cơ bản bao gồm
một ESXi Hypervisor : một máy ảo Debian chạy Wazuh + Suricata, một máy ảo Debian chạy Apache, một máy ảo Windows Server 2019 chạy Active Directory và hai máy ảo Windows 10 đã đăng ký với máy chủ Active Directory, Có hai virtual switch riêng biệt để tách lưu lượng thông thường khỏi lưu lượng được nhân bản, Máy ảo Wazuh/Suricata/SIEM cũng được định cấu hình với giao diện mạng phụ thu thập lưu lượng SPAN từ vSwitch thứ hai
một Cisco Switch : có một cổng được chỉ định là cổng SPAN (hoặc Port mirror) Cổng này sao chép tất cả lưu lượng đi qua bộ chuyển mạch và gửi nó đến một card mạng phụ ESXi Hypervisor
máy tính để bàn :  cài một máy ảo KALI Linux
SIEM network 2 1
Cấu trúc liên kết của Phòng thí nghiệm (Mọi thứ có màu xanh lam đang chạy trong ESXi)
vswitch
Lưu lượng thông thường đi qua virtual switch này (vSwitch0)

sniffer
Lưu lượng SPAN đi qua vSwitch1
snifferconfig
Sniffing vSwitch đang ở chế độ Promiscuous

Cài đặt và cấu hình

Để cài đặt Suricata, hãy đăng nhập vào máy Linux của bạn với quyền root và nhập thư mục /root. Bản phân phối Linux của tôi là Debian, vì vậy nếu bạn đang sử dụng thứ gì đó khác, thì bạn có thể phải thực hiện một phương pháp cài đặt khác. Tôi khuyên bạn nên tham khảo tài liệu . Nếu bạn đang sử dụng Debian, các bước này sẽ hoạt động. (Đảm bảo cập nhật kho lưu trữ của bạn trước khi bắt đầu):
apt-get update
Sau khi bạn đã đăng nhập với quyền root và đang ở trong thư mục /root, hãy nhập lệnh:
apt-get install suricata
Nếu bạn đang sử dụng một bản phân phối dựa trên Debian khác, chẳng hạn như Ubuntu, bạn có thể phải cài đặt kho lưu trữ trước:
add-apt-repository ppa:oisf/suricata-stable
apt-get update
apt-get install suricata
Sau khi cài đặt, hãy kiểm tra xem bạn có đang sử dụng đúng phiên bản hay không. Nó phải là 6.0 hoặc cao hơn.
suricata -V
installed
Bước tiếp theo là định cấu hình Suricata, nhưng trước khi bạn có thể làm điều đó, bạn phải biết tên của giao diện mạng mà bạn sẽ nghe. Bạn có thể xem các giao diện mạng của mình bằng lệnh này:
ip a
Khi bạn đã xác định đúng giao diện, bạn có thể phải bật nó lên nếu nó không hoạt động. Sau đó, bạn cần kích hoạt chế độ lăng nhăng:
ip link set dev [interface_name] up
ip link set [interface_name] promisc on
Sau đó nhập lại 'ip a' để xác nhận rằng nó đang hoạt động ở promiscuous mode.
interfaces
Bây giờ là lúc cấu hình Suricata. Sử dụng vim hoặc trình soạn thảo văn bản yêu thích của bạn, mở tệp “/etc/suricata/suricata.yaml”. (Đảm bảo rằng bạn đã root hoặc chỉ sử dụng sudo)
vim /etc/suricata/suricata.yaml
Tìm kiếm văn bản “HOME_NET” và bạn sẽ có thể tìm thấy phần này:
home net
Bạn cần thay đổi địa chỉ mạng giữa các dấu ngoặc thành bất kể địa chỉ mạng của mạng gia đình bạn là gì. Đảm bảo sử dụng ký hiệu CIDR. tức là: 192.168.1.0/24

Bạn có thể để nguyên “EXTERNEL_NET” hoặc bạn có thể định cấu hình nó thành '!$HOME_NET'. Đặt "!" ở phía trước của một biến dịch thành sai hoặc ngược lại với biến đó. Có nghĩa là “bất kỳ địa chỉ IP nào không có trong “$HOME_NET”.

Phần còn lại của các biến này có thể được giữ nguyên. Nó phụ thuộc vào cách mạng của bạn được thiết lập.

Tiếp theo, bạn muốn tìm kiếm “af-packet”.
af packet
Sau dấu hai chấm có ghi  “- interface:”, hãy nhập tên của sniffing interface. (cái bạn đã xác định ở bước trước)

Bạn cần thực hiện tương tự đối với cấu hình “pcap” và “pfring”:
pcap   
pfring
Tiếp theo, hãy tìm cài đặt cho community_id và thay đổi 'false' thành 'true'. Điều này sẽ cho phép Suricata được sử dụng với các công cụ khác.

Sau khi thực hiện cấu hình cuối cùng đó, bây giờ bạn có thể lưu tệp cấu hình và thoát.

Kiểm tra thiết lập của bạn bằng cách chạy lệnh này:
suricata -T -c /etc/suricata/suricata.yaml -v
Nếu quá trình kiểm tra hoàn tất mà không có bất kỳ thông báo lỗi nào thì bạn đã cấu hình thành công Suricata. Nếu bạn thấy thông báo lỗi, hãy đọc kỹ và cố gắng hiểu ý nghĩa của chúng. Nó có thể là một cấu hình sai. Khi nghi ngờ, hãy tham khảo ( https://suricata.readthedocs.io/en/latest/index.html ).
test
Bây giờ để kích hoạt và bắt đầu Dịch vụ Suricata:
systemctl enable suricata.service
systemctl start suricata.service
Bây giờ hãy kiểm tra trạng thái để đảm bảo rằng nó hoạt động:
status
Khi bạn đã xác nhận rằng Suricata đang chạy mà không gặp sự cố, cuối cùng bạn cũng có thể kiểm tra khả năng phát hiện bằng cách chạy lệnh này trên bất kỳ thiết bị nào có lưu lượng truy cập hiển thị trên mạng tap/SPAN: (curl sẽ hoạt động trên cả máy Windows và Linux)
curl http://testmyids.com

curl
Sau đó in ra nhật ký cảnh báo từ /var/log/suricata/fast.log:
tail /var/log/suricata/fast.log

fastlog 1024x314

Tích hợp Suricata với SIEM của Wazuh

Vì tôi đã cài đặt Suricata và Wazuh trên cùng một máy nên việc thêm nhật ký của Suricata vào SIEM đàn hồi khá đơn giản. Chỉnh sửa tệp cấu hình OSSEC của Wazuh (/var/ossec/etc/ossec.conf) và thêm các dòng sau vào cuối tệp, trước “</ossec_config>”. Hãy chắc chắn rằng khoảng trắng phù hợp.
<localfile>
    <log_format>json</log_format>
    <location>/var/log/suricata/eve.json</location>
</localfile>

Nó sẽ giống như thế này:
add suricata logs
Sau đó, khởi động lại Dịch vụ quản lý Wazuh:
systemctl restart wazuh-manager
Bây giờ khi bạn đăng nhập vào Bảng điều khiển Wazuh của mình, bạn sẽ thấy Cảnh báo Suricata:suricataandwazuh 1024x367

Vô hiệu hóa quy tắc Suricata

top5
Đôi khi, bạn có thể thấy một số cảnh báo này không quan trọng lắm (chẳng hạn như “excessive retransmissions”). Có thể bạn coi nhiều cảnh báo, chẳng hạn như “Observed Discord Domain”, là cảnh báo giả. Hoặc có thể một quy tắc nào đó đang tạo ra quá nhiều cảnh báo không cung cấp bất kỳ giá trị nào. Điều này có thể gây ra một thứ gọi là “Alert Fatigue” cho các Nhà phân tích SOC. Một cách để chống lại sự mệt mỏi của cảnh báo là vô hiệu hóa các quy tắc quá mức này.

Để thực hiện việc này, trước tiên hãy dừng dịch vụ Suricata và tạo một tệp có tên 'disable.conf' trong thư mục '/etc/suricata/'. Sau đó, trên bảng điều khiển Wazuh của bạn (hoặc bất kỳ nền tảng nào bạn xem nhật ký Suricata) và lưu ý id chữ ký (SID) của các quy tắc bạn muốn tắt. Sao chép và dán các sid đó vào tệp disable.conf mà bạn đã tạo. Lưu tệp và sau đó chạy lệnh này:
suricata-update
Điều này sẽ cấu hình lại Suricata và kiểm tra cấu hình mới. Sau khi kết thúc mà không có bất kỳ lỗi nào, bạn có thể bắt đầu lại dịch vụ Suricata và các quy tắc đó sẽ không kích hoạt nữa.

Bạn sẽ thấy mình phải mày mò và điều chỉnh rất nhiều quy tắc khi quản lý một hệ thống phát hiện xâm nhập. Vì vậy, hãy chuẩn bị cho điều đó.

Quét NMAP

Cuối cùng, để kiểm tra giải pháp IDS/SIEM của mình, tôi đã chạy quét NMAP trên toàn bộ mạng. Đây là kết quả:


Suricata có thể phát hiện quá trình quét nmap và tạo ra hơn 300 cảnh báo được kích hoạt bởi các tác nhân người dùng nmap, các gói smb không đúng định dạng và giao thức không khớp.