Cài đặt Zeek Network Security Monitor trên Linux: Phân tích traffic và phát hiện hành vi bất thường không cần Agent

Security tutorial - IT technology blog
Security tutorial - IT technology blog

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.cfgnetworks.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.log hô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.

Share: