Bảo mật Runtime: Hướng dẫn thực tế triển khai Falco trên Kubernetes

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

Điểm mù Runtime trong Kubernetes

Hầu hết các chiến lược bảo mật Kubernetes tập trung mạnh vào việc “shift left”. Chúng ta quét các lỗ hổng trong image container ở bước CI/CD và kiểm tra các file cấu hình YAML trước khi chúng được đẩy lên cluster. Đây là những bước thiết yếu. Tuy nhiên, chúng chỉ giải quyết các mối đe dọa trước khi mã nguồn bắt đầu chạy. Một khi pod đã hoạt động, nó bước vào một giai đoạn mà các công cụ bảo mật truyền thống thường mất khả năng quan sát so với việc áp dụng một checklist tăng cường bảo mật máy chủ Linux toàn diện.

Hãy tưởng tượng một kẻ tấn công khai thác lỗ hổng zero-day trong ứng dụng web của bạn. Chúng có thể tạo một reverse shell, sửa đổi file /etc/shadow hoặc cài đặt trình đào tiền ảo. Phân tích tĩnh sẽ không bắt được điều này vì bản thân image ban đầu là “sạch”. Bạn cần một hệ thống hoạt động như một camera an ninh cho Linux kernel của mình. Nó phải giám sát mọi hành động mà container thực hiện trong thời gian thực. Đây chính là lúc Falco tỏa sáng.

Cách Falco sử dụng Syscall để bảo vệ Cluster của bạn

Falco là một công cụ bảo mật runtime mã nguồn mở hoạt động như một “hộp đen” ghi lại hành trình cho hệ thống của bạn. Nó hoạt động bằng cách can thiệp vào Linux kernel để giám sát các system call (syscall). Tương tự như cách bạn có thể sử dụng Auditd để ứng phó sự cố trên Linux, Falco chặn các yêu cầu này và so sánh chúng với các chính sách bảo mật của bạn.

Triển khai Falco dưới dạng DaemonSet đảm bảo rằng mọi worker node trong cluster đều được bảo vệ. Trên các kernel hiện đại (phiên bản 5.8 trở lên), tôi khuyên bạn nên sử dụng eBPF driver. Khác với các kernel module truyền thống, eBPF ít xâm lấn hơn và ổn định hơn đáng kể. Nó cung cấp khả năng quan sát sâu mà không có nguy cơ gây lỗi kernel panic làm sập toàn bộ node.

Điều kiện tiên quyết để triển khai

Trước khi bắt đầu cài đặt, hãy đảm bảo môi trường của bạn đáp ứng các yêu cầu sau:

  • Một cụm Kubernetes (v1.20+ là tiêu chuẩn, nhưng v1.24+ sẽ tốt hơn để hỗ trợ eBPF hiện đại).
  • Helm 3 đã được cài đặt trên máy cục bộ.
  • Context của kubectl đã được thiết lập tới cluster mục tiêu.

Bước 1: Cài đặt Falco bằng Helm

Helm là cách hiệu quả nhất để quản lý vòng đời của Falco. Hãy bắt đầu bằng cách thêm repository chính thức của falcosecurity và cập nhật cache chart cục bộ của bạn.

helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

Tiếp theo, hãy tạo một namespace riêng cho stack bảo mật của bạn. Trong lệnh cài đặt bên dưới, chúng ta kích hoạt eBPF driver. Đây là tiêu chuẩn vàng cho môi trường production vì nó xử lý khối lượng syscall lớn mượt màng hơn so với module cũ.

kubectl create namespace falco

helm install falco falcosecurity/falco \
  --namespace falco \
  --set driver.kind=ebpf \
  --set tty=true

Đợi một lát để các pod khởi tạo. Bạn có thể kiểm tra trạng thái trên tất cả các node bằng lệnh này:

kubectl get pods -n falco -o wide

Bước 2: Tùy chỉnh các quy tắc phát hiện

Ngay sau khi cài đặt, Falco đã bao gồm một bộ quy tắc mạnh mẽ để bắt các dấu hiệu khả nghi phổ biến. Nó sẽ cảnh báo nếu một shell được mở bên trong container hoặc nếu một tiến trình cố gắng ghi vào thư mục hệ thống nhạy cảm. Tuy nhiên, mỗi môi trường production đều có những đặc thù riêng. Cuối cùng, bạn sẽ cần viết logic tùy chỉnh.

Các quy tắc của Falco sử dụng cú pháp YAML dễ đọc. Chúng bao gồm **Macros** (các đoạn mã có thể tái sử dụng), **Lists** (nhóm các mục) và **Rules** (logic cốt lõi). Đây là một quy tắc tùy chỉnh mà tôi thường dùng để phát hiện các công cụ quét mạng bên trong các pod production:

