Mục lục

Không có mục lục

Cách thiết lập cấu hình Suricata làm Hệ thống ngăn chặn xâm nhập (IPS) trên Ubuntu 20.04

Ngày đăng: 10 tháng 11 năm 2022

Ubuntu

Giới thiệu

Trong hướng dẫn này, bạn sẽ học cách thiết lập cấu hình chế độ Hệ thống ngăn chặn xâm nhập (Intrusion Prevention System - IPS) tích hợp của Suricata trên Ubuntu 20.04. Theo mặc định, Suricata được thiết lập cấu hình để chạy như một Hệ thống Phát hiện Xâm nhập (Intrusion Detection System - IDS), hệ thống này chỉ tạo ra các cảnh báo và ghi lại các lưu lượng đáng ngờ. Khi bạn bật chế độ IPS, Suricata có thể chủ động giảm 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ạn đã bật chữ ký nào và các hành động mặc định của chúng. Chữ ký được thiết lập 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 của bạn hoặc thậm chí chặn bạ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, bạn sẽ kiểm tra các chữ ký mà bạn đã cài đặt và kích hoạt. Bạn cũng sẽ học cách bao gồm chữ ký của riêng bạn. Khi bạn biết mình muốn sử dụng chữ ký nào trong chế độ IPS, bạn sẽ chuyển đổi hành động mặc định của chúng để loại bỏ hoặc từ chối lưu lượng truy cập. Với chữ ký của bạn, bạn sẽ học cách gửi lưu lượng mạng qua Suricata bằng cách sử dụng mục tiêu netfilter NFQUEUE iptables, 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

Nếu bạn đang theo dõi loạt bài hướng dẫn này thì bạn đã có Suricata đang chạy trên máy chủ Ubuntu 20.04.

  • Nếu bạn vẫn cần cài đặt Suricata thì bạn có thể làm theo Cách cài đặt Suricata trên Ubuntu 20.04
  • Bạn cũng nên tải xuống ET Open Ruleset bằng lệnh suricata-update và được bao gồm trong chữ ký Suricata của bạn.
  • Công cụ xử lý JSON dòng lệnh jq. Nếu bạn chưa cài đặt nó từ hướng dẫn trước, bạn có thể làm như vậy bằng cách sử dụng lệnh apt:
  1. sudo apt update
  2. sudo apt install jq

Bạn cũng có thể có các chữ ký tùy chỉnh mà bạn muốn sử dụng từ hướng dẫn Hiểu về Chữ ký Suricata trước đó.

Bước 1: Bao gồm chữ ký tùy chỉnh

Các hướng dẫn trước trong loạt bài này đã khám phá cách cài đặt và cấu hình Suricata, cũng như cách hiểu chữ ký. Nếu bạn muốn tạo và bao gồm các quy tắc của riêng mình thì bạn cần chỉnh sửa tệp /etc/suricata/suricata.yaml của Suricata để bao gồm một đường dẫn tùy chỉnh đến chữ ký của bạn.

Trước tiên, hãy tìm IP công khai của máy chủ của bạn để bạn có thể sử dụng chúng trong chữ ký tùy chỉnh của mình. Để tìm các IP của bạn, bạn có thể sử dụng lệnh ip:

  1. ip -brief address show

Bạn sẽ nhận được đầu ra như sau:

Output
lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 203.0.113.5/20 10.20.0.5/16 2001:DB8::1/32 fe80::94ad:d4ff:fef9:cee0/64 eth1 UP 10.137.0.2/16 fe80::44a2:ebff:fe91:5187/64

Các địa chỉ IP công cộng của bạn sẽ giống với các IP 203.0.113.52001:DB8 ::1/32 được đánh dấu trong đầu ra.

Bây giờ, hãy tạo chữ ký tùy chỉnh sau để quét lưu lượng SSH đến các cổng không phải SSH và đưa nó vào tệp có tên /var/lib/suricata/rules/local.rules. Mở tệp bằng nano hoặc trình chỉnh sửa ưa thích của bạn:

  1. sudo nano /var/lib/suricata/rules/local.rules

Sao chép và dán chữ ký sau:

Invalid SSH Traffic Signature
alert ssh any any -> 203.0.113.5 !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 -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)

Thay thế Địa chỉ IP công khai của máy chủ của bạn cho các địa chỉ 203.0.113.52001: DB8 :: 1/32 trong quy tắc. Nếu bạn không sử dụng IPv6 thì bạn có thể bỏ qua việc thêm chữ ký đó vào các quy tắc này và các quy tắc sau.

Bạn có thể tiếp tục thêm chữ ký tùy chỉnh vào tệp local.rules này tùy thuộc vào mạng và ứng dụng của bạn. Ví dụ: nếu bạn muốn cảnh báo về lưu lượng truy cập HTTP đến các cổng không chuẩn, bạn có thể sử dụng các chữ ký sau:

HTTP traffic on non-standard port signature
alert http any any -> 203.0.113.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000002;)
alert http any any -> 2001:DB8::1/32 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000003;)

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

TLS traffic on non-standard port signature
alert tls any any -> 203.0.113.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000004;)
alert tls any any -> 2001:DB8::1/32 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)

Khi bạn hoàn tất việc thêm chữ ký, hãy lưu và đóng tệp. Nếu bạn đang sử dụng nano, bạn có thể làm như vậy bằng CTRL + X, sau đó YENTER để xác nhận. Nếu bạn đang sử dụng vi, hãy nhấn ESC và sau đó :x rồi ENTER để lưu và thoát.

Bây giờ bạn đã xác định một số chữ ký tùy chỉnh, hãy chỉnh sửa tệp cấu hình /etc/suricata/suricata.yaml của Suricata bằng nano hoặc trình chỉnh sửa ưa thích của bạn để bao gồm chúng:

  1. sudo nano /etc/suricata/suricata.yaml

Tìm phần rule-files: của cấu hình. Nếu bạn đang sử dụng nano, hãy sử dụng CTRL + _ và sau đó nhập số dòng 1879. Nếu bạn đang sử dụng vi, hãy nhập 1879gg để chuyển đến dòng. Vị trí chính xác trong tệp của bạn có thể khác, nhưng bạn phải ở đúng khu vực chung của tệp.

Chỉnh sửa phần và thêm dòng được đánh dấu - local.rules sau đây:

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

Lưu và thoát khỏi tệp. Đảm bảo xác thực cấu hình của Suricata sau khi thêm các quy tắc của bạn. Để làm như vậy, hãy chạy lệnh sau:

  1. sudo 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 bạn đã tải trong tệp suricata.rules mặc định. Nếu bạn thấy quá trình kiểm tra mất quá nhiều thời gian, bạn có thể nhận xét dòng - suricata.rules trong cấu hình bằng cách thêm dấu # vào đầu dòng và sau đó chạy lại kiểm tra cấu hình của bạn. Hãy chắc chắn xóa nhận xét # nếu bạn định sử dụng chữ ký suricata.rules trong cấu hình đang chạy cuối cùng của mình.

Khi bạn hài lòng với chữ ký mà bạn đã tạo hoặc đưa vào bằng công cụ suricata-update, bạn có thể tiến hành bước tiếp theo, nơi bạn sẽ chuyển hành động mặc định cho chữ ký của mình từ alert hoặc log sang chủ động giảm lưu lượng truy cập.

Bước 2: Thiết lập cấu hình hành động chữ ký

Bây giờ bạn đã thử nghiệm chữ ký tùy chỉnh và hoạt động với Suricata, bạn có thể thay đổi hành động để 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ỳ chữ ký phù hợp nào.

Hai thao tác này được mô tả trong phần hướng dẫn trước của loạt bài này, Hiểu về Chữ ký Suricata. Việc lựa chọn hành động nào để sử dụng là tùy thuộc vào bạn. Một hành động drop sẽ ngay 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 (network flow). Hành động từ chối 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.

Hãy sử dụng các quy tắc tùy chỉnh từ phần trước và chuyển đổi chúng để sử dụng hành độ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ở tệp /var/lib/suricata/rules/local.rules bằng nano hoặc trình chỉnh sửa ưa thích của bạn và thay đổi hành động alert ở đầu mỗi dòng trong tệp để drop:

  1. sudo nano /var/lib/suricata/rules/local.rules
/var/lib/suricata/rules/local.rules
drop ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
drop ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)
. . .

Lặp lại bước trên cho bất kỳ chữ ký nào trong /var/lib/suricata/rules/suricata.rules mà bạn muốn chuyển đổi sang chế độ drop hoặc reject.

Lưu ý: Nếu bạn chạy suricata-update trong hướng dẫn điều kiện, bạn có thể có hơn 30.000 chữ ký được bao gồm trong tệp suricata.rules của mình.

