Bảo mật Linux thời gian thực với Tetragon và eBPF: Ngăn chặn tấn công ở cấp độ Kernel

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

Loại bỏ các điểm mù ở cấp độ Kernel

Tôi đã từng chứng kiến một máy chủ phải hứng chịu 15.000 nỗ lực tấn công brute-force SSH chỉ trong một giờ. Mặc dù tường lửa có thể chặn các IP đó, nhưng nó chỉ giải quyết được phần rìa. Nếu kẻ tấn công khai thác lỗ hổng zero-day trong ứng dụng web để leo thang đặc quyền Linux hoặc thoát khỏi một container cấu hình sai, các bản ghi log truyền thống thường sẽ im hơi lặng tiếng cho đến khi thiệt hại không thể cứu vãn. Bạn không chỉ đang mò kim đeo bể; bạn đang tìm kiếm một cây kim đang tích cực đốt cháy cả đống rơm đó.

Các công cụ cũ như auditd hoặc syslog về cơ bản mang tính phản ứng. Chúng ghi lại kết quả của một cuộc tấn công thay vì ngăn chặn nó. Trong các môi trường mật độ cao như Kubernetes, chúng ta cần thấy những gì kernel đang làm ngay khi nó xảy ra. Chúng ta cần khả năng tiêu diệt một tiến trình độc hại trước khi nó kịp hoàn thành lời gọi hệ thống (system call) đầu tiên. Đây là lý do tại sao eBPF và Tetragon đang trở thành tiêu chuẩn mới để ngăn chặn các cuộc tấn công cấp Root cho bảo mật runtime.

Vấn đề: Độ trễ giữa phát hiện và hành động

Hầu hết các giải pháp bảo mật dựa vào việc giám sát ở không gian người dùng (user-space). Khi một tiến trình chạy một script độc hại, hệ điều hành sẽ tạo ra một bản ghi log. Vào thời điểm SIEM của bạn phân tích xong mục đó và gửi cảnh báo cho kỹ sư, kẻ tấn công đã kịp trích xuất các file .env hoặc mã hóa cơ sở dữ liệu của bạn. Trong thế giới của các cuộc khai thác tự động, độ trễ năm phút là cả một thiên niên kỷ.

Thực tế về gánh nặng hiệu năng

Giám sát truyền thống thường buộc phải đánh đổi giữa bảo mật và tốc độ:

  • Gánh nặng CPU: Các công cụ như auditd có thể làm tăng mức sử dụng CPU từ 20% đến 30% trên các hệ thống có lưu lượng truy cập cao do việc chuyển đổi ngữ cảnh (context switching) liên tục giữa kernel và user-space.
  • Phòng thủ thụ động: Giám sát Tiến trình truyền thống thường được thiết kế để quan sát chứ không phải can thiệp. Chúng không thể dừng một tiến trình trong micro giây khi nó cố gắng truy cập vào /etc/shadow.

So sánh các lựa chọn: Bảo mật truyền thống vs. Bảo mật dựa trên eBPF

Tetragon chuyển logic từ user-space trực tiếp vào kernel. Dưới đây là bảng so sánh với các phương pháp cũ hơn.

Tính năng Auditd / Syslog Falco (Tiêu chuẩn) Tetragon (eBPF)
Cơ chế Kiểm tra Syscall Kernel Module / eBPF eBPF thuần túy
Hiệu năng Thấp (Chuyển đổi ngữ cảnh nặng) Trung bình Cao (Gốc Kernel)
Chặn thời gian thực Không Hạn chế (qua sidecars) Có (Thực thi trong Kernel)
Độ chi tiết Cấp độ tiến trình Cấp độ syscall Cấp độ hàm (Kernel sâu)

Tại sao chọn Tetragon? (Và những hạn chế)

Lợi ích

  • Thực thi không độ trễ: Vì logic bảo mật nằm trong kernel, Tetragon có thể dừng một hành động trước khi nó hoàn tất.
  • Ngữ cảnh phong phú: Nó không chỉ hiển thị ID tiến trình; nó ánh xạ các sự kiện tới các pod Kubernetes, namespace và siêu dữ liệu của file thực thi.
  • Giảm thiểu tức thì: Bạn có thể cấu hình một “SIGKILL” để chấm dứt một tiến trình ngay khi nó vi phạm chính sách.

Đánh đổi

  • Yêu cầu Kernel hiện đại: Bạn sẽ cần Linux kernel 5.4 trở lên. Đối với các tính năng nâng cao như thực thi chức năng, yêu cầu bắt buộc là 5.10+.
  • Đường cong học tập: Việc soạn thảo TracingPolicies yêu cầu bạn hiểu cách Linux xử lý các lời gọi hệ thống và các hàm kernel.

Thiết lập khuyến nghị

