Blog chia sẻ về công nghệ ...
Published on

Linux Capabilities trong Containers và Kubernetes

Authors

🔐 Linux Capabilities trong Containers & Kubernetes

📑 Mục Lục

  1. Linux Capabilities là gì?
  2. Ví dụ về Linux Capabilities
  3. Các loại System Call thường gặp
  4. Linux Capabilities trong Containers
  5. Linux Capabilities trong Kubernetes
  6. Kết Luận

Trong bài viết này, chúng ta sẽ tìm hiểu sâu hơn về Linux Capabilities – một cơ chế bảo mật mạnh mẽ nhưng ít được chú ý, đặc biệt quan trọng trong môi trường containersKubernetes.

  • Linux Capabilities là gì?
  • Cách Capabilities hoạt động bên trong containers
  • Thêm/bớt Capabilities trong pods Kubernetes
  • Cách phân tích Capabilities bằng systemd-analyze

Linux Capabilities là gì?

Trong hệ thống Linux truyền thống, quyền truy cập được chia thành hai loại chính:

  • Root (siêu người dùng): Có toàn quyền kiểm soát hệ thống, có thể thực hiện bất kỳ hành động nào.
  • Non-root (người dùng thông thường): Bị hạn chế quyền truy cập, chỉ có thể thực hiện một số hành động nhất định.

Vấn đề là, nếu một ứng dụng non-root cần thực hiện một thao tác yêu cầu quyền đặc biệt (ví dụ: liên kết với cổng mạng dưới 1024), nó phải chạy với quyền root. Điều này tạo ra rủi ro bảo mật lớn, vì nếu ứng dụng bị xâm phạm, kẻ tấn công sẽ có toàn quyền kiểm soát hệ thống.

Linux Capabilities ra đời để giải quyết vấn đề này bằng cách chia nhỏ quyền root thành các đơn vị nhỏ hơn, gọi là "capabilities". Mỗi capability cho phép một hành động cụ thể. Thay vì cấp toàn bộ quyền root cho ứng dụng, chúng ta chỉ cấp cho ứng dụng những capabilities cần thiết để thực hiện công việc của nó.

Ví dụ về Linux Capabilities

  • Ứng dụng cần liên kết với cổng mạng dưới 1024 chỉ cần được cấp capability CAP_NET_BIND_SERVICE.
  • Ứng dụng cần thay đổi quyền sở hữu tệp chỉ cần được cấp capability CAP_CHOWN.

Các loại System Call thường gặp

CapabilityMục đích
CAP_NET_BIND_SERVICEMở cổng nhỏ hơn 1024
CAP_NET_ADMINQuản lý cấu hình mạng
CAP_SYS_TIMEThay đổi thời gian hệ thống
CAP_DAC_OVERRIDEBỏ qua kiểm tra phân quyền file
CAP_CHOWNThay đổi chủ sở hữu file
CAP_NET_RAWGửi/nhận gói tin raw (ví dụ: ping, tcpdump)
linux-capabilities-trong-container-k8s

Linux Capabilities trong Containers

Containers (như Docker, containerd) thường chạy với UID 0 bên trong, nhưng được giới hạn capabilities để giảm rủi ro.

  • 🔐Cơ chế bảo vệ:

    • Docker và các runtime khác tự động loại bỏ nhiều capabilities không cần thiết.
    • Chỉ một tập hợp nhỏ capabilities được giữ lại, đủ để ứng dụng hoạt động bình thường.
  • 🧪Ví dụ thực tế:

    • Container không có CAP_NET_ADMIN sẽ không thể tạo giao diện mạng:
    • Dùng lệnh ip link add dummy0 sẽ bị từ chối.
    • Khi cấp thêm capability, container có thể thao tác mạng như mong muốn.
    • Điều này chứng minh rằng capabilities ảnh hưởng trực tiếp đến khả năng của container, bất kể UID có phải là root hay không.
  • 📌Tại sao cần hạn chế Capabilities?

    • Việc cấp quá nhiều Capabilities cho container có thể tạo ra lỗ hổng bảo mật. Nếu một container bị xâm phạm, kẻ tấn công có thể lợi dụng các Capabilities được cấp để thực hiện các hành động độc hại trên hệ thống host.
    • Do đó, nguyên tắc "ít đặc quyền nhất" (least privilege) nên được áp dụng. Chỉ cấp các Capabilities cần thiết cho container để thực hiện công việc của nó.
      Docker cho phép chúng ta kiểm soát Capabilities của container thông qua các tùy chọn --cap-add--cap-drop.
    • --cap-add: Thêm một capability vào container.
    • --cap-drop: Loại bỏ một capability khỏi container.

Linux Capabilities trong Kubernetes

Linux Capabilities là một tính năng của kernel Linux cho phép chia quyền root (superuser) thành các đơn vị nhỏ hơn. Trong Kubernetes, Linux Capabilities đóng vai trò quan trọng trong việc kiểm soát quyền truy cập của các containers chạy trong pods.

  • Tăng cường bảo mật: Kubernetes chạy các ứng dụng trong containers, và việc cấp quá nhiều quyền cho containers có thể tạo ra lỗ hổng bảo mật. Linux Capabilities cho phép chúng ta chỉ cấp những quyền cần thiết cho containers, giảm thiểu rủi ro nếu container bị xâm phạm.
  • Tuân thủ nguyên tắc "ít đặc quyền nhất": Nguyên tắc này khuyến khích chỉ cấp cho ứng dụng những quyền cần thiết để thực hiện công việc của nó. Linux Capabilities giúp chúng ta tuân thủ nguyên tắc này trong Kubernetes.

Chúng ta có thể cấu hình Linux Capabilities cho containers trong Kubernetes thông qua trường securityContext.capabilities trong pod hoặc deployment manifest.

Cấu trúc

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    securityContext:
      capabilities:
        add: ["CAP_NET_RAW"]
        drop: ["ALL"]

Ví dụ này tạo một pod với một container chỉ có capability CAP_NET_RAW.

Các Capabilities phổ biến trong Kubernetes

  CAP_NET_ADMIN: Cho phép thực hiện các thao tác quản trị mạng.
  CAP_NET_RAW: Cho phép sử dụng raw socket (ví dụ: ping).
  CAP_SYS_ADMIN: Cho phép thực hiện nhiều thao tác quản trị hệ thống (cần hạn chế sử dụng).
  CAP_DAC_OVERRIDE: Cho phép bỏ qua các quyền kiểm tra truy cập file.
  CAP_CHOWN: Cho phép thay đổi User ID(UID)Group ID(GID) của file.

Kết Luận

Linux Capabilities là một công cụ rất mạnh mẽ giúp thực hiện nguyên tắc "least privilege" — chỉ cấp quyền cần thiết cho tiến trình. Trong môi trường container và Kubernetes: Giới hạn capabilities là một lớp bảo mật cực kỳ hiệu quả. Áp dụng đúng giúp giảm thiểu rủi ro tấn công, bảo vệ hạ tầng từ sớm