- rule: Công cụ mạng được thực thi trong Pod
  desc: Phát hiện việc thực thi nmap, dig hoặc nc bên trong container
  condition: spawned_process and container.id != host and proc.name in (nmap, dig, nc, tcpdump)
  output: "Phát hiện công cụ mạng khả nghi (user=%user.name command=%proc.cmdline container_id=%container.id)"
  priority: WARNING

Bạn có thể đưa các quy tắc tùy chỉnh này vào bằng cách cập nhật file values.yaml của Helm hoặc bằng cách mount một ConfigMap riêng biệt vào các pod Falco.

Bước 3: Định tuyến cảnh báo với Falcosidekick

Theo mặc định, Falco gửi cảnh báo tới stdout. Trong một cluster có lưu lượng truy cập cao, các log này sẽ nhanh chóng biến mất trong mớ hỗn độn. Để dữ liệu bảo mật có thể sử dụng được, bạn cần định tuyến cảnh báo tới các nền tảng như Slack, Teams hoặc ELK stack, tương tự như quy trình giám sát an ninh với Wazuh.

Falcosidekick là người bạn đồng hành hoàn hảo cho việc này. Nó hoạt động như một bộ chuyển tiếp (forwarder) cho các sự kiện bảo mật của bạn. Khi cấu hình tích hợp—đặc biệt là khi tạo webhook bảo mật cho Slack—tôi thường sử dụng trình tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator. Nó chạy hoàn toàn trong trình duyệt của bạn. Điều này đảm bảo các API secret nhạy cảm không bao giờ bị truyền qua mạng trong quá trình tạo.

Để cài đặt Falco cùng với Sidekick và một dashboard trực quan, hãy chạy:

helm upgrade --install falco falcosecurity/falco \
  --namespace falco \
  --set driver.kind=ebpf \
  --set falcosidekick.enabled=true \
  --set falcosidekick.webui.enabled=true

Truy cập dashboard cục bộ bằng cách port-forward service tới máy của bạn:

kubectl port-forward svc/falco-falcosidekick-ui 2801:2801 -n falco

Truy cập vào http://localhost:2801 để xem luồng sự kiện bảo mật theo thời gian thực.

Bước 4: Kiểm tra hệ thống phòng thủ

Kiểm tra là cách duy nhất để đảm bảo hệ thống giám sát của bạn thực sự hoạt động. Hãy thử kích hoạt cảnh báo “Terminal shell in container”. Đây là một sự kiện ưu tiên cao, thường cho thấy ai đó đang can thiệp thủ công vào pod của bạn. Mở một terminal và chạy:

kubectl run -it --rm alpine --image=alpine -- sh

Bên trong container, hãy chạy lệnh whoami hoặc ls /etc. Kiểm tra log của Falco hoặc UI của Sidekick. Bạn sẽ thấy một đối tượng JSON tương tự như thế này:

{ "priority": "Notice", "rule": "Terminal shell in container", "output": "Một shell đã được tạo trong container với terminal được đính kèm..." }

Các thực hành tốt nhất cho môi trường Production

Triển khai Falco mới chỉ là bước đầu tiên. Để tránh hiện tượng “alert fatigue” (mệt mỏi vì quá nhiều cảnh báo) và các vấn đề hiệu năng, hãy nắm vững các nguyên tắc cơ bản về bảo mật container và ghi nhớ các mẹo sau:

  • Thiết lập giới hạn tài nguyên (Resource Limits): Trên các node rất bận rộn, Falco có thể gây đột biến mức sử dụng CPU. Hãy giới hạn pod ở mức 500m CPU và 512MiB RAM để bảo vệ khối lượng công việc của ứng dụng.
  • Tinh chỉnh quy tắc: Bắt đầu ở chế độ “Audit”. Xác định các tiến trình hợp lệ nhưng lại kích hoạt cảnh báo giả (false positive) và thêm chúng vào các exception macro.
  • Luôn dùng eBPF: Nó an toàn hơn cho kernel. Các module truyền thống dễ gặp vấn đề tương thích khi nâng cấp hệ điều hành của node.
  • Tập trung hóa Log: Chuyển tiếp mọi thứ tới một SIEM như Grafana Loki. Điều này cho phép bạn đối chiếu cảnh báo syscall với log ứng dụng để phản ứng sự cố nhanh hơn.

Lời kết

Bảo mật Kubernetes đòi hỏi nhiều lớp phòng thủ. Trong khi RBAC và Network Policy giới hạn phạm vi rủi ro, Falco cung cấp “mắt và tai” cần thiết để phát hiện một vụ xâm nhập đang diễn ra. Bằng cách giám sát ở cấp độ kernel, bạn có được khả năng quan sát mà các phương pháp ghi log thông thường không thể cung cấp, giúp ích rất nhiều cho quá trình ứng phó sự cố Linux thực chiến. Hãy bắt đầu với những điều cơ bản, tinh chỉnh các quy tắc theo thời gian và biến cluster của bạn thành một môi trường khắc nghiệt đối với những kẻ tấn công.

Share: