Mình từng deploy microservices cho dự án e-commerce và mất gần 2 ngày mới phát hiện ra một container đang bị khai thác để gửi spam email ra ngoài. Log ứng dụng hoàn toàn sạch, CPU không tăng bất thường — nhưng container lại liên tục mở kết nối đến IP lạ. Nếu hồi đó có Falco, alert đó đã đến ngay từ phút đầu tiên.
Falco theo dõi system call của container theo thời gian thực — không phải log ứng dụng, không phải metric CPU/RAM, mà là từng lệnh gọi xuống kernel. Khác với hardening config hay security best practices (những thứ chỉ kiểm tra trạng thái tĩnh), Falco giám sát hành vi đang xảy ra: file nào đang bị đọc trộm, process lạ nào đang spawn, kết nối nào đang được mở ra ngoài. Đây là CNCF graduated project — cùng tier với Kubernetes và Prometheus.
Chạy Falco ngay trong 5 phút
Cách nhanh nhất để thử là chạy Falco qua Docker với userspace driver — không cần cài kernel module, phù hợp để test trên máy local hoặc môi trường dev:
# Chạy Falco ở chế độ userspace (không cần kernel module)
docker run --rm -it \
--privileged \
-v /var/run/docker.sock:/host/var/run/docker.sock \
-v /proc:/host/proc:ro \
-v /boot:/host/boot:ro \
-v /lib/modules:/host/lib/modules:ro \
-v /usr:/host/usr:ro \
-v /etc:/host/etc:ro \
falcosecurity/falco-no-driver:latest
Khi thấy dòng Starting internal webserver, listening on port 8765 là Falco đang chạy. Mở terminal khác để trigger một cảnh báo:
# Mở shell vào container đang chạy — Falco phát hiện ngay
docker exec -it $(docker ps -q | head -1) /bin/sh
Log Falco sẽ hiện ngay:
Warning evt_type=execve user=root container.id=abc123 container.name=my-app \
proc.name=sh proc.cmdline="sh" \
rule="Terminal shell in container" \
output="A shell was spawned in a container with an attached terminal"
Cài đặt Falco trực tiếp lên host cho Production
Muốn chạy nghiêm túc thì đừng dùng container — cài thẳng Falco lên host. Kernel module hoặc eBPF bắt system call ở tầng thấp nhất của OS, không bị ảnh hưởng dù container bên trên restart hay bị thay image.
Ubuntu / Debian
# Thêm Falco repository
curl -fsSL https://falco.org/repo/falcosecurity-packages.asc | \
sudo gpg --dearmor -o /usr/share/keyrings/falco-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] \
https://download.falco.org/packages/deb stable main" | \
sudo tee /etc/apt/sources.list.d/falcosecurity.list
sudo apt-get update && sudo apt-get install -y falco
Installer sẽ hỏi driver nào muốn dùng:
- Kernel module: Nhanh, ổn định — cần build lại sau khi upgrade kernel
- eBPF: Hiện đại hơn, không cần rebuild sau upgrade, yêu cầu kernel ≥ 4.14
- Modern eBPF: Tốt nhất nếu kernel ≥ 5.8, tích hợp sẵn không cần module riêng
# Bật và khởi động Falco
sudo systemctl enable --now falco
sudo systemctl status falco
# Theo dõi log theo thời gian thực
sudo journalctl -fu falco
Hiểu cấu trúc Rule — Nơi logic phát hiện nằm
Rule YAML là nơi bạn định nghĩa chính xác Falco sẽ phát hiện gì. Mỗi rule có bốn thành phần chính: condition (khi nào trigger), output (nội dung alert), priority (mức nghiêm trọng) và tags (phân loại theo MITRE ATT&CK):
# Cấu trúc một rule Falco
- rule: Read sensitive file untrusted
desc: Phát hiện process không tin cậy đọc file nhạy cảm
condition: >
sensitive_files and open_read
and not proc.name in (trusted_binaries)
and not container.image.repository in (trusted_images)
output: >
Sensitive file opened for reading
(user=%user.name command=%proc.cmdline
file=%fd.name container_id=%container.id
image=%container.image.repository)
priority: WARNING
tags: [filesystem, mitre_credential_access]
Các biến output hay dùng nhất:
%container.id— ID container vi phạm%container.image.repository— Image nào đang bị khai thác%proc.cmdline— Lệnh đang chạy tại thời điểm đó%fd.rip:%fd.rport— IP và port đích của kết nối mạng
Viết rule custom cho use case thực tế
Rule mặc định của Falco khá chung chung — môi trường production thực tế cần custom thêm. Tạo /etc/falco/rules.d/custom_rules.yaml; Falco tự load tất cả file trong thư mục này khi khởi động:
# Phát hiện container kết nối ra ngoài qua port không trong whitelist
- rule: Unexpected outbound connection
desc: Container mở kết nối ra ngoài ở port lạ
condition: >
outbound and container
and not fd.sport in (80, 443, 3306, 5432, 6379, 27017)
and not proc.name in (curl, wget, apt, pip, npm)
output: >
Unexpected outbound (container=%container.name
dest=%fd.rip:%fd.rport proto=%fd.l4proto
command=%proc.cmdline)
priority: NOTICE
# Phát hiện cài package trong container đang chạy
- rule: Package manager in running container
desc: apt/yum/pip chạy trong container production — dấu hiệu bị xâm nhập
condition: >
spawned_process and container
and proc.name in (apt, apt-get, yum, dnf, pip, pip3, npm, yarn)
output: >
Package manager detected (command=%proc.cmdline
container=%container.name
image=%container.image.repository)
priority: ERROR
Tích hợp cảnh báo Slack qua Falcosidekick
Falco tự nó chỉ ghi log. Muốn alert đến Slack — hay 50+ destination khác như PagerDuty, Elasticsearch, webhook — cần thêm Falcosidekick, một sidecar nhẹ nhận event từ Falco và forward đi. Setup bằng Docker Compose:
# docker-compose.yml
services:
falco:
image: falcosecurity/falco-no-driver:latest
privileged: true
volumes:
- /var/run/docker.sock:/host/var/run/docker.sock
- /proc:/host/proc:ro
- /boot:/host/boot:ro
- /lib/modules:/host/lib/modules:ro
- /usr:/host/usr:ro
- /etc:/host/etc:ro
- ./falco.yaml:/etc/falco/falco.yaml
depends_on:
- falcosidekick
falcosidekick:
image: falcosecurity/falcosidekick:latest
environment:
- SLACK_WEBHOOKURL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
- SLACK_CHANNEL=#security-alerts
- SLACK_MINIMUMPRIORITY=warning
- CUSTOMFIELDS_ENVIRONMENT=production
- CUSTOMFIELDS_TEAM=devops
ports:
- "2801:2801"
- "2802:2802" # Web UI
Sau đó nối Falco vào Falcosidekick — thêm vào falco.yaml:
http_output:
enabled: true
url: "http://falcosidekick:2801/"
user_agent: "falcosecurity/falco"
json_output: true
json_include_output_property: true
# Khởi động stack
docker compose up -d
# Trigger test: mở shell vào container → Slack nhận alert trong vài giây
docker exec -it some-container bash
Kết quả trên Slack trông như thế này:
[WARNING] Terminal shell in container
Container : my-webapp (id: abc123def456)
Image : nginx:latest
Command : bash
User : root
Host : prod-server-01
Time : 2024-01-15 14:32:11 UTC
Tips thực tế từ kinh nghiệm triển khai
Falco không debug memory leak trực tiếp — nhưng nó phát hiện triệu chứng sớm: process lạ spawn để dump memory, hoặc container ghi vào /tmp với tốc độ bất thường. Từ đó tìm root cause nhanh hơn nhiều so với ngồi đọc log từng dòng.
Mấy điều thực tế sau khi tune Falco trên production:
- Bắt đầu với priority WARNING trở lên: Falco có hàng trăm rule mặc định — chạy không lọc sẽ bị ngập alert ngay. Set
SLACK_MINIMUMPRIORITY=warningtrước, tune dần. - Whitelist image tin cậy ngay từ đầu: Image từ registry nội bộ thường cần đặc quyền riêng. Tạo macro
trusted_imagessớm để tránh false positive làm mệt team. - Dùng container name thay vì ID: Container ID thay đổi mỗi lần restart. Filter bằng
container.namehoặc label sẽ bền hơn nhiều. - Falcosidekick Web UI: Dashboard tại port 2802 rất hữu ích — xem event theo thời gian thực, filter theo priority, tìm nhanh container nào đang phát sinh alert nhiều nhất.
# Xem rule nào đang trigger nhiều nhất (để tune priority)
sudo journalctl -u falco --since "1 hour ago" | \
grep -oP 'rule="[^"]+"' | sort | uniq -c | sort -rn | head -20
# Kiểm tra Falco đang healthy
curl -s http://localhost:8765/healthz
# {"status": "healthy"}
Tường lửa và network policy bảo vệ luồng mạng — Falco bảo vệ thứ nằm bên trong: hành vi của từng process trong container đang chạy. Ghép Portainer để quản lý container và Falco để canh runtime behavior, bạn có một lớp bảo mật solid mà không cần phần mềm thương mại đắt tiền.
