- Published on
Linux Capabilities trong Containers và Kubernetes
- Authors
- Name
- Bạch Đăng Tuấn
- Occupation
- Kỹ sư công nghệ thông tin
- Zalo: 0934.01.07.04
🔐 Linux Capabilities trong Containers & Kubernetes
📑 Mục Lục
- Linux Capabilities là gì?
- Ví dụ về Linux Capabilities
- Các loại System Call thường gặp
- Linux Capabilities trong Containers
- Linux Capabilities trong Kubernetes
- 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 containers và Kubernetes.
- 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
Capability | Mục đích |
---|---|
CAP_NET_BIND_SERVICE | Mở cổng nhỏ hơn 1024 |
CAP_NET_ADMIN | Quản lý cấu hình mạng |
CAP_SYS_TIME | Thay đổi thời gian hệ thống |
CAP_DAC_OVERRIDE | Bỏ qua kiểm tra phân quyền file |
CAP_CHOWN | Thay đổi chủ sở hữu file |
CAP_NET_RAW | Gửi/nhận gói tin raw (ví dụ: ping, tcpdump) |

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
và--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) và Group ID(GID) của file.