Đối với môi trường production, tôi khuyên bạn nên chạy Tetragon dưới dạng Kubernetes DaemonSet. Đối với các máy chủ độc lập, một dịch vụ systemd sẽ hoạt động tốt nhất. Hướng dẫn này sử dụng cách tiếp cận container hóa—đây là cách nhanh nhất để thấy công cụ hoạt động mà không làm xáo trộn hệ điều hành máy chủ của bạn.

Điều kiện tiên quyết

  • Một máy Linux (Ubuntu 22.04 hoặc tương đương).
  • Đã cài đặt Docker.
  • Hỗ trợ BTF (BPF Type Format) (tiêu chuẩn trên các kernel hiện đại; kiểm tra qua ls /sys/kernel/btf).

Triển khai từng bước

1. Khởi chạy Tetragon

Bắt đầu bằng cách chạy container Tetragon. Nó cần quyền ưu tiên (privileged) để can thiệp vào kernel máy chủ.

docker run --name tetragon --rm \
  --privileged -v /sys/kernel/debug:/sys/kernel/debug \
  -v /proc:/proc -v /etc/os-release:/etc/os-release \
  quay.io/cilium/tetragon:v1.0.0

Mở một terminal thứ hai để giám sát các sự kiện khi chúng xảy ra:

docker exec tetragon tetra logs

2. Tạo chính sách toàn vẹn file

Hãy bắt bất kỳ ai cố gắng đọc /etc/shadow. File này chứa mã băm mật khẩu và là mục tiêu hàng đầu của những kẻ tấn công. Chúng ta sẽ sử dụng TracingPolicy để giám sát lời gọi hệ thống sys_openat.

Lưu file này với tên monitor-shadow.yaml:

apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "giám-sát-etc-shadow"
spec:
  kprobes:
    - call: "sys_openat"
      syscall: true
      args:
        - index: 1
          type: "string"
      selectors:
        - matchArgs:
            - index: 1
              operator: "Equal"
              values:
                - "/etc/shadow"
      actions:
        - action: Post

Sau khi áp dụng chính sách này, hãy thử chạy sudo cat /etc/shadow. Tetragon sẽ lập tức ghi lại sự kiện, bao gồm người dùng và lệnh chính xác đã được sử dụng.

3. Kích hoạt “Kill Switch” (Công tắc ngắt)

Đây là nơi mọi thứ trở nên thú vị. Thay vì chỉ ghi lại một sự kiện, hãy ngăn chặn kẻ tấn công chạy các công cụ trái phép như nmap. Chúng ta có thể chỉ thị kernel gửi một SIGKILL trước khi tiến trình kịp bắt đầu.

Tạo file block-nmap.yaml:

apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "chặn-thực-thi-nmap"
spec:
  kprobes:
    - call: "sys_execve"
      syscall: true
      args:
        - index: 0
          type: "string"
      selectors:
        - matchArgs:
            - index: 0
              operator: "Equal"
              values:
                - "/usr/bin/nmap"
      actions:
        - action: Sigkill

Nếu kẻ tấn công tìm cách tải xuống nmap và cố gắng chạy nó, tiến trình sẽ bị chấm dứt ngay lập tức. Họ sẽ thấy một thông báo “Killed” cụt lủn trong terminal, và mạng của bạn vẫn an toàn không bị quét.

Xem lại dữ liệu

Các bản ghi JSON thô rất khó đọc trong khi một sự cố đang diễn ra. Hãy sử dụng công cụ CLI tetra để có một cây tiến trình sạch sẽ, dễ đọc:

docker exec tetragon tetra getevents -o compact

Điều này cung cấp một dòng thời gian rõ ràng về các sự kiện PROCESS START, FILE OPEN, và SIGKILL. Nó cho phép bạn tái dựng toàn bộ vòng đời cuộc tấn công chỉ trong vài giây.

Lời kết

Bảo mật hiện đại không chỉ là xây dựng những bức tường cao hơn; đó là về khả năng hiển thị toàn diện bên trong những bức tường đó. Bằng cách chuyển hệ thống phòng thủ của bạn vào kernel với eBPF, bạn loại bỏ được độ trễ mà kẻ tấn công thường dựa vào. Sau trải nghiệm của tôi với cuộc tấn công SSH vào giữa đêm đó, tôi nhận ra rằng việc ghi log thụ động là không đủ. Có được sức mạnh để tiêu diệt một tiến trình độc hại trong thời gian thực mang lại loại bảo mật thực sự giúp bạn có thể ngủ ngon giấc.

Hãy bắt đầu bằng cách giám sát các thư mục nhạy cảm nhất của bạn. Khi bạn đã quen với cú pháp, hãy chuyển sang chặn chủ động các file thực thi có rủi ro cao. Đó là một bước chuyển mình lớn từ việc chỉ đơn thuần đứng nhìn hệ thống thất bại sang việc chủ động bảo vệ nó.

Share: