Cài Zeek trong 5 phút — thử trước, hỏi sau
Zeek (tên cũ là Bro) khác hoàn toàn với Suricata hay Snort. Nó không chặn traffic, không cần rule signature — Zeek ghi lại mọi thứ xảy ra trên mạng dưới dạng log có cấu trúc để bạn phân tích sau. Cài một chỗ, monitor toàn bộ hệ thống, không cần đụng vào từng máy.
Cài đặt trên Ubuntu 22.04/24.04
Dùng repo chính thức của Zeek — nhanh và ổn nhất:
# Thêm Zeek repository
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_22.04/ /' | \
sudo tee /etc/apt/sources.list.d/zeek.list
curl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_22.04/Release.key | \
gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/zeek.gpg > /dev/null
# Cài Zeek
sudo apt update && sudo apt install -y zeek
# Kiểm tra version
/opt/zeek/bin/zeek --version
Thêm Zeek vào PATH cho tiện dùng:
echo 'export PATH=/opt/zeek/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Chạy thử ngay — capture 60 giây
Tìm interface network của máy:
ip link show
# Ví dụ output: eth0, ens3, enp0s3...
Chạy Zeek bắt gói tin trong 60 giây:
mkdir -p /tmp/zeek-test && cd /tmp/zeek-test
zeek -i eth0 -C local &
sleep 60
kill %1
ls -la # Xem các file log đã tạo
Nếu thấy các file như conn.log, dns.log, http.log xuất hiện — Zeek đang chạy tốt. Từ đây trở đi là phần thú vị.
Zeek khác gì so với các IDS khác?
Câu hỏi hay nhất để hiểu Zeek là: “Tại sao team mình cần cả Zeek lẫn Suricata?”
Suricata hoạt động theo kiểu “cảnh sát”: có rule → phát hiện → alert hoặc block. Còn Zeek giống “camera an ninh”: ghi lại mọi thứ mà không phán xét real-time. Bạn dùng log của Zeek để truy vết sau khi sự cố xảy ra, hoặc chạy analytics để phát hiện pattern bất thường mà signature-based IDS bỏ sót.
Điểm mạnh nhất: không cần cài agent trên các máy được monitor. Chỉ cần đặt Zeek ở một điểm có thể nhìn thấy traffic — port mirror, TAP, hoặc gateway — là cover được toàn bộ hệ thống.
Các log quan trọng cần nắm
Zeek tạo ra hàng chục loại log, nhưng thực tế chỉ cần quan tâm những file này:
| File log | Nội dung | Dùng khi nào |
|---|---|---|
conn.log |
Mọi kết nối TCP/UDP/ICMP | Điểm bắt đầu của mọi điều tra |
dns.log |
DNS queries và responses | Phát hiện DNS tunneling, C2 callback |
http.log |
HTTP requests đầy đủ | Theo dõi web traffic, phát hiện malware download |
ssl.log |
TLS/SSL handshakes | Detect self-signed cert, expired cert |
files.log |
Files transfer qua mạng | Track file download/upload |
weird.log |
Traffic bất thường Zeek tự phát hiện | Chỗ đầu tiên phải check khi có incident |
Đọc conn.log — kết nối nào đang ra internet?
# Xem tất cả kết nối ra ngoài, sắp xếp theo bytes
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto orig_bytes resp_bytes | \
sort -k5 -n -r | head -20
# Tìm kết nối đến port lạ (không phải 80, 443, 22, 53)
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p service | \
awk '$3 != 80 && $3 != 443 && $3 != 22 && $3 != 53' | sort | uniq -c | sort -rn
Phân tích DNS — detect DNS tunneling
# Top domains được query nhiều nhất
cat dns.log | zeek-cut query | sort | uniq -c | sort -rn | head -20
# Query có subdomain dài bất thường (dấu hiệu DNS tunneling)
cat dns.log | zeek-cut query | awk 'length($0) > 50' | sort | uniq -c | sort -rn
Cấu hình Zeek chạy production
Để Zeek chạy ổn định với traffic thật, cần cấu hình qua node.cfg và networks.cfg:
sudo nano /opt/zeek/etc/node.cfg
[zeek]
type=standalone
host=localhost
interface=eth0
# Tăng worker nếu traffic nhiều
# workers=4
Khai báo dải IP nội bộ để Zeek phân biệt traffic local và external:
sudo nano /opt/zeek/etc/networks.cfg
10.0.0.0/8 Private network 10.x
172.16.0.0/12 Private network 172.x
192.168.0.0/16 Private network 192.168.x
Deploy và khởi động:
sudo /opt/zeek/bin/zeekctl deploy
sudo /opt/zeek/bin/zeekctl status
Mặc định Zeek rotate log mỗi giờ, lưu tại /opt/zeek/logs/ theo cấu trúc ngày giờ, nén gzip tự động.
Nâng cao: Script Zeek phát hiện port scan
Zeek có scripting language riêng để viết detection logic tùy chỉnh. Ví dụ phát hiện port scan:
sudo nano /opt/zeek/share/zeek/site/detect-portscan.zeek
@load base/frameworks/notice
module PortScan;
export {
redef enum Notice::Type += {
Port_Scan_Detected
};
global scan_threshold = 20 &redef;
}
global scan_counts: table[addr] of count &read_expire=1min &default=0;
event new_connection(c: connection) {
local orig = c$id$orig_h;
++scan_counts[orig];
if (scan_counts[orig] == scan_threshold) {
NOTICE([$note=Port_Scan_Detected,
$msg=fmt("Port scan từ %s (%d conn/min)", orig, scan_counts[orig]),
$src=orig,
$identifier=cat(orig)]);
}
}
Load script này vào cấu hình Zeek:
echo '@load detect-portscan' >> /opt/zeek/share/zeek/site/local.zeek
sudo /opt/zeek/bin/zeekctl deploy
Tips thực tế khi vận hành
1. Bộ ba phân tích nhanh: zeek-cut + awk + sort
Khi cần điều tra nhanh mà không có ELK hay Splunk, bộ ba này cực kỳ hiệu quả:
# Top IP tạo nhiều traffic nhất (theo bytes)
cat conn.log | zeek-cut id.orig_h orig_bytes | \
awk '{sum[$1]+=$2} END {for(ip in sum) print sum[ip], ip}' | \
sort -rn | head -10
# Phát hiện long connection — dấu hiệu C2 beacon (kết nối kéo dài bất thường)
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p duration | \
awk '$4 > 3600' | sort -k4 -rn | head -10
2. Tích hợp với ELK Stack để visualize
Log text thuần của Zeek khó đọc khi có nhiều traffic. Dùng Filebeat để ship vào Elasticsearch:
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
paths:
- /opt/zeek/logs/current/*.log
fields:
type: zeek
json.keys_under_root: true
output.elasticsearch:
hosts: ["localhost:9200"]
3. Bảo mật server Zeek
Server Zeek nhìn thấy toàn bộ traffic nên là target hấp dẫn cho attacker. Khi setup, mình lock SSH chỉ cho phép key authentication và dùng toolcraft.app/vi/tools/security/password-generator để tạo passphrase cho SSH key — tool chạy 100% trên trình duyệt, không gửi gì lên server nên không lo bị lộ. Server Zeek cũng nên để ở VLAN riêng, firewall chặn toàn bộ inbound ngoại trừ management port.
4. Ba câu hỏi cần hỏi khi review log hàng ngày
Mình bắt đầu ngày làm việc với 3 câu hỏi này khi nhìn vào log Zeek:
- Có IP nội bộ nào đang kết nối ra internet qua port lạ không?
- Có domain nào được query với tần suất bất thường hoặc subdomain quá dài?
weird.loghôm nay ghi gì không?
Ba câu hỏi này cover được 80% các incident thường gặp trong môi trường doanh nghiệp vừa và nhỏ.
5. Kết hợp Zeek và Suricata — setup tốt nhất
Suricata làm IPS để block real-time, Zeek chạy song song để ghi log đầy đủ cho forensics. Khi Suricata bắn alert, mình dùng log Zeek để trace ngược: activity trước alert là gì, sau alert còn gì xảy ra không, có lateral movement không. Hai tool bổ sung cho nhau, không thay thế nhau.
Zeek không phải tool “install xong quên”, nhưng một khi đã quen với format log và vài query cơ bản, nó trở thành layer visibility quan trọng nhất trong hệ thống — thứ mà nhiều team chỉ nhận ra giá trị sau khi incident thật xảy ra.
