Falco: Phát hiện xâm nhập Docker Container theo thời gian thực và cảnh báo qua Slack

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

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=warning trướ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_images sớ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.name hoặ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.

Share: