Giám sát trên môi trường K8S – Phần 1
Những năm gần đây, việc triển khai các ứng dụng thông qua Docker trở nên phổ biến, docker container đem lại sự đơn giản và linh hoạt hơn cho quá trình triển khai, khắc phục những hạn chế so với cách thức triển khai truyền thống. Bằng cách đóng gói ứng dụng và các cấu hình vào trong một container, việc di chuyển và triển khai các ứng dụng trở nên dễ dàng hơn bao giờ hết. Tuy nhiên, với sự gia tăng của số lượng container và các yêu cầu phức tạp hơn, cần có một công cụ mạnh mẽ hơn để quản lý chúng. Điều này dẫn đến sự ra đời của Kubernetes. Mặc dù bài viết này tập trung chính vào việc giới thiệu Falco – công cụ hỗ trợ giúp giám sát tấn công trên môi trường K8s, nhưng trước đó hãy xem xét qua một số nội dung cơ bản về K8S.
Kubernetes (hay K8S) là một nền tảng mã nguồn mở được phát triển bởi Google, được thiết kế để giải quyết các thách thức liên quan đến triển khai và quản lý hàng trăm, thậm chí hàng nghìn container. Với Kubernetes, việc tự động hóa quy trình triển khai và quản lý các ứng dụng trở nên dễ dàng hơn bao giờ hết. Tính linh hoạt, khả năng mở rộng dễ dàng và sự độc lập với nền tảng hạ tầng là những lợi ích chính mà Kubernetes mang lại.
Kiến trúc của K8S được thiết kế để quản lý và tự động hóa việc triển khai, mở rộng và vận hành các ứng dụng chứa (containerized applications) trên các môi trường máy chủ vật lý, máy chủ ảo hoặc môi trường cloud. Kiến trúc cơ bản của Kubernetes thông thường sẽ bao gồm 2 thành phần master node và worker node. Ở một số phiên bản khác, ví dụ như K3S hoặc MicroK8S (thường hay được sử dụng cho quá trình thử nghiệm), 2 thành phần này sẽ được gộp chung thành một node.

Master Node là một thành phần quan trọng trong Kubernetes giúp điều khiển và quản lý hoạt động của toàn bộ cụm (cluster) .Master Node bao gồm các thành phần sau:
Worker Node là nơi thực hiện công việc chạy các container và là nơi ứng dụng thực sự chạy. Mỗi Worker Node bao gồm các thành phần sau:
Hãy điểm qua một số khái niệm mà chúng ta sẽ gặp xuyên suốt bài viết
Chúng ta đã lướt qua một số các nội dung rất cơ bản của K8S, dù được triển khai và xây dựng ở môi trường nào, các vấn đề về bảo mật, giám sát cũng luôn cần thiết. Như trên Windows, chúng ta có các thành phần quen thuộc hỗ trợ giám sát như Window Logs, Symon hay auditd, syslog, osquery trên Linux thì trong môi trường Kubernetes, câu trả lời là Falco.
Falco là công cụ cloud-native security, cung cấp khả năng giám sát cũng như phát hiện thời gian thực (real-time) các hành vi tấn công dựa theo tập luật trên môi trường host, cloud, container và K8s. Ban đầu, Falco được phát triển bởi Sysdig – một công ty chuyên về giám sát và bảo mật hệ thống và ứng dụng container. Về sau, Falco được chuyển giao cho Cloud Native Computing Foundation (CNCF), một tổ chức phi lợi nhuận uy tín chịu trách nhiệm quản lý nhiều dự án mã nguồn mở cho các hệ thống Cloud Native (ví dụ như Kubernetes, Prometheus, Envoy hay nhiều dự án khác).
Falco hoạt động ở cả 2 phân vùng userspace và kernel. Trong phân vùng kernel, các lời gọi hệ thống (syscalls) sẽ được thu thập bởi một trình điều khiển (driver), ví dụ như kernel module, eBPF probe hoặc modern eBPF probe. Các syscalls này sẽ được lưu trong ring buffer (ring buffer hay cyclic buffer là một cấu trúc dữ liệu được sử dụng để lưu trữ dữ liệu tạm thời trong bộ nhớ, hoạt động như một hàng đợi – circular queue) sau đó mới chuyển vào user space, các events này sẽ được xử lý thông qua rules engine với các tập luật được đã được định nghĩa. Theo mặc định,Falco đã có sẵn những tập luật cơ bản, ngoài ra cũng cho phép người dùng thêm, ngắt hoặc sửa đổi để phù hợp với nghiệp vụ từng hệ thống. Nếu Falco phát hiện bất kỳ các events bất thường, alert sẽ được trigger và thông báo tới đa dạng các endpoints khác nhau tùy thuộc vào cấu hình

Falco thu thập các sự kiện (events) từ một hoặc nhiều source và so sánh từng sự kiện này với một tập luật (có sẵn và có thể tùy chỉnh) để phát hiện các hành vi bất hường. Ví dụ, đối với system call (syscalls), các events sẽ được driver của Falco xử lý để thu thập.
Sau khi một hoặc nhiều events khớp với tập luật, các cảnh báo này sẽ được chuyển tiếp tới nhiều nguồn khác nhau (syslog, stdout, HTTPS, và gRPC endpoints) hoặc thông qua Falcosidekick, một trong những công cụ/thành phần có sẵn trong Falco, cho phép tích hợp với các ứng dụng hoặc dịch vụ khác (slack, email, v.v…)

Bên cạnh việc cấu hình trên K8S, Falco cũng cho phép cài đặt trên môi trường host hoặc cài đặt thông qua docker. Ở phạm vi bài viết, chúng tôi chỉ giới thiệu cách thức cài đặt trên môi trường K8s. Cách thức cài đặt trên host và thông qua docker bạn đọc có thể tham khảo thêm trên trang chủ của Falco. Trước khi cài đặt Falco, hãy đảm bảo đã cấu hình cài đặt môi trường K8s và các công cụ hỗ trợ liên quan. Đơn giản và dễ cài đặt, bạn đọc có thể cài đặt K3S làm môi trường để thử nghiệm và thực hành, cách thức cài đặt tham khảo tại đây (để ý về cấu hình firewall trong quá trình cài đặt)
Bài viết sẽ cài đặt Falco thông qua Heml (package manager) với chế độ DaemonSet, việc triển khai theo chế độ này sẽ thêm Falco vào mỗi node trong cluster.Để cài đặt Falco trên môi trường K8S, người dùng hãy đảm bảo Helm đang sử dụng phiên bản mới nhất
Có bốn bước chính để cài đặt và chạy Falco trên máy chủ thành công:
Trước khi thực hiện cài đặt Falco trong Kubernetes cluster, chúng ta sẽ thực hiện kiểm tra phiên bản của kernel sử dụng trong nodes có được hỗ trợ hay không. Việc kiểm tra này nhằm cài đặt kernel header để tương thích với các driver mà Falco sử dụng. Câu lệnh như sau:
apt search linux-headers-$(uname -r)
apt-get -y install linux-headers-$(uname -r)
apt search linux-headers-$(uname -r)

Trước khi cài đặt, thêm falcosecurity charts repository sử dụng câu lệnh sau:
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
Thực hiện tạo namespace cho Falco và cài đặt Falco chart thông qua các câu lệnh dưới đây:
kubectl create ns falco
helm install falco
-n falco
–version 2.4.2
–set tty=true
–set collectors.containerd.enabled=true
–set collectors.containerd.socket=/run/k3s/containerd/containerd.sock
falcosecurity/falco

Lưu ý: Môi trường cài đặt đang sử dụng containerd thay vì docker, người dùng cần lưu ý sử dụng phù hợp socket
Sau một vài phút, các phiên bản Falco sẽ chạy trên tất cả các node.Do không chỉ định driver cụ thể, theo mặc định quá trình cài đặt sẽ sử dụng kernel module. Trạng thái của nhóm Falco có thể được kiểm tra thông qua kubectl:

Chúng ta sẽ thử nghiệm Falco với một use case cơ bản, kẻ tấn công thu thập thông tin nhạy cảm trên hệ thống, trong trường hợp này là tìm kiếm SSH private key trong tệp tin id_rsa. Với thông tin SSH private key này, kẻ tấn công có thể thực hiện xác thực đăng nhập SSH thông qua key. Thực hiện test case, chúng ta thu được kết quả như hình dưới đây, hành vi tìm kiếm kiếm file id_rsa đã trigger rule của Falco

Có một vài điểm quan trọng sau cần để ý trong quá trình triển khai:
Ở phần trước, bạn đọc đã được giới thiệu về cách thức cấu hình để giám sát các lời gọi hệ thống. Tuy nhiên, Falco không chỉ dừng lại ở việc giám sát các lời gọi hệ thống (thực thi câu lệnh, ssh…) mà còn hỗ trợ cho việc thu thập các sự kiện (events) từ nguồn Kubernetes Audit Logs hay đa dạng các nguồn khác như AWS CloudTrail, Okta, thông qua falco plugin. Theo cách này, người dùng cũng có thể tự tạo được plugin của riêng mình để thu thập các nguồn events khác.

Với nguồn sự kiện từ Audit Logs của K8S, hệ thống giám sát sẽ có thu thập được các sự kiện, các tác vụ tác động đến cluster giúp phát hiện các hành vi, hoạt động bất thường trong cluster. Để thu thập các sự kiện này, K8S cluster cần enable audit logs và cấu hình gửi audit logs này tới plugin k8saudit. Chúng ta sẽ thực hiện cấu hình lấy log source từ K8S audit logs trên môi trường K3S bằng một loại các hướng dẫn dưới đây:
mkdir -p /var/lib/rancher/audit
touch /var/lib/rancher/audit/audit.log
chmod 777 /var/lib/rancher/audit/audit.log
wget https://raw.githubusercontent.com/falcosecurity/contrib/main/examples/k8s_audit_config/audit-policy.yaml
cp audit-policy.yaml /var/lib/rancher/audit/
cat << EOF | sudo tee /var/lib/rancher/audit/webhook-config.yaml
apiVersion: v1
kind: Config
clusters:
– name: falco
cluster:
server: http://localhost:30007/k8s-audit
contexts:
– context:
cluster: falco
user: “”
name: default-context
current-context: default-context
preferences: {}
users: []
EOF

curl https://raw.githubusercontent.com/falcosecurity/charts/falco-2.4.2/falco/values-k8saudit.yaml -o values.yaml

helm install falco
–version 2.4.2
–create-namespace
–namespace falco
–set tty=true
–set falcosidekick.enabled=true
–set falcosidekick.webui.enabled=true
–values=values.yaml
falcosecurity/falco

Ở phần 1, chúng tôi đã giới thiệu cơ bản về K8S, công cụ giám sát Falco cũng như cách thức cấu hình một số log sources và một số điểm lưu ý trong quá trình cài đặt. Phần 1 sẽ kết thúc ở đây, ở các phần sau, chúng tôi sẽ giới thiệu về tập luật và các ứng dụng mà Falco hỗ trợ để hiển thị các cảnh báo.
Author: Purple Team