IDS/IPS với Suricata: phát hiện xâm nhập trên server Linux
IDS/IPS với Suricata: phát hiện xâm nhập trên server Linux
3 giờ sáng, điện thoại của bạn rung liên tục: bot Telegram báo hơn 400 lần đăng nhập SSH thất bại chỉ trong 10 phút vào server production. Một dải IP lạ đang dò mật khẩu tài khoản root bằng từ điển. Nếu server không có hệ thống phát hiện xâm nhập, sáng hôm sau bạn mới biết chuyện qua dòng log auth.log đã nguội — lúc đó kẻ tấn công có thể đã cài xong backdoor.
Suricata IDS/IPS chính là "người gác cổng" cho tình huống đó: công cụ mã nguồn mở chạy trên Linux, quan sát toàn bộ lưu lượng mạng theo thời gian thực, so khớp với hàng chục nghìn chữ ký tấn công đã biết, rồi cảnh báo (IDS) hoặc chặn đứng (IPS) ngay lập tức. Từ quét port, brute force SSH, khai thác lỗ hổng web tới mã độc "gọi về" máy chủ điều khiển — Suricata đều có thể nhìn thấy.
Bài viết hướng dẫn đầy đủ cho team kỹ thuật SME: phân biệt IDS/IPS, vì sao chọn Suricata, cài đặt trên Ubuntu, cấu hình suricata.yaml, dùng ruleset Emerging Threats, viết rule tùy chỉnh, chuyển sang chế độ IPS inline, đọc log Eve JSON và gửi cảnh báo về Telegram.
Suricata ids ips: iDS và IPS khác nhau như thế nào?
IDS (Intrusion Detection System) và IPS (Intrusion Prevention System) là hai chế độ của cùng một công nghệ, khác nhau ở điểm cốt lõi: IDS chỉ nhìn và báo, IPS nhìn và chặn. IDS giống camera an ninh ghi lại kẻ đột nhập rồi hú còi; IPS là bảo vệ đứng ngay cửa — thấy khả nghi là giữ lại, không cho vào.
| Tiêu chí | IDS (Detection) | IPS (Prevention) |
|---|---|---|
| Vị trí trong luồng mạng | Đứng ngoài, nghe lén bản sao lưu lượng (passive) | Chắn ngang luồng lưu lượng (inline) |
| Khi phát hiện tấn công | Ghi log, gửi cảnh báo | Chặn/giữ gói tin độc hại + ghi log |
| Ảnh hưởng hệ thống | Không gây gián đoạn | Có thể gián đoạn nếu rule sai (false positive) |
| Rủi ro triển khai | Thấp | Cao hơn — cần tinh chỉnh kỹ trước khi bật |
| Dùng khi nào | Giám sát, thu thập dữ liệu, điều tra sự cố | Bảo vệ chủ động dịch vụ quan trọng |
Lộ trình an toàn cho SME: chạy IDS trước 1–2 tuần để thu thập log, tinh chỉnh rule, loại bỏ cảnh báo giả — rồi mới chuyển rule quan trọng sang IPS. Suricata hỗ trợ cả hai chế độ trong cùng một phần mềm.
Suricata ids ips: suricata là gì? Vì sao nên chọn Suricata?
Suricata là engine IDS/IPS/NSM (Network Security Monitoring) mã nguồn mở do tổ chức OISF phát triển. Nó chạy trên Linux, đọc lưu lượng mạng thời gian thực, so khớp với bộ rule (chữ ký tấn công) và xuất log JSON chi tiết để phân tích hoặc đẩy vào SIEM.
Điểm nổi bật nhất là kiến trúc đa luồng (multi-threading): tận dụng nhiều nhân CPU để xử lý song song, đạt throughput cao trên server phổ thông mà không cần phần cứng chuyên dụng. Suricata còn tự động nhận diện giao thức (HTTP, TLS, DNS, SMB...) bất kể port nào, hỗ trợ giải nén Gzip, trích xuất file từ luồng mạng và ghi log Eve JSON thân thiện với công cụ phân tích.
Đối thủ quen thuộc là Snort — bảng so sánh nhanh giúp bạn quyết định:
| Tiêu chí | Suricata | Snort |
|---|---|---|
| Đa luồng | Có ngay từ đầu, tận dụng multi-core tốt | Snort 2 đơn luồng; Snort 3 mới hỗ trợ |
| Định dạng log | Eve JSON, dễ đưa vào ELK/SIEM | Unified2, cần công cụ phụ trợ |
| Nhận diện giao thức | Tự động, không phụ thuộc port | Chủ yếu dựa vào port |
| Ruleset cộng đồng | Emerging Threats (ET Open) miễn phí | Talos + ET Open (tương thích phần lớn) |
| Giấy phép | GPLv2, hoàn toàn mở | GPLv2 (bản mở) |
Với team kỹ thuật SME chạy server Linux, Suricata thường hợp lý hơn: cài đơn giản từ PPA chính thức, log JSON đọc ngay bằng jq, hiệu năng tốt trên phần cứng phổ thông, ruleset ET Open miễn phí cập nhật hàng ngày.
Suricata ids ips: kiến trúc hoạt động của Suricata
Một gói tin đi qua Suricata trải qua 5 bước:
1. Thu thập (Capture). Bắt gói tin từ card mạng qua AF_PACKET (nghe lén, dùng cho IDS) hoặc NFQUEUE (inline, dùng cho IPS). Chế độ multi-queue cho phép nhiều luồng CPU cùng đọc song song.
2. Giải mã (Decode). Bóc tách từng lớp: Ethernet → IP → TCP/UDP → giao thức ứng dụng. Suricata tự nhận diện giao thức lớp 7 (ví dụ HTTP chạy trên port lạ) thay vì đoán theo số port.
3. Tái tạo luồng (Stream reassembly). Ghép các gói TCP bị chia nhỏ thành luồng hoàn chỉnh. Bước này vô hiệu hóa kỹ thuật phân mảnh gói tin (fragmentation) mà kẻ tấn công hay dùng để lách qua IDS đơn giản.
4. Phát hiện (Detect). So khớp luồng dữ liệu với hàng chục nghìn rule: từ khóa nội dung, regex, ngưỡng tần suất, phân tích hành vi giao thức. Rule nào "trúng" sẽ sinh sự kiện cảnh báo kèm mức độ nghiêm trọng.
5. Xuất kết quả (Output). Ghi ra fast.log (đọc nhanh), eve.json (JSON chi tiết), stats.log (thống kê hiệu năng) — sẵn sàng đẩy sang Telegram, ELK, Splunk hay SIEM.
Toàn bộ pipeline chạy song song đa luồng nên Suricata xử lý được lưu lượng hàng Gbps trên server tầm trung.
Cài đặt Suricata trên Ubuntu
Thực hành trên Ubuntu 22.04/24.04, toàn bộ lệnh chạy với sudo.
Bước 1: Thêm PPA chính thức của OISF và cài đặt.
sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt update
sudo apt install -y suricata
suricata -V
PPA oisf/suricata-stable do chính nhóm phát triển Suricata duy trì, luôn có bản ổn định mới nhất (kho mặc định của Ubuntu thường cũ hơn vài phiên bản).
Bước 2: Cho chạy cùng hệ thống và kiểm tra.
sudo systemctl enable --now suricata
sudo systemctl status suricata
sudo tail -n 20 /var/log/suricata/suricata.log
Thấy Active: active (running) là Suricata đã chạy ở chế độ IDS mặc định. File /var/log/suricata/suricata.log là nơi đầu tiên cần xem khi service không khởi động được — lỗi cú pháp cấu hình, thiếu rule hay sai tên interface đều ghi rõ ở đây.
Cấu hình cơ bản trong suricata.yaml
File cấu hình chính: /etc/suricata/suricata.yaml. Luôn sao lưu trước khi sửa:
sudo cp /etc/suricata/suricata.yaml /etc/suricata/suricata.yaml.bak
1. Khai báo mạng nội bộ (HOME_NET) — thiết lập quan trọng nhất, cho Suricata biết đâu là "nhà mình" để phân biệt hướng tấn công:
vars:
address-groups:
HOME_NET: "[192.168.1.0/24]"
EXTERNAL_NET: "!$HOME_NET"
Thay bằng dải mạng thật của bạn. Để mặc định any khiến rule kém chính xác và sinh nhiều cảnh báo giả.
2. Chỉ định card mạng giám sát (kiểm tra tên interface bằng ip -br addr show):
af-packet:
- interface: eth0
threads: auto
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
3. Bật các loại log Eve JSON cần thiết trong outputs: → eve-log: → types:: alert, anomaly, http, dns, tls, ssh, flow, stats. Danh sách này là điểm cân bằng tốt cho SME: đủ phát hiện tấn công mà không "ngốn" disk vì log ít giá trị.
Sau mỗi lần sửa, luôn kiểm tra cú pháp trước khi restart:
sudo suricata -T -c /etc/suricata/suricata.yaml
sudo systemctl restart suricata
Ruleset Emerging Threats và cách viết rule tùy chỉnh
Rule là "bộ não" của Suricata — mỗi rule mô tả một dấu hiệu tấn công. Bạn không cần viết từ đầu: cộng đồng đã làm sẵn hàng chục nghìn rule miễn phí qua Emerging Threats Open (ET Open).
Cập nhật ruleset bằng suricata-update:
sudo suricata-update
sudo ls -lh /var/lib/suricata/rules/suricata.rules
Lệnh này tải ET Open và gộp thành file suricata.rules duy nhất, Suricata tự nạp mỗi lần khởi động. Đặt lịch cập nhật hàng ngày để luôn có chữ ký mới nhất:
echo "0 3 * * * root /usr/bin/suricata-update && /usr/bin/suricatasc -c reload-rules" | sudo tee /etc/cron.d/suricata-update
Cấu trúc một rule: hành-động giao-thức nguồn -> đích (tùy-chọn). Ví dụ rule phát hiện brute force SSH:
alert tcp any any -> $HOME_NET 22 (msg:"SSH brute force - 5 lan dang nhap trong 60 giay"; flow:established,to_server; threshold: type both, track by_src, count 5, seconds 60; classtype:attempted-recon; sid:1000001; rev:1;)
alert— chỉ cảnh báo (muốn chặn thì dùngdropở chế độ IPS).threshold: ... count 5, seconds 60— chỉ báo khi một IP thử quá 5 lần trong 60 giây, tránh báo động với 1–2 lần gõ sai mật khẩu vô tình.sid:1000001— ID duy nhất. Quy ước: rule tự viết dùng SID từ 1.000.000 trở lên để không trùng ET Open.
Thêm rule tùy chỉnh:
sudo nano /etc/suricata/rules/local.rules # dán rule vào, lưu lại
rule-files:
- suricata.rules
- local.rules
sudo suricatasc -c reload-rules
sudo tail -f /var/log/suricata/fast.log
Thử SSH sai mật khẩu 6 lần liên tiếp và quan sát fast.log — cảnh báo "SSH brute force" xuất hiện nghĩa là Suricata đã "sống" trên hệ thống của bạn.
Chế độ IDS (passive) và IPS (inline, NFQUEUE)
Mặc định Suricata chạy IDS thụ động: đọc bản sao lưu lượng qua AF_PACKET, thấy tấn công thì báo nhưng gói tin độc hại vẫn lọt vào server. Muốn chặn đứng, chuyển sang IPS inline bằng NFQUEUE — netfilter "giữ" gói tin, đưa Suricata phán quyết cho qua hay loại bỏ rồi mới chuyển tiếp.
Nguyên tắc vàng: chạy IDS ít nhất 1–2 tuần, tinh chỉnh hết cảnh báo giả rồi mới bật IPS. Bật chặn ngay từ ngày đầu là cách nhanh nhất để tự khóa chính mình.
Bước 1: Bật IP forwarding.
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Bước 2: Đưa lưu lượng vào hàng đợi NFQUEUE (server đứng trực tiếp, queue số 0):
sudo iptables -I INPUT -j NFQUEUE --queue-num 0
sudo iptables -I OUTPUT -j NFQUEUE --queue-num 0
Dùng UFW thì thêm rule tương ứng vào /etc/ufw/before.rules để tồn tại sau reboot.
Bước 3: Cấu hình Suricata đọc từ NFQUEUE — tắt AF_PACKET, bật NFQUEUE trong suricata.yaml:
nfqueue:
- id: 0
batchcount: 20
fail-open: yes
fail-open: yes rất đáng giá: nếu Suricata crash, gói tin vẫn được cho qua thay vì sập toàn bộ kết nối mạng.
Bước 4: Đổi rule sang drop và khởi động lại.
sudo sed -i 's/^alert/drop/' /etc/suricata/rules/local.rules
sudo systemctl restart suricata
Bước 5: Kiểm thử an toàn bằng rule chặn ping ICMP, rồi ping thử từ máy khác:
drop icmp any any -> $HOME_NET any (msg:"ICMP test drop"; sid:1000002; rev:1;)
Ping không có reply nghĩa là IPS đang chặn đúng. Sau đó xóa rule test, chỉ giữ các rule drop đã kiểm chứng kỹ.

Đọc và phân tích log Eve JSON
Hai file log bạn sẽ mở nhiều nhất trong /var/log/suricata/: fast.log (cảnh báo một dòng, đọc nhanh bằng mắt) và eve.json (mỗi sự kiện một dòng JSON đầy đủ: IP nguồn/đích, port, chữ ký rule, mức nghiêm trọng).
Ví dụ dòng cảnh báo trong fast.log:
10/07/2026-03:12:45.123456 [**] [1:1000001:1] SSH brute force - 5 lan dang nhap trong 60 giay [**] [Priority: 2] {TCP} 45.148.10.88:51234 -> 103.90.200.15:22
Đọc được ngay: 3h12 sáng, IP 45.148.10.88 brute force SSH vào server. Với eve.json, dùng jq để truy vấn như database:
# 10 cảnh báo mới nhất: thời gian, chữ ký, IP nguồn
sudo tail -n 1000 /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | "\(.timestamp) | \(.alert.signature) | \(.src_ip)"' | tail -n 10
# Top 10 IP tấn công nhiều nhất
sudo cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .src_ip' | sort | uniq -c | sort -nr | head -n 10
# Thống kê theo mức độ nghiêm trọng
sudo cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .alert.severity' | sort | uniq -c
Ba câu lệnh trên trả lời đủ câu hỏi vận hành hằng ngày: "đang bị tấn công kiểu gì, từ đâu nhiều nhất, có gì nghiêm trọng?". Hệ thống lớn hơn thì đẩy eve.json vào ELK hoặc Wazuh để có dashboard và lưu trữ dài hạn. Đừng quên stats.log: drop rate trên 1–2% là dấu hiệu cần thêm tài nguyên hoặc giảm rule/log thừa.

