Thiết lập, cấu hình và quản lí hệ thống mạng của riêng mình sao cho an toàn và bảo mật là một công việc rất quan trọng đối với bất kỳ hệ thống máy chủ nào. Hiểu được điều đó, Vietnix sẽ hướng dẫn cách cấu hình Suricata làm Intrusion Prevention System (IPS) trên Ubuntu 20.04 để quản lí, điều hướng và ngăn chặn hiệu quả các lưu lượng truy cập vào mạng của mình.
Giới thiệu về Suricata
Theo mặc định, Suricata được cấu hình để chạy dưới dạng IDS (Intrusion Detection System hay Hệ thống phát hiện xâm nhập), hệ thống này chỉ tạo cảnh báo và ghi nhật ký lại những lưu lượng truy cập đáng ngờ. Khi bạn bật chế độ IPS, Suricata có thể chủ động loại bỏ lưu lượng truy cập mạng đáng ngờ ngoài việc chỉ tạo ra các cảnh báo.
Trước khi bật chế độ IPS, bạn phải kiểm tra xem đã bật những Signatures nào và hành động mặc định của chúng. Signatures được cấu hình không chính xác hoặc Signatures quá rộng có thể dẫn đến làm giảm lưu lượng truy cập hợp lệ vào mạng của bạn hoặc thậm chí chặn chính bạn truy cập máy chủ của mình qua SSH và các giao thức quản lý khác.
Yêu cầu cần chuẩn bị
- Cài đặt Suricata trên máy chủ Ubuntu 20.04.
- Tường lửa UFW (Uncomplicated Firewall) đã được cài đặt và đang bật. (Hướng dẫn chi tiết về cách cài đặt tường lửa bằng UFW trên Ubuntu 20.04 tại đây)
- Download ET Open Ruleset (Bộ quy tắc mở ET) bằng cách sử dụng lệnh
suricata-update
và đưa vào chữ ký Suricata của bạn. - Command line
jq
để xử lí JSON . Nếu chưa cài đặt, bạn có thể sử dụng lệnhapt
:
$ sudo apt update
$ sudo apt install jq
Các bước thực hiện
Bước 1: Include các Signatures tùy chỉnh
Ở bước này, để tiến hành tạo và include các Signatures của riêng mình bạn cần phải chỉnh sửa file /etc/suricata/suricata.yaml
của Suricata để include đường dẫn tùy chỉnh tới Signatures đó.
Trước tiên, hãy tìm IP công khai của máy chủ để sử dụng trong các Signatures tùy chỉnh của mình. Để tìm địa chỉ IP, bạn có thể sử dụng lệnh ip
:
$ ip -brief address show
Bạn sẽ nhận được output 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 khai có thể sẽ giống với các IP 203.0.113.5
và 2001:DB8::1/32
được đánh dấu trong output.
Bạn tạo các Signatures tùy chỉnh sau để quét lưu lượng SSH đến các cổng không phải SSH và đưa vào file có tên /var/lib/suricata/rules/local.rules
. Mở file bằng nano
hoặc trình chỉnh sửa ưa thích:
$ sudo nano /var/lib/suricata/rules/local.rules
Sao chép và dán chữ những dòng sau vào tệp:
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 public của máy chủ của bạn thay cho các địa chỉ 203.0.113.5
và 2001:DB8::1/32
trong quy tắc. Nếu không sử dụng IPv6 thì có thể bỏ qua việc thêm các Signatures đó vào quy tắc này và các quy tắc tiếp theo dưới đây.
Bạn có thể tiếp tục thêm các Signatures tùy chỉnh vào tệp local.rules
này tùy thuộc vào mạng và ứng dụng. Ví dụ: Nếu muốn cảnh báo về lưu lượng HTTP đến các cổng không dành cho HTTP, có thể sử dụng các Signatures như sau:
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 các Signatures kiểm tra lưu lượng TLS vào các cổng khác với cổng 443
mặc định cho máy chủ web, hãy thêm các dòng sau:
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 đã hoàn tất, hãy lưu và đóng tệp. Nếu đang sử dụng nano
, bạn có thể làm như vậy bằng CTRL+X
, sau đó Y
và ENTER
để xác nhận. Còn nếu sử dụng vi
, hãy nhấn ESC
rồi :x
rồi ENTER
để lưu và thoát.
Chỉnh sửa file cấu hình /etc/suricata/suricata.yaml
của Suricata bằng cách sử dụng nano
hoặc trình chỉnh sửa ưa thích của mình để include các Signatures đó:
$ sudo nano /etc/suricata/suricata.yaml
Tìm rule-files
: một phần của tệp cấu hình. Nếu sử dụng nano
, bạn hãy sử dụng CTRL+_
rồi nhập số dòng 1879
. Nếu sử dụng vi
, hãy nhập 1879gg
để chuyển đến dòng đó.
Chỉnh sửa phần này và thêm dòng sau - local.rules
vào:
. . .
rule-files:
- suricata.rules
- local.rules
. . .
Lưu và thoát tệp. Sau đó, bạn cần phải đảm bảo việc xác thực cấu hình của Suricata sau khi thêm các quy tắc trên bằng lệnh sau:
$ 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 đã đưa vào trong tệp suricata.rules
mặc định. Nếu thấy kiểm tra mất quá nhiều thời gian, bạn có thể comment dòng – suricata.rules
trong cấu hình bằng cách thêm dấu #
vào đầu dòng rồi chạy lại việc kiểm tra cấu hình. Còn nếu bạn định sử dụng Signature của suricata.rules
trong cấu hình chạy cuối cùng của mình, hãy uncomment dòng suricata.rules
trên.
Khi đã hài lòng với các Signatures đã 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 sẽ chuyển hành động mặc định cho các Signatures của mình từ alert
hoặc log
sang chủ động làm giảm các lưu lượng truy cập.
Bước 2: Cấu hình các hành động của Signature
Sau khi đã kiểm tra xong phần Signature tùy chỉnh của mình và làm việc với Suricata, giờ đây có thể tiến hành 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 không hợp lệ đã được định nghĩa bởi các Signature.
Việc lựa chọn sử dụng hành động nào trong hai hành động trên là tùy thuộc vào bạn. Hành động loại bỏ drop
sẽ ngay lập tức loại bỏ một gói tin và các gói tin tiếp theo thuộc về luồng mạng đó. Hành động từ chối reject
sẽ gửi cho cả máy khách và máy chủ một gói tin reset (đặt lại) nếu lưu lượng truy cập dựa trên TCP và một gói lỗi ICMP nêu lượng truy cập thuộc về các giao thức 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 truy cập phù hợp với chúng có thể là lượt quét mạng (network scane) 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
của bạn bằng cách sử dụng nano
hoặc trình chỉnh sửa tùy thích và thay đổi hành động alert
ở đầu mỗi dòng trong tệp thành drop
:
$ sudo nano /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ỳ Signature nào trong /var/lib/suricata/rules/suricata.rules
mà bạn muốn chuyển sang chế độ loại drop
hoặc reject
.
Lưu ý: Nếu bạn đã chạy suricata-update
thì có thể có hơn 30.000 Signatures trong tệp suricata.rules
của mình.
Nếu bạn chuyển đổi mọi Signatures ý thành drop
hoặc reject
thì sẽ có nguy cơ chặn quyền truy cập hợp pháp vào mạng hoặc máy chủ của mình. Thay vào đó, tạm thời để nguyên các quy tắc trong suricata.rules
và thêm các Signatures tùy chỉnh của mình vào local.rules
. Suricata sẽ tiếp tục tạo cảnh báo cho lưu lượng truy cập đáng ngờ được mô tả bằng Signature trong suricata.rules
khi đang chạy ở chế độ IPS.
Sau khi thu thập được các cảnh báo trong vài ngày hoặc vài tuần, bạn có thể phân tích chúng và chọn các Signatures có liên quan để chuyển thành drop
hoặc reject
dựa trên sid
của chúng.
Bước 3: Bật chế độ nfqueue
Suricata chạy ở chế độ IDS theo mặc định, đồng nghĩa với việc Suricata 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 file cấu hình /etc/default/suricata
của Suricata.
Mở tệp bằng nano
hoặc trình chỉnh sửa tùy thích của bạn:
$ sudo nano /etc/default/suricata
Tìm dòng LISTENMODE=af-packet
và comment lại bằng cách thêm dấu #
vào đầu dòng. Sau đó, thêm một dòng mới LISTENMODE=nfqueue
dòng sẽ thông báo cho Suricata biết sẽ chạy ở chế độ IPS.
File của bạn nên được chỉnh sửa tương tự như dưới đây:
. . .
# LISTENMODE=af-packet
LISTENMODE=nfqueue
. . .
Lưu và đóng file. Bây giờ bạn có thể khởi động lại Suricata bằng systemctl
:
$ sudo systemctl restart suricata.service
Kiểm tra trạng thái của Suricata bằng systemctl
:
$ sudo systemctl status suricata.service
Bạn sẽ nhận được output tương tự 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)
cho biết Suricata đã khởi động lại thành công. Cũng lưu ý rằng dòng Starting suricata in IPS (nfqueue) mode... done
. xác nhận rằng Suricata hiện đang chạy ở chế độ IPS.
Bên cạnh việc cấu hình Suricata để giám sát và phát hiện các hoạt động xâm nhập vào hệ thống mạng, bạn có thể sử dụng VPS từ Vietnix để xây dựng hệ thống máy chủ nhằm nâng cao bảo mật dữ liệu. Với toàn quyền quản trị và tài nguyên tách biệt, bạn có thể kiểm soát được dữ liệu của mình và đồng thời giảm thiểu sự rủi ro gây ra bởi các cuộc tấn công thông qua lỗ hổng hệ thống.
Ngoài ra, các gói VPS Vietnix với cấu hình mạnh mẽ và khả năng chịu tải tốt giúp tăng cường hiệu suất của hệ thống cũng như đáp ứng nhu cầu sử dụng với lượng truy cập lớn hơn. Bạn có thể tham khảo sử dụng VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS NVMe, VPS GPU phù hợp với nhu cầu sử dụng. Nếu vẫn còn phân vân, hãy liên lạc với đội ngũ Vietnix để được tư vấn nhanh chóng và tối ưu nhất.
Bước 4: Cấu hình UFW để gửi lưu lượng tới Suricata
Thêm các quy tắc cần thiết cho Suricata vào UFW bằng cách chỉnh sửa trực tiếp các file 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 cách sử dụng nano
hoặc trình chỉnh sửa tùy thích:
$ sudo nano /etc/ufw/before.rules
Gần đầu tệp, hãy chỉnh sửa file cho giống với dưới đây:
. . .
# 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 file khi bạn đã chỉnh sửa xong. Bây giờ, hãy thêm các dòng tương tự như trên vào phần đầu trong file /etc/ufw/before6.rules
:
$ sudo nano /etc/ufw/before.rules
Đảm bảo rằng cả hai file có cùng nội dung. Lưu và thoát file khi đã chỉnh sửa xong.
Hai quy tắc INPUT
và OUTPUT
đầu tiên được sử dụng để vượt 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, Signature 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à bị hủy sau đó do 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 đóng vai trò là một gateway (cổng) cho các hệ thống khác, thì tất cả lưu lượng truy cập đó cũng sẽ được chuyển đến Suricata để xử lý.
Hai quy tắc INPUT
và OUTPUT
cuối cùng gửi tất cả lưu lượng không phải SSH còn lại đến Suricata để xử lý.
Khởi động lại UFW để áp dụng các quy tắc mới:
$ sudo systemctl restart ufw.service
Lưu ý: Nếu bạn đang sử dụng một tường lửa khác thì sẽ cần sửa đổi các quy tắc này để phù hợp với định dạng mà tường lửa yêu cầu.
Nếu bạn đang sử dụng iptables, thì có thể chèn trực tiếp các quy tắc này bằng lệnh iptables
và ip6tables
. Tuy nhiên, cần đảm bảo rằng các quy tắc được duy trì trong suốt quá trình khởi động lại bằng một công cụ như iptables-persistent
.
Nếu sử dụng firewalld
, thì các quy tắc sau sẽ hướng lưu lượng truy cập đến Suricata:
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -j NFQUEUE
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -j NFQUEUE
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j NFQUEUE
firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j NFQUEUE
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j NFQUEUE
firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -j NFQUEUE
Tại thời điểm này trong bài hướng dẫn, bạn đã cấu hình Suricata để chạy ở chế độ IPS và lưu lượng truy cập mạng sẽ được gửi đến Suricata theo mặc định. Khởi động lại máy chủ của mình bất cứ lúc nào và các quy tắc tường lửa và Suricata vẫn sẽ được duy trì.
Bước cuối cùng trong hướng dẫn này là xác minh rằng Suricata đang hạn chế các lưu lượng truy cập một cách chính xác.
Bước 5: Kiểm tra các lưu lượng không hợp lệ
Bây giờ bạn đã có Suricata và tường lửa của mình được cấu hình để xử lý lưu lượng mạng, ta có thể kiểm tra xem Suricata có loại bỏ các gói tin ứng với các tùy chỉnh và các Signatures đi kèm khác hay không.
Ví dụ ở đây ta có một sid:2100498
, cái đã bị chỉnh sửa trong bài hướng dẫn này thành drop
các gói tin tương ứng:
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;)
Bạn hãy tìm và chỉnh sửa quy tắc trong file /var/lib/suricata/rules/suricata.rules
của mình để sử dụng hành động drop
nếu có Signature đi kèm ở đó. Nếu không, hãy thêm quy tắc này vào tệp /var/lib/suricata/rules/local.rules
.
Gửi cho Suricata tín hiệu SIGUSR2
để tải lại các Signatures:
$ sudo kill -usr2 $(pidof suricata)
Bây giờ hãy kiểm tra quy tắc bằng cách sử dụng curl
:
$ curl --max-time 5 http://testmynids.org/uid/index.html
Bạn sẽ nhận được thông báo lỗi rằng yêu cầu đã timed out (hết thời gian chờ), điều này cho biết 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 đã loại bỏ phản hồi HTTP bằng cách sử dụng jq
để kiểm tra tệp eve.log
:
$ jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
Bạn sẽ nhận được output tương tự như sau:
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"
xác nhận rằng Signature đã khớp và Suricata đã drop
hoặc reject
yêu cầu HTTP trên.
Vietnix là một công ty có hơn 10 năm kinh nghiệm trong lĩnh vực cung cấp các giải pháp VPS chất lượng cao cho khách hàng cá nhân, doanh nghiệp trong nước và quốc tế. Với hơn 50.000 khách hàng đã sử dụng dịch vụ, Vietnix tự tin về chất lượng các dịch vụ đang cung cấp với tỷ lệ khách hàng giới thiệu sản phẩm sau khi sử dụng lên tới 97%.
Đặc biệt, Vietnix đã được vinh danh với giải thưởng Thương hiệu Việt Nam xuất sắc 2022 – một minh chứng cho sự cam kết đối với chất lượng và sự hài lòng của khách hàng. Hãy đến với Vietnix để trải nghiệm các giải pháp VPS tốt nhất cho sự phát triển bền vững doanh nghiệp của bạn.
Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Trong bài hướng dẫn này, bạn đã cấu hình Suricata để chặn những lưu lượng mạng đáng ngờ bằng cách sử dụng chế độ IPS tích hợp sẵn. Đồng thời, cũng đã thêm các Signature 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 dành riêng cho giao thức tương ứng. Nếu còn gì thắc mắc, bạn hãy bình luận bên dưới để được giải đáp kịp thời và nhanh chóng.