Configuration, identity, RBAC và admission security
Kubernetes security không nằm ở một object duy nhất. Config/Secret, workload identity, RBAC, Pod hardening, admission policy và tenant isolation phải tạo thành nhiều lớp bảo vệ; một namespace hoặc một Secret object riêng lẻ không tự tạo ra security boundary mạnh.
1. ConfigMap and Secret
ConfigMap dành cho cấu hình không nhạy cảm; Secret dành cho dữ liệu như password, token hoặc key. Secret là Kubernetes API object — không phải secret manager hoàn chỉnh. Giá trị Secret thường được biểu diễn bằng base64 nhưng base64 chỉ là encoding, không phải encryption; dữ liệu Secret trong etcd cần được cấu hình encryption at rest và quyền đọc phải được giới hạn bằng RBAC.
| Cách đưa config vào Pod | Update behavior | Rủi ro / vận hành |
|---|---|---|
| Environment variable | Process nhận giá trị khi container start; thay đổi object không tự cập nhật biến môi trường của process đang chạy. | Cần rollout/restart để nhận version mới; secret có thể lộ qua process/debug tooling nếu vận hành kém. |
| Mounted / projected volume | Kubelet có thể cập nhật file sau một khoảng trễ; application vẫn phải đọc lại/reload. | Không giả định update là instant; cần xác định reload semantics và xử lý file rotation an toàn. |
| External secret store / CSI | Lifecycle phụ thuộc provider/driver và policy rotation. | Giảm secret material trong workflow Kubernetes nhưng thêm dependency, permission model và failure mode mới. |
Config và Secret cần có version/ownership rõ ràng. Khi thay đổi cấu hình có ảnh hưởng behavior, dùng immutable artifact hoặc checksum/version annotation để rollout workload có kiểm soát thay vì hy vọng process tự nhận cấu hình mới.
- Không commit Secret plaintext vào source repository, image layer hoặc manifest history.
- Hạn chế
get, đặc biệtlist/watchtrên Secrets; quyền tạo Pod/Deployment trong namespace cũng cần được xem xét vì có thể dẫn đến việc mount Secret của namespace đó. - Tránh log secret, dump toàn bộ environment hoặc trả secret trong error payload.
- Thiết kế rotation: phát hành credential mới → workload nhận credential mới → verify → revoke credential cũ → audit.
2. Identity and RBAC
Workload thường gọi Kubernetes API bằng ServiceAccount. Không cần API access thì tắt automount token ở Pod hoặc ServiceAccount. Human identity và workload identity nên tách riêng để audit, rotation và blast radius rõ ràng.
RBAC gồm Role/ClusterRole mô tả quyền và RoleBinding/ClusterRoleBinding gán quyền cho subject. Least privilege phải xét đồng thời verbs, resources, API groups, namespace và phạm vi cluster.
| Permission nhạy cảm | Vì sao nguy hiểm | Kiểm soát |
|---|---|---|
* wildcard | Tự động bao phủ resource/verb mới xuất hiện sau upgrade. | Liệt kê explicit verbs/resources khi có thể. |
bind, escalate, impersonate | Có thể mở đường privilege escalation. | Chỉ cấp cho control-plane/admin workflow thực sự cần. |
| Create workloads | Pod có thể chạy bằng ServiceAccount khác trong namespace hoặc yêu cầu runtime privilege nếu admission không chặn. | Kết hợp RBAC với Pod Security/admission và giới hạn ServiceAccounts. |
| Read Secrets | Credential disclosure có thể dẫn đến lateral movement. | Giới hạn get; tránh list/watch rộng; audit access. |
# Ví dụ: workload không cần Kubernetes API token
apiVersion: v1
kind: ServiceAccount
metadata:
name: web
namespace: app
automountServiceAccountToken: false
Operational signals: theo dõi denied API requests tăng đột biến, creation/change của RoleBinding và ClusterRoleBinding, impersonation, Secret reads bất thường và workload dùng ServiceAccount ngoài ownership mong đợi. Sau incident hoặc credential exposure, revoke/rotate token, review bindings và đối chiếu audit log.
3. Pod security
SecurityContext giảm khả năng container chuyển từ application compromise thành node compromise. Với Linux workload thông thường, baseline hardening thường gồm chạy non-root với UID/GID cố định phù hợp ownership, không privilege escalation, filesystem root read-only khi khả thi, drop capabilities không cần thiết và dùng seccomp profile phù hợp.
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: registry.example/app@sha256:...
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
Tránh hostPID, hostIPC, hostNetwork, privileged container, hostPath/socket mount và quyền truy cập host khác trừ workload hạ tầng đã được review. Các quyền này có thể làm mờ container boundary.
Kubernetes Pod Security Standards định nghĩa ba profile: Privileged, Baseline và Restricted. Built-in Pod Security Admission áp policy ở namespace level và hỗ trợ ba mode enforce, audit, warn; có thể pin policy version để upgrade cluster không bất ngờ thay đổi enforcement.
apiVersion: v1
kind: Namespace
metadata:
name: payments
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
4. Admission and supply chain
Admission chạy trên API write path sau authentication/authorization và trước khi object được persist. Đây là nơi phù hợp để enforce policy như image registry, digest/signature/provenance, resource requests/limits, security context và field invariants.
Nếu policy chỉ cần validation declarative, ưu tiên cơ chế in-process như ValidatingAdmissionPolicy khi phù hợp để giảm network dependency. Webhook vẫn hữu ích cho logic phức tạp nhưng trở thành dependency trực tiếp của API write availability.
| Failure mode | Impact | Mitigation / recovery |
|---|---|---|
| Admission webhook timeout / unavailable | Với fail-closed, create/update có thể bị chặn; deploy/scale/repair dừng. | HA replicas, short timeout, narrow match rules, monitor latency/error; chuẩn bị rollback webhook config. |
failurePolicy: Ignore | Tăng availability nhưng policy có thể bị bypass khi webhook lỗi. | Chỉ dùng sau threat-model; alert ngay khi webhook unhealthy và reconcile resources được tạo trong window đó. |
| Policy rollout quá chặt | Block workload hợp lệ trên toàn scope. | Audit/warn/canary scope trước, version policy, rollback binding/config nhanh. |
| Image/tag bị thay đổi | Cùng tag có thể chạy artifact khác qua thời gian. | Pin digest, allow trusted registries, verify signature/provenance theo supply-chain policy. |
5. Multi-tenancy
Namespace là organizational và policy scope quan trọng nhưng không phải hard isolation boundary một mình. Namespace multi-tenancy cần phối hợp RBAC + NetworkPolicy + ResourceQuota/LimitRange + Pod Security/admission + storage/runtime controls.
- Control-plane isolation: tenant chỉ được đọc/sửa object thuộc phạm vi cần thiết; tránh cluster-scoped permissions ngoài nhu cầu.
- Network isolation: default-deny và allow-list traffic cần thiết; nhớ rằng NetworkPolicy phụ thuộc CNI implementation.
- Resource isolation: quotas/limits ngăn một tenant tiêu thụ hết CPU, memory, object count hoặc storage.
- Runtime/node isolation: tenant không đáng tin cậy có thể cần node pool riêng, sandboxed runtime hoặc cluster riêng.
- Cloud boundary: chặn truy cập instance metadata / node credentials không cần thiết và dùng workload identity phù hợp cloud provider.
Nếu threat model có hostile tenants, yêu cầu kernel-level isolation hoặc compliance boundary độc lập, namespace sharing có thể không đủ. Khi đó separate cluster/node/runtime sandbox là lựa chọn cần đánh giá rõ về security guarantee và operational cost.
6. Production checklist và recovery
| Area | Signal cần theo dõi | Recovery / rollback |
|---|---|---|
| Secret/config | Version drift, failed reload, auth failures sau rotation | Khôi phục credential/config version trước; giữ overlap rồi revoke có kiểm soát. |
| RBAC | Denied requests, binding changes, unusual Secret reads | Revert binding/role change, rotate compromised identity, audit blast radius. |
| Pod security | Admission warnings/rejections theo namespace/workload | Rollback policy label/version hoặc workload manifest; không disable toàn cluster nếu chỉ một scope lỗi. |
| Admission | Latency, timeout, 5xx, rejection rate | Disable/narrow broken binding/webhook theo runbook; reconcile objects được tạo trong fail-open window. |
| Tenant isolation | Quota pressure, policy drops, cross-namespace access attempts | Contain tenant, revoke access, restore policy/quota và kiểm tra lateral movement. |