Tích hợp cảnh báo Telegram
Cảnh báo chỉ có giá trị khi tới đúng người, đúng lúc. Với team SME chưa có SOC/SIEM, đẩy cảnh báo nghiêm trọng về Telegram là giải pháp nhanh và miễn phí — đúng kịch bản "3 giờ sáng" ở đầu bài.
Bước 1: Nhắn @BotFather, dùng /newbot tạo bot và nhận token. Nhắn một tin cho bot, rồi lấy chat ID tại https://api.telegram.org/bot<TOKEN>/getUpdates.
Bước 2: Script Python theo dõi eve.json (/opt/suricata-telegram/alert.py):
import json, time, urllib.request, urllib.parse
TOKEN = "TOKEN_BOT_CUA_BAN"
CHAT_ID = "CHAT_ID_CUA_BAN"
EVE_LOG = "/var/log/suricata/eve.json"
def send(msg):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
data = urllib.parse.urlencode({"chat_id": CHAT_ID, "text": msg}).encode()
urllib.request.urlopen(url, data, timeout=10)
with open(EVE_LOG) as f:
f.seek(0, 2) # chỉ đọc dòng mới
while True:
line = f.readline()
if not line:
time.sleep(1)
continue
try:
e = json.loads(line)
except ValueError:
continue
if e.get("event_type") == "alert" and e.get("alert", {}).get("severity", 3) <= 2:
a = e["alert"]
send(f"Suricata [{a['severity']}] {a['signature']}\n"
f"{e['src_ip']}:{e.get('src_port','')} -> {e['dest_ip']}:{e.get('dest_port','')}")
Script chỉ gửi cảnh báo severity 1–2 để tránh "ngập" tin nhắn. Chạy dưới dạng systemd service để tự khởi động cùng server. Mẹo thực tế: tuần đầu chạy IDS hãy để ngưỡng severity 3 để thấy toàn cảnh, ghi chú cảnh báo giả, rồi siết xuống 1–2 khi vận hành chính thức.
Tối ưu hiệu năng và giảm false positive
Suricata mặc định "tham lam": nạp hết rule, ghi hết log. Tinh chỉnh 6 điểm sau cho server production:
1. Vô hiệu hóa rule gây ồn. Sau 1–2 tuần chạy IDS, liệt kê rule báo nhiều nhưng vô giá trị, tắt bằng disable.conf:
# /etc/suricata/disable.conf — mỗi dòng một SID
1:2010935
1:2027865
sudo suricata-update --disable-conf /etc/suricata/disable.conf
sudo suricatasc -c reload-rules
2. Giảm nhạy bằng threshold.conf thay vì tắt hẳn — mỗi IP nguồn chỉ báo tối đa 1 lần/giờ cho rule đó:
threshold gen_id 1, sig_id 2010935, type limit, track by_src, count 1, seconds 3600
3. Khai báo HOME_NET chính xác. HOME_NET sai là nguyên nhân số một của false positive — rà soát lại sau mỗi lần thay đổi hạ tầng mạng.
4. Tinh chỉnh AF_PACKET cho server nhiều nhân:
af-packet:
- interface: eth0
threads: 4
cluster-id: 99
cluster-type: cluster_flow
5. Xoay vòng log. eve.json trên server bận rộn có thể phình vài GB/ngày — cấu hình logrotate giữ 7 ngày, nén lại.
6. Theo dõi drop rate trong stats.log. Thứ tự xử lý khi Suricata bỏ lỡ gói tin: giảm rule/log thừa trước, tăng RAM/CPU sau, nâng cấp phần cứng cuối cùng.
7 sai lầm thường gặp khi triển khai Suricata
1. Bật IPS ngay ngày đầu. Ruleset nguyên bản chưa tinh chỉnh cho môi trường của bạn — bật chặn vội dễ chặn nhầm dịch vụ hợp lệ, thậm chí tự khóa SSH. Luôn chạy IDS quan sát trước.
2. Để HOME_NET mặc định. Nhiều rule ET phân biệt hướng tấn công dựa trên biến này. Để sai, rule hoặc không kích hoạt, hoặc báo sai hướng.
3. Không cập nhật ruleset định kỳ. Chữ ký mới xuất hiện mỗi ngày; Suricata chạy rule cũ 6 tháng chẳng khác nào antivirus không update. Tự động hóa suricata-update bằng cron.
4. Rule tự viết thiếu hoặc trùng SID. Thiếu sid thì Suricata từ chối nạp; trùng SID với ET Open gây xung đột. Luôn dùng SID từ 1.000.000 trở lên.
5. Chỉ giám sát một card mạng. Server nhiều interface mà Suricata chỉ nghe một cái thì kẻ tấn công đi "cửa sau" sẽ thoát. Khai báo đủ interface trong af-packet.
6. Không xoay vòng log. eve.json đầy ổ đĩa có thể treo cả server. Logrotate là bắt buộc, không phải tùy chọn.
7. Cài trên máy quá yếu rồi kết luận "Suricata chậm". Với lưu lượng vài trăm Mbps, dành ít nhất 2–4 vCPU và 4 GB RAM riêng cho Suricata; đừng chạy chung với database đang "khát" tài nguyên rồi đổ lỗi cho công cụ.
Kết luận
Suricata IDS/IPS mang khả năng phát hiện và ngăn chặn xâm nhập cấp doanh nghiệp tới mọi server Linux với chi phí bản quyền bằng không: cài đặt vài phút từ PPA chính thức, ruleset Emerging Threats miễn phí cập nhật hàng ngày, log Eve JSON sẵn sàng cho mọi hệ thống phân tích, và lộ trình an toàn từ IDS quan sát tới IPS chặn inline.
Mấu chốt nằm ở quy trình: khai báo HOME_NET chính xác, chạy IDS thu thập dữ liệu trước, tinh chỉnh rule loại false positive, tự động cập nhật chữ ký, rồi mới bật chặn — và luôn có cảnh báo về điện thoại khi sự cố nghiêm trọng xảy ra lúc 3 giờ sáng.
Nếu đội kỹ thuật của bạn đang vận hành website, hệ thống bán hàng hay máy chủ dữ liệu trên cloud mà chưa có lớp giám sát mạng nào, đây là lúc bổ sung. Các gói Cloud Server và VPS của SunCloud — hạ tầng Tier III, uptime cam kết 99,98%, dùng thử 10 ngày — là nền tảng phù hợp để triển khai Suricata và các lớp bảo mật khác mà vẫn giữ toàn bộ dữ liệu trong nước. Liên hệ hotline 083 979 3434 hoặc email sales@suncloud.vn hoặc truy cập suncloud.vn để được tư vấn cấu hình phù hợp.
Bài viết liên quan
- Dịch vụ VPS SunCloud
- Pentest là gì? Khi nào doanh nghiệp SME cần kiểm thử xâm nhập?
- AI của OpenAI tự tìm 948 lỗ hổng leo thang đặc quyền trên Linux
Câu hỏi thường gặp
Suricata có thay thế được firewall không?
Không. Firewall (iptables/UFW) quyết định ai được phép kết nối theo IP/port, còn Suricata phân tích nội dung kết nối để tìm dấu hiệu tấn công. Hai lớp bổ sung cho nhau: firewall chặn ở cửa, Suricata soi kỹ người đã được cho vào.
Nên chọn Suricata hay Snort?
Với server Linux nhiều nhân CPU, Suricata thường hiệu quả hơn nhờ đa luồng ngay từ đầu, log JSON dễ tích hợp SIEM và cài đặt đơn giản. Snort vẫn mạnh trong hệ sinh thái Cisco/Talos. Mới bắt đầu và không bị ràng buộc hệ sinh thái nào, Suricata là điểm khởi đầu hợp lý hơn.
Chạy Suricata tốn bao nhiêu tài nguyên?
Tùy lưu lượng và số rule. Với server SME (vài chục Mbps, ET Open đầy đủ), dành khoảng 2 vCPU và 2–4 GB RAM. Suricata mở rộng gần tuyến tính theo số luồng CPU. Luôn theo dõi stats.log để biết khi nào cần thêm tài nguyên.
Chỉ chạy IDS không bật IPS có đủ không?
Đủ cho giám sát và điều tra sự cố — và là cách bắt đầu an toàn nhất. Nhưng IDS không ngăn được tấn công đang diễn ra. Nếu server chứa dữ liệu quan trọng hoặc dịch vụ công khai, nên tiến tới IPS sau khi tinh chỉnh rule kỹ.
Suricata có phát hiện tấn công qua HTTPS mã hóa không?
Hạn chế. Suricata đọc được metadata TLS (tên miền SNI, chứng chỉ, JA3 fingerprint) và phát hiện nhiều dấu hiệu đáng ngờ từ đó, nhưng không đọc nội dung đã mã hóa. Muốn soi sâu HTTPS cần giải mã TLS trước khi tới Suricata — thường làm ở reverse proxy hoặc load balancer.
Bao lâu nên cập nhật rule một lần?
Ít nhất mỗi ngày một lần bằng suricata-update tự động qua cron. Emerging Threats phát hành chữ ký mới hàng ngày theo diễn biến mối đe dọa thực tế; rule cũ vài tuần có thể bỏ sót chiến dịch tấn công đang hoạt động.
