Thiết lập Suricata làm Hệ thống ngăn chặn xâm nhập (IPS) trên Ubuntu 20.04

 

Giới thiệu

Trong hướng dẫn này, chúng sẽ cấu hình chế độ ngăn chặn xâm nhập (IPS) tích hợp sẵn của Suricata trên Ubuntu 20.04. Theo mặc định, Suricata được định cấu hình để chạy như một hệ thống phát hiện xâm nhập (IDS), hệ thống này chỉ tạo cảnh báo và ghi lại lưu lượng truy cập đáng ngờ. Khi chúng ta bật chế độ IPS, Suricata có thể chủ động loại bỏ lưu lượng mạng đáng ngờ ngoài việc tạo cảnh báo để phân tích thêm.


Trước khi bật chế độ IPS, điều quan trọng là phải kiểm tra xem đã bật chữ ký nào và các hành động mặc định của chúng. Chữ ký được định cấu hình không chính xác hoặc chữ ký quá rộng có thể dẫn đến giảm lưu lượng truy cập hợp pháp vào mạng hoặc thậm chí chặn truy cập vào máy chủ của mình qua SSH và các giao thức quản lý khác.

Trong phần đầu tiên của hướng dẫn này, chúng ta sẽ kiểm tra các chữ ký đã cài đặt và kích hoạt. Khi biết mình muốn sử dụng chữ ký nào trong chế độ IPS, cần chuyển đổi hành động mặc định của chúng để giảm hoặc từ chối lưu lượng truy cập. Với chữ ký chúng ta sẽ nắm được cách gửi lưu lượng mạng qua Suricata bằng cách sử dụng mục tiêu iptables netfilter NFQUEUE , sau đó tạo một số lưu lượng mạng không hợp lệ để đảm bảo rằng Suricata giảm nó như mong đợi.

Điều kiện cần để xây dụng hệ thống IPS

Nếu như chúng ta đang theo dõi bài hướng dẫn cách cài đặt và thiết lập 1 số cấu hình với Suricata thì chúng ta đã có Suricata đang chạy trên máy chủ Ubuntu 20.04.

Nếu như chúng ta vẫn chưa cài đặt Suricata thì chúng ta có thể theo dõi bài hướng dẫn cách cài đặt và thiết lập 1 số cấu hình với Suricata

Ngoài ra chúng ta cần tải ET Open Ruleset bằng cách sử dụng lệnh suricata-update và chữ ký Suricata.

Công cụ jq xử lý dòng lệnh dòng lệnh. Nếu chưa cài đặt từ hướng dẫn trước, chúng ta có thể thực thi lệnh sau:

bash (root)
apt update && apt install jq

Including Custom Signatures

Các hướng dẫn trước chúng ta đã nắm được cách cài đặt và cấu hình Suricata, cũng như cách hiểu Signatures. Nếu chúng ta muốn tạo và bao gồm các quy tắc của riêng mình thì cần chỉnh sửa file /etc/suricata/suricata.yaml của Suricata để bao gồm một đường dẫn tùy chỉnh đến Signatures.

Trước tiên, hãy tìm các IP của máy chủ để có thể sử dụng chúng trong các tùy chỉnh Signatures. Để tìm các IP, chúng ta có thể sử dụng lệnh sau:

bash (root)
ip -brief address show
Kết quả
root@ubuntu20:~# ip -brief address show
lo UNKNOWN 127.0.0.1/8 ::1/128
ens3 UP 103.97.125.151/25 fe80::f816:3eff:fe03:8c7e/64
ens4 UP 10.124.11.22/22 fe80::f816:3eff:feb6:fd18/64

Địa chỉ IP của máy chủ Suricata bao gồm các IP 103.97.125.151/25 và fe80::f816:3eff:fe03:8c7e/64

Bây giờ, tiến hành tạo Signatures để quét lưu lượng SSH đến các cổng không phải SSH và đưa nó vào một file có tên /var/lib/suricata/rules/local.rules. Mở file bằng trình soạn thảo ưa thích của chúng ta:

bash (root)
vi /var/lib/suricata/rules/local.rules

Tiến hành thêm các dòng sau, chỉnh sang IP máy chủ Suricata của bạn.

/var/lib/suricata/rules/local.rules
alert ssh any any -> 103.97.125.151 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000000;)
alert ssh any any -> fe80::f816:3eff:fe03:8c7e/64 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)

Nếu chúng ta không sử dụng IPv6 thì chúng ta có thể bỏ qua việc thêm Signatures đó trong phần này và các quy tắc sau.

Chúng ta có thể tiếp tục thêm Signatures vào file /var/lib/suricata/rules/local.rules này tùy thuộc vào mạng và ứng dụng của chúng ta.

Ví dụ: Nếu chúng ta muốn cảnh báo về lưu lượng HTTP đến các cổng không chuẩn, chúng ta có thể sử dụng các Signatures sau:

/var/lib/suricata/rules/local.rules
alert http any any -> 103.97.125.151 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000002;)
alert http any any -> fe80::f816:3eff:fe03:8c7e/64 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000003;)

Để thêm Signatures kiểm tra lưu lượng TLS vào các cổng không phải là cổng mặc định 443 cho máy chủ web, hãy thêm phần sau:

/var/lib/suricata/rules/local.rules
alert tls any any -> 103.97.125.151 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000004;)
alert tls any any -> fe80::f816:3eff:fe03:8c7e/64 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)

Khi chúng ta hoàn tất việc thêm Signatures, hãy lưu và đóng file. Bây giờ chúng ta đã xác định một số chữ ký tùy chỉnh, hãy chỉnh sửa file cấu hình của Suricata tại /etc/suricata/suricata.yaml bằng trình soạn thảo ưa thích:

bash (root)
vi /etc/suricata/suricata.yaml

Tiến hành thêm dòng sau vào phần rule-files: như sau:

/etc/suricata/suricata.yaml
. . .
rule-files:
- suricata.rules
- local.rules
. . .

Lưu và thoát khỏi file. Đảm bảo xác thực cấu hình của Suricata sau khi thêm các quy tắc.

bash (root)
 suricata -T -c /etc/suricata/suricata.yaml -v

Quá trình kiểm tra có thể mất một chút thời gian tùy thuộc vào số lượng quy tắc đã tải trong file suricata.rules mặc định.

Cấu hình Signature Actions

Ở trên chúng ta đã thử nghiệm tùy chỉnh Signature và hoạt động với Suricata, chúng ta có thể thay đổi hành động thành drop hoặc reject. Khi Suricata đang hoạt động ở chế độ IPS, những hành động này sẽ chủ động chặn lưu lượng truy cập không hợp lệ cho bất kỳ Signature phù hợp nào.

Việc lựa chọn sử dụng hành động drop hoặc reject là tùy thuộc vào mỗi chúng ta. Hành động drop lập tức loại bỏ một gói và bất kỳ gói nào tiếp theo thuộc luồng mạng. Hành động reject sẽ gửi cho cả máy khách và máy chủ một gói đặt lại nếu lưu lượng dựa trên TCP và một gói lỗi ICMP cho bất kỳ giao thức nào khác.

Sử dụng các tùy chỉnh từ phần trên và chuyển đổi chúng để sử dụng drop, vì lưu lượng mà chúng phù hợp có thể là quá trình quét mạng hoặc một số kết nối không hợp lệ khác.

Mở file /var/lib/suricata/rules/local.rules của bằng trình chỉnh sửa ưa thích và tuỳ chỉnh như sau:

/var/lib/suricata/rules/local.rules
drop ssh any any -> 103.97.125.151 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000000;)
drop ssh any any -> fe80::f816:3eff:fe03:8c7e/64 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)

Lưu ý: Nếu chúng ta đã chạy suricata-update chúng ta có thể có hơn 30.000 chữ ký được bao gồm trong của bạn suricata.rules file.

Sau khi chúng ta thu thập được một vài ngày hoặc vài tuần các cảnh báo, có thể phân tích chúng và chọn các chữ ký có liên quan để chuyển đổi sang drop hoặc reject dựa trên các cảnh báo đó sid.

Khi chúng ta đã định cấu hình tất cả các Signature với hành động mà chúng ta muốn họ thực hiện, bước tiếp theo là định cấu hình lại và sau đó khởi động lại Suricata ở chế độ IPS.

Mở chế độ nfqueue

Suricata chạy ở chế độ IDS theo mặc định, có nghĩa là sẽ không chủ động chặn lưu lượng mạng. Để chuyển sang chế độ IPS, chúng ta cần chỉnh sửa file /etc/default/suricata cấu hình của Suricata.

Mở tệp bằng trình soạn thảo ưa thích của bạn:

bash (root)
vi /etc/default/suricata

Tìm LISTENMODE=af-packet và nhận xét nó bằng cách thêm # vào dòng này. Sau đó, thêm một dòng dòng mới LISTENMODE=nfqueue cho biết Suricata chạy ở chế độ IPS.

Tệp của bạn phải có các dòng được đánh dấu sau khi bạn chỉnh sửa xong:

/etc/default/suricata
. . .
# LISTENMODE=af-packet
LISTENMODE=nfqueue
. . .

Lưu và đóng tập tin. Bây giờ chúng ta khởi động lại Suricata bằng cách sau:

bash (root)
systemctl restart suricata.service

Kiểm tra trạng thái của Suricata:

bash (root)
systemctl status suricata.service

Đầu ra như sau:

Kết quả
● suricata.service - LSB: Next Generation IDS/IPS
Loaded: loaded (/etc/init.d/suricata; generated)
Active: active (running) since Sun 2022-03-20 13:52:34 +07; 1min 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 215619 ExecStart=/etc/init.d/suricata start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 4621)
Memory: 363.6M
CGroup: /system.slice/suricata.service
└─215639 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid >

Mar 20 13:52:34 ubuntu20 systemd[1]: Starting LSB: Next Generation IDS/IPS... Mar 20 13:52:34 ubuntu20 suricata[215619]: Starting suricata in IPS (nfqueue) mode... done.
Mar 20 13:52:34 ubuntu20 systemd[1]: Started LSB: Next Generation IDS/IPS.

Với thay đổi này, bây giờ chúng ta đã sẵn sàng để gửi lưu lượng truy cập đến Suricata bằng cách sử dụng tường lửa UFW trong bước tiếp theo.

Cấu hình UFW để gửi lưu lượng đến Suricata

Chúng ta đã cấu hình Suricata để xử lý lưu lượng ở chế độ IPS, bước tiếp theo là chuyển hướng các gói đến Suricata.

Để thêm các quy tắc bắt buộc cho Suricata vào UFW, chúng ta sẽ cần phải chỉnh sửa file /etc/ufw/before.rules

bash (root)
vi /etc/ufw/before.rules

Thêm các dòng sau:

/etc/ufw/before.rules
...
## Start Suricata NFQUEUE rules
-I INPUT 1 -p tcp --dport 22 -j NFQUEUE --queue-bypass
-I OUTPUT 1 -p tcp --sport 22 -j NFQUEUE --queue-bypass
-I FORWARD -j NFQUEUE
-I INPUT 2 -j NFQUEUE
-I OUTPUT 2 -j NFQUEUE
## End Suricata NFQUEUE rules
...

Lưu và thoát khỏi tệp khi bạn chỉnh sửa xong.

Khởi động lại UFW để tải các quy tắc mới:

bash (root)
systemctl restart ufw.service

Kiểm tra lưu lượng truy cập không hợp lệ

Chúng ta đã thiết Suricata và tường lửa được định cấu hình để xử lý lưu lượng mạng, chúng ta có thể kiểm tra xem Suricata có thả các gói phù hợp với signatures tùy chỉnh và các signatures đi kèm khác.

Nhớ lại signatures sid:2100498 từ hướng dẫn trước, được sửa đổi trong ví dụ này để drop phù hợp với các gói:

Tìm và chỉnh sửa quy tắc trong file /var/lib/suricata/rules/suricata.rulessang drop.

/var/lib/suricata/rules/suricata.rules
drop ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

Gửi tín hiệu cho SIGUSR2 để tải lại signatures:

bash (root)
kill -usr2 $(pidof suricata)

Bây giờ chúng ta kiểm tra quy tắc bằng cách sử dụng lệnh curl:

bash (root)
curl --max-time 5 http://testmynids.org/uid/index.html

Nhận được lỗi cho biết rằng yêu cầu đã hết thời gian chờ, điều này cho thấy Suricata đã chặn phản hồi HTTP:

Kết quả
curl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received

Chúng ta có thể xác nhận rằng Suricata đã bỏ phản hồi HTTP bằng cách kiểm tra file eve.log:

bash (root)
jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json

Kết quả như sau:

Kết quả
{
"alert": {
"action": "blocked",
"gid": 1,
"signature_id": 2100498,
"rev": 7,
"signature": "GPL ATTACK_RESPONSE id check returned root",
"category": "Unknown Classtype",
"severity": 3,
"metadata": {
"created_at": [
"2010_09_23"
],
"updated_at": [
"2010_09_23"
]
}
}

Dòng được đánh dấu "action": "blocked"xác nhận rằng signatures khớp và Suricata đã bỏ hoặc từ chối yêu cầu HTTP.

Đăng nhận xét

0 Nhận xét

Liên hệ