Nếu bạn chuyển đổi mọi chữ ký để drop hoặc reject, bạn có nguy cơ chặn truy cập hợp pháp vào mạng hoặc máy chủ của mình. Thay vào đó, hãy để các quy tắc trong suricata.rules vào lúc này và thêm chữ ký tùy chỉnh của bạn vào local.rules. Suricata sẽ tiếp tục tạo cảnh báo cho lưu lượng đáng ngờ được mô tả bằng các chữ ký trong suricata.rules khi nó đang chạy ở chế độ IPS.

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

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

Bước 3: Bật chế độ nfqueue

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

Mở tệp bằng nano hoặc trình chỉnh sửa ưa thích của bạn:

  1. sudo nano /etc/default/suricata

Tìm dòng LISTENMODE=af-packet và nhận xét bằng cách thêm dấu # vào đầu dòng. Sau đó, thêm một 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ờ bạn có thể khởi động lại Suricata bằng systemctl:

  1. sudo systemctl restart suricata.service

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

  1. sudo systemctl status suricata.service

Bạn sẽ nhận được đầu ra như sau:

Output
● suricata.service - LSB: Next Generation IDS/IPS Loaded: loaded (/etc/init.d/suricata; generated) Active: active (running) since Wed 2021-12-01 15:54:28 UTC; 2s ago Docs: man:systemd-sysv-generator(8) Process: 1452 ExecStart=/etc/init.d/suricata start (code=exited, status=0/SUCCESS) Tasks: 12 (limit: 9513) Memory: 63.6M CGroup: /system.slice/suricata.service └─1472 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -q 0 -D -vvv Dec 01 15:54:28 suricata systemd[1]: Starting LSB: Next Generation IDS/IPS... Dec 01 15:54:28 suricata suricata[1452]: Starting suricata in IPS (nfqueue) mode... done. Dec 01 15:54:28 suricata systemd[1]: Started LSB: Next Generation IDS/IPS.

Lưu ý dòng active (running) được đánh dấu cho biết Suricata đã khởi động lại thành công. Cũng lưu ý rằng Starting suricata in IPS (nfqueue) mode... done., xác nhận Suricata hiện đang chạy ở chế độ IPS.

Với thay đổi này, bây giờ bạn đã 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.

Bước 4: Thiết lập cấu hình UFW để gửi lưu lượng truy cập đến Suricata

Bây giờ bạn đã 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. Nếu bạn đã làm theo các hướng dẫn tiên quyết cho loạt bài này và đang sử dụng hệ thống Ubuntu 20.04, bạn nên cài đặt và bật Uncomplicated Firewall (UFW).

Để thêm các quy tắc bắt buộc cho Suricata vào UFW, bạn cần phải chỉnh sửa trực tiếp các tệp tường lửa trong /etc/ufw/before.rules (quy tắc IPv4) và /etc/ufw/before6.rules (IPv6).

Mở tệp đầu tiên cho các quy tắc IPv4 bằng nano hoặc trình chỉnh sửa ưa thích của bạn:

  1. sudo nano /etc/ufw/before.rules

Gần đầu tệp, hãy chèn các dòng được đánh dấu sau:

/etc/ufw/before.rules
. . .
# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines

## 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

# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
. . .

Lưu và thoát khỏi tệp khi bạn chỉnh sửa xong. Bây giờ thêm các dòng được đánh dấu giống nhau vào cùng một phần trong tệp /etc/ufw/before6.rules:

  1. sudo nano /etc/ufw/before.rules

Đảm bảo rằng cả hai tệp đều có cùng nội dung. Lưu và thoát khỏi tệp khi bạn chỉnh sửa xong.

Hai quy tắc INPUTOUTPUT đầu tiên được sử dụng để bỏ qua Suricata, để bạn có thể kết nối với máy chủ của mình bằng SSH, ngay cả khi Suricata không chạy. Nếu không có các quy tắc này, chữ ký không chính xác hoặc quá rộng có thể chặn quyền truy cập SSH của bạn. Ngoài ra, nếu Suricata bị dừng, tất cả lưu lượng truy cập sẽ được gửi đến mục tiêu NFQUEUE và sau đó bị giảm vì Suricata không chạy.

Quy tắc FORWARD tiếp theo đảm bảo rằng nếu máy chủ của bạn đang hoạt động như một cổng cho các hệ thống khác, tất cả lưu lượng truy cập đó cũng sẽ được chuyển đến Suricata để xử lý.

Hai quy tắc INPUTOUTPUT cuối cùng gửi tất cả lưu lượng còn lại không phải là lưu lượng SSH đến Suricata để xử lý.

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

  1. sudo systemctl restart ufw.service

Lưu ý: Nếu bạn đang sử dụng tường lửa khác, bạn sẽ cần phải sửa đổi các quy tắc này để phù hợp với định dạng tường lửa của bạn mong đợi.

Nếu bạn đang sử dụng iptables, thì bạn có thể chèn các quy tắc này trực tiếp bằng lệnh iptablesip6tables. Tuy nhiên, bạn sẽ cần phải đảm bảo rằng các quy tắc vẫn tồn tại qua các lần khởi động lại bằng một công cụ như iptables-persistent.

Nếu bạn đang sử dụng firewalld, thì các quy tắc sau sẽ hướng lưu lượng truy cập đến Suricata:

  1. firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
  2. firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -j NFQUEUE
  3. firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
  4. firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -j NFQUEUE
  5. firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j NFQUEUE
  6. firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j NFQUEUE
  7. firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
  8. firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j NFQUEUE
  9. firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
  10. firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -j NFQUEUE

Tại thời điểm này trong hướng dẫn, bạn đã thiết lập cấu hình Suricata để chạy ở chế độ IPS và lưu lượng mạng của bạn đang được gửi đến Suricata theo mặc định. Bạn sẽ có thể khởi động lại máy chủ của mình bất kỳ lúc nào và các quy tắc Suricata và tường lửa của bạn sẽ được duy trì.

Bước cuối cùng trong hướng dẫn này là xác minh Suricata đang giảm lưu lượng truy cập một cách chính xác.

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

Bây giờ bạn đã cấu hình Suricata và tường lửa của mình để xử lý lưu lượng mạng, bạn có thể kiểm tra xem Suricata có thả các gói phù hợp với chữ ký tùy chỉnh và các chữ ký đi kèm khác của bạn hay không.

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

sid:2100498
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;)

Tìm và chỉnh sửa quy tắc trong tệp /var/lib/suricata/rules/suricata.rules của bạn để sử dụng hành động drop nếu bạn có chữ ký ở đó. Nếu không, hãy thêm quy tắc vào tệp /var/lib/suricata/rules/local.rules của bạn.

Gửi cho Suricata tín hiệu SIGUSR2 để nó tải lại chữ ký:

  1. sudo kill -usr2 $(pidof suricata)

Bây giờ hãy kiểm tra quy tắc bằng cách sử dụng curl:

  1. curl --max-time 5 http://testmynids.org/uid/index.html

Bạn sẽ nhận được lỗi thông báo 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:

Output
curl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received

Bạn có thể xác nhận rằng Suricata đã bỏ phản hồi HTTP bằng cách sử dụng jq để kiểm tra tệp eve.log:

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

Bạn sẽ nhận được đầu ra như sau:

Output
Output{ . . . "community_id": "1:tw19kjR2LeWacglA094gRfEEuDU=", "alert": { "action": "blocked", "gid": 1, "signature_id": 2100498, "rev": 7, "signature": "GPL ATTACK_RESPONSE id check returned root", "category": "Potentially Bad Traffic", "severity": 2, "metadata": { "created_at": [ "2010_09_23" ], "updated_at": [ "2010_09_23" ] } }, "http": { "hostname": "testmynids.org", "url": "/uid/index.html", "http_user_agent": "curl/7.68.0", "http_content_type": "text/html", "http_method": "GET", "protocol": "HTTP/1.1", "status": 200, "length": 39 }, . . .

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

Kết luận

Trong hướng dẫn này, bạn đã thiết lập cấu hình Suricata để chặn lưu lượng mạng đáng ngờ bằng cách sử dụng chế độ IPS tích hợp của nó. Bạn cũng đã thêm chữ ký tùy chỉnh để kiểm tra và chặn lưu lượng SSH, HTTP và TLS trên các cổng không chuẩn. Để gắn kết mọi thứ với nhau, bạn cũng đã thêm các quy tắc tường lửa để hướng lưu lượng truy cập qua Suricata để xử lý.

Bây giờ bạn đã cài đặt và thiết lập cấu hình Suricata ở chế độ IPS và có thể viết chữ ký của riêng mình để cảnh báo hoặc giảm lưu lượng đáng ngờ, bạn có thể tiếp tục theo dõi máy chủ và mạng của mình cũng như tinh chỉnh chữ ký của mình.

Khi bạn hài lòng với chữ ký và cấu hình Suricata của mình, bạn có thể tiếp tục với hướng dẫn cuối cùng trong loạt bài này, hướng dẫn này sẽ hướng dẫn bạn cách gửi nhật ký từ Suricata tới hệ thống Quản lý sự kiện thông tin và bảo mật (SIEM) được xây dựng bằng Elastic Stack.

0 câu trả lời