Bảo Mật Kubernetes (K8s)
Một infographic toàn diện về lý thuyết và thực hành, giúp bạn làm chủ nghệ thuật bảo vệ các hệ thống Cloud-Native.
Phần I: Nền Tảng của Bảo Mật Cloud-Native
Chương 1: Định Nghĩa Mô Hình Bảo Mật Kubernetes
1.1 Bảo mật K8s là gì?
Không phải là một công cụ đơn lẻ, mà là một tập hợp toàn diện các kỹ thuật, quy trình và biện pháp kiểm soát để bảo vệ nền tảng và ứng dụng. Nó đòi hỏi sự phối hợp giữa DevOps, SecOps và CloudOps để thiết kế một kiến trúc bảo mật đa tầng, trải dài toàn bộ vòng đời ứng dụng.
Phòng thủ theo Chiều sâu (Defense-in-Depth)
Triển khai các lớp kiểm soát bảo mật chồng chéo lên container, orchestrator, và hạ tầng cloud. Nếu một lớp bị xuyên thủng, các lớp tiếp theo sẽ ngăn chặn kẻ tấn công.
Mô hình Trách nhiệm Chia sẻ (Shared Responsibility)
Nhà cung cấp Cloud (CSP): Chịu trách nhiệm bảo mật CỦA đám mây (hạ tầng vật lý, control plane...).
Khách hàng: Chịu trách nhiệm bảo mật TRONG đám mây (workloads, data, IAM, network policies...).
1.3 Khung Bảo mật 4C của Cloud-Native
Cloud
Cluster
Container
Code
Mỗi lớp xây dựng trên lớp bên ngoài nó. Lỗ hổng ở lớp ngoài sẽ làm suy yếu các lớp bên trong.
Chương 2: Bối cảnh Đe dọa: Góc nhìn của Kẻ tấn công
2.1 Bề mặt Tấn công (Attack Surface)
Vectơ tấn công chính: Các cấu hình sai (misconfigurations) như RBAC quá rộng, thiếu Network Policies, hoặc để lộ API Server ra internet.
2.2 Khung MITRE ATT&CK® cho Containers
Một kho tri thức toàn cầu về chiến thuật và kỹ thuật của đối thủ, giúp ưu tiên các nỗ lực phòng thủ.
| Chiến thuật | Kỹ thuật chính | Ví dụ trong Kubernetes |
|---|---|---|
| Initial Access | Exploit Public-Facing Application | Lỗ hổng Log4Shell trong ứng dụng web. |
| Execution | Deploy Container | Triển khai một container độc hại qua API. |
| Persistence | Container Orchestration Job | Tạo CronJob để tái thiết lập backdoor. |
| Privilege Escalation | Escape to Host | Khai thác container có đặc quyền (privileged). |
| Defense Evasion | Build Image on Host | Xây dựng image độc hại trên node đã bị xâm nhập. |
| Credential Access | Steal Application Access Token | Đọc service account token từ /var/run/secrets/... |
| Discovery | Container and Resource Discovery | Dùng token bị xâm nhập để truy vấn secrets, pods. |
| Lateral Movement | Use Alternate Authentication Material | Dùng token bị đánh cắp để truy cập các pod khác. |
| Impact | Resource Hijacking | Triển khai container đào tiền ảo (cryptomining). |
2.3 Phân tích một Chuỗi Tấn công trong Thế giới thực
Giai đoạn 1: Initial Access (Lớp Code)
Kẻ tấn công khai thác lỗ hổng ứng dụng web để có được web shell bên trong container.
Giai đoạn 2: Cluster Reconnaissance (Lớp Cluster)
Sử dụng service account token mặc định để truy vấn API Server, liệt kê pods, secrets và vẽ bản đồ cụm.
Giai đoạn 3: Container Escape (Lớp Container/Cluster)
Khai thác container chạy ở chế độ privileged: true để thoát ra worker node bên dưới.
Giai đoạn 4: Credential Theft (Lớp Cloud)
Truy cập Instance Metadata Service (IMDS) của cloud provider để đánh cắp thông tin xác thực IAM của node.
Giai đoạn 5: Privilege Escalation & Lateral Movement
Sử dụng thông tin xác thực cloud bị đánh cắp để leo thang đặc quyền trong môi trường cloud hoặc di chuyển sang các pod khác.
Giai đoạn 6: Impact
Thực hiện mục tiêu: triển khai máy đào tiền ảo, đánh cắp dữ liệu, hoặc gây ra Denial of Service.
Phần II: Bảo Mật Cơ sở hạ tầng (Lớp Cloud & Cluster)
Chương 3: Làm cứng Nền tảng Đám mây (Chữ 'C' thứ nhất)
Hạ tầng Nền
- Sử dụng OS được làm cứng (Container-Optimized OS).
- Vá lỗi OS và kernel thường xuyên.
- Áp dụng các thông số kernel theo CIS Benchmarks.
IAM cho Kubernetes
- Áp dụng nguyên tắc Đặc quyền Tối thiểu.
- Hạn chế tối đa quyền của vai trò IAM gán cho worker node.
Bảo mật Mạng
- Cô lập cụm trong VPC/private subnets.
- KHÔNG BAO GIỜ để lộ API Server ra Internet.
- Đặt worker nodes trong subnet riêng tư.
Chương 4: Củng cố Control Plane (Chữ 'C' thứ hai: Cluster)
4.1 Bảo mật API Server: Cổng vào Cụm
Đây là trung tâm điều khiển và là mục tiêu chính. Các cờ cấu hình quan trọng cho kube-apiserver:
# Vô hiệu hóa truy cập ẩn danh
--anonymous-auth=false
# Sử dụng RBAC và Node authorizer, không bao giờ dùng AlwaysAllow
--authorization-mode=Node,RBAC
# Vô hiệu hóa cổng không an toàn
--insecure-port=0
# Bật ghi log kiểm toán
--audit-log-path=/var/log/audit.log
# Bật mã hóa secrets khi lưu trữ trong etcd
--encryption-provider-config=/path/to/encryption-config.yaml
4.2 Kho dữ liệu etcd: Bảo vệ Trạng thái của Cụm
Etcd lưu trữ toàn bộ trạng thái cụm, bao gồm cả secrets. Truy cập trực tiếp vào etcd tương đương với quyền admin cao nhất.
- Kiểm soát mạng: Chỉ cho phép API server truy cập etcd (port 2379).
- Xác thực mTLS: Thực thi mutual TLS cho mọi giao tiếp với etcd.
- Mã hóa khi lưu trữ (Encryption at Rest): Cấu hình API Server để mã hóa dữ liệu secrets trước khi ghi vào etcd. Đây là biện pháp TỐI QUAN TRỌNG.
Chương 5: Bảo mật Data Plane và Mạng trong Cụm
5.1 Làm cứng Worker Node và Kubelet
Kubelet là agent chính trên mỗi node. Cấu hình sai có thể dẫn đến RCE và chiếm quyền kiểm soát node.
- Vô hiệu hóa xác thực ẩn danh:
--anonymous-auth=false. - Ủy quyền xác thực và phân quyền cho API Server.
- Giới hạn truy cập mạng vào cổng của kubelet (10250) chỉ từ API server.
5.2 Chính sách Mạng (Network Policies)
Mặc định, K8s có mạng phẳng, mọi pod đều có thể giao tiếp với nhau. NetworkPolicy hoạt động như tường lửa gốc để phân đoạn mạng.
TRƯỚC: Mạng Phẳng (Mặc định)
Namespace 'app'
Rủi ro di chuyển ngang cao!
SAU: "Default Deny" + Allowlist
Namespace 'app'
Chỉ cho phép traffic cần thiết.
Bước 1: Bắt đầu với chính sách "Default Deny" (Chặn Mặc định).
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Bước 2: Tạo các chính sách "Allow" rõ ràng cho các luồng traffic cần thiết.
Chương 6: Xây dựng Container An toàn (Chữ 'C' thứ ba)
6.1 Thực hành Tốt nhất về Dockerfile
- Sử dụng base image tối giản (distroless, alpine).
- Chạy với người dùng không phải root.
- Sử dụng multi-stage builds.
- Ghim phiên bản cụ thể, không dùng `latest`.
- Sử dụng `.dockerignore` để tránh lộ file nhạy cảm.
# Tạo người dùng và nhóm không phải root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# Sao chép file và đặt quyền
COPY --chown=appuser:appgroup . .
# Chuyển sang người dùng không phải root
USER appuser
CMD ["./my-app"]
6.2 Bảo mật Chuỗi Cung ứng: Quét Lỗ hổng
Tích hợp việc quét image tự động vào CI/CD. Quy trình build nên thất bại nếu phát hiện lỗ hổng nghiêm trọng. Các công cụ phổ biến: Trivy, Clair.
# Quét một image với Trivy
$ trivy image my-app:1.0.0
Chương 7: Thực thi Cô lập Workload
7.1 Tiêu chuẩn Bảo mật Pod (PSS)
Cơ chế tích hợp để thực thi bảo mật cơ bản cho pod, thay thế cho PSP. Gồm 3 cấp độ: `privileged`, `baseline`, `restricted`. Áp dụng qua label trên namespace:
pod-security.kubernetes.io/enforce: restricted
7.2 Tìm hiểu sâu về securityContext
Định nghĩa các thiết lập đặc quyền và kiểm soát truy cập tại runtime. Các thiết lập quan trọng:
securityContext:
# Ngăn container chạy với quyền root
runAsNonRoot: true
runAsUser: 1001
# Ngăn chặn leo thang đặc quyền
allowPrivilegeEscalation: false
# Gắn hệ thống tệp gốc ở chế độ chỉ đọc
readOnlyRootFilesystem: true
# Loại bỏ tất cả các Linux capabilities
capabilities:
drop:
- "ALL"
# Áp dụng profile Seccomp mặc định của runtime
seccompProfile:
type: RuntimeDefault
Chương 8: Bảo mật Mã nguồn & Cấu hình (Chữ 'C' thứ tư)
8.1 Quản lý Secrets
Secrets gốc của Kubernetes mặc định chỉ được mã hóa base64. Thực hành tốt nhất: Sử dụng trình quản lý secrets bên ngoài như HashiCorp Vault hoặc AWS Secrets Manager, tích hợp qua Secrets Store CSI Driver.
8.2 Phân quyền Dựa trên Vai trò (RBAC)
Áp dụng nguyên tắc Đặc quyền Tối thiểu. Luôn ưu tiên Role (phạm vi namespace) thay vì ClusterRole (phạm vi toàn cụm).
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" chỉ core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
8.3 Quản lý Tài nguyên như một Biện pháp Bảo mật
Đặt requests và limits cho CPU/Memory là một biện pháp kiểm soát bảo mật quan trọng để ngăn chặn tấn công Từ chối Dịch vụ (DoS) do một container bị xâm nhập gây ra.
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Phần IV: Bảo mật Vận hành và Cải tiến Liên tục
Chương 9: Bảo mật Runtime và Phát hiện Mối đe dọa
Log Kiểm toán Kubernetes
Bật log kiểm toán của API server là bắt buộc. Chúng ghi lại mọi yêu cầu (ai, cái gì, khi nào, từ đâu) và là nguồn thông tin vô giá để điều tra sự cố. Chuyển log đến một hệ thống SIEM tập trung.
Phát hiện Mối đe dọa với Falco
Falco là công cụ tiêu chuẩn de facto để phát hiện mối đe dọa runtime. Nó theo dõi các lời gọi hệ thống (syscalls) ở cấp độ kernel để phát hiện hành vi bất thường trong thời gian thực.
# Quy tắc Falco ví dụ: Phát hiện shell trong container
- rule: Terminal shell in container
desc: A shell was spawned in a container.
condition: >
spawned_process and container and shell_procs
output: >
Shell spawned in container (user=%user.name...)
priority: INFO
Chương 10: Bộ Công cụ Bảo mật Kubernetes Chọn lọc
Một số công cụ mã nguồn mở thiết yếu để xây dựng bộ công cụ bảo mật của bạn.
Đánh giá & Tuân thủ
kube-bench: Kiểm toán theo CIS Benchmarks.
kube-hunter: Kiểm thử xâm nhập.
Kubescape: Phân tích rủi ro đa khung.
Chuỗi Cung ứng
Trivy: Quét lỗ hổng image.
Clair: Phân tích tĩnh lỗ hổng.
Syft/Grype: Tạo SBOM và quét.
Thực thi Chính sách
OPA/Gatekeeper: Policy-as-Code.
Kyverno: Công cụ chính sách gốc K8s.
Bảo mật Runtime
Falco: Phát hiện mối đe dọa thời gian thực.