Giao diện
Module 6: Mastering RBAC (Role-Based Access Control)
💡 HPN Engineering Philosophy
"Security is not an afterthought." Trong Kubernetes, mặc định là "Deny All". Bạn không có quyền làm gì cả cho đến khi được cấp phép cụ thể. Đây là nguyên tắc Least Privilege.
1. The Concept: AuthN vs AuthZ
Rất nhiều kỹ sư nhầm lẫn giữa hai khái niệm này. Hãy phân biệt rõ ràng:
Authentication (AuthN): "Who are you?"
- Hệ thống hỏi: "Anh là ai? Có giấy tờ tùy thân (Passport/ID Card) không?"
- Trong K8s: Được xử lý bởi Certificates (Client Certs), OIDC (Google/Okta), hoặc Service Account Tokens.
- Kết quả: K8s biết bạn là user
nguyen.van.athuộc groupdevelopers.
Authorization (AuthZ): "What can you do?"
- Hệ thống hỏi: "Anh
nguyen.van.ađược phép vào phòng Server không? Được phép xóa Database không?" - Trong K8s: Đây chính là RBAC (Role-Based Access Control).
- Kết quả: Allow hoặc Deny.
IMPORTANT
AuthN xảy ra TRƯỚC AuthZ. Nếu bạn không chứng minh được danh tính, bạn thậm chí không đến được cửa kiểm soát quyền hạn.
2. The Four Pillars of RBAC
RBAC trong Kubernetes được xây dựng dựa trên 4 trụ cột chính. Hãy tưởng tượng đây là hệ thống cấp thẻ từ trong tòa nhà HPN Tower.
2.1. Role (Namespace Scope)
- Định nghĩa: Một tập hợp các Rules (quy tắc) cho phép thực hiện hành động cụ thể trên các resources.
- Phạm vi: Chỉ có tác dụng trong một Namespace cụ thể.
- Ví dụ: "Thẻ nhân viên tầng 5" -> Chỉ mở được cửa ở tầng 5.
yaml
# role-developer.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: backend-team
name: developer-role
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "watch"] # Read-only access2.2. ClusterRole (Cluster Scope)
- Định nghĩa: Tương tự Role, nhưng phạm vi là toàn bộ Cluster.
- Sử dụng cho:
- Cluster-scoped resources (Nodes, PV).
- Non-resource endpoints (
/healthz). - Áp dụng quyền giống nhau cho tất cả Namespaces.
- Ví dụ: "Thẻ Admin tòa nhà" -> Mở được cửa ở mọi tầng, mọi phòng.
yaml
# clusterrole-monitor.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-monitor
rules:
- apiGroups: [""]
resources: ["nodes", "persistentvolumes"]
verbs: ["get", "list", "watch"]2.3. RoleBinding (The Grant)
- Định nghĩa: Hành động trao Role cho một User (hoặc Group/ServiceAccount) trong một Namespace cụ thể.
- Tính chất: User + Role = Permissions.
- Ví dụ: Trao "Thẻ nhân viên tầng 5" cho nhân viên
Alice.
yaml
# rolebinding-dev.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: bind-dev-to-backend
namespace: backend-team
subjects:
- kind: User
name: alice@hpn.com # "Who"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer-role # "What Role"
apiGroup: rbac.authorization.k8s.io2.4. ClusterRoleBinding (The Super Grant)
- Định nghĩa: Trao ClusterRole cho User trên phạm vi toàn bộ Cluster.
- Cảnh báo: Rất nguy hiểm nếu dùng sai.
- Ví dụ: Trao "Thẻ Admin tòa nhà" cho đội bảo trì hệ thống.
3. Visualizing RBAC Flow
Dưới đây là luồng xử lý quyền hạn trong Kubernetes:
4. HPN Standard: Least Privilege
Tại HPN, chúng ta tuân thủ nghiêm ngặt nguyên tắc Least Privilege (Quyền tối thiểu cần thiết).
❌ Anti-Pattern (Tuyệt đối cấm)
Không bao giờ gán cluster-admin cho Developer hoặc Application Service Account.
bash
# ĐỪNG BAO GIỜ LÀM THẾ NÀY CHO DEV
kubectl create clusterrolebinding bad-practice --clusterrole=cluster-admin --user=dev-junior✅ Best Practice (HPN Standard)
Tạo custom Role chỉ cấp đúng quyền cần thiết.
Scenario: Developer cần debug ứng dụng trong namespace production. Solution: debug-role
- Được phép xem logs, exec vào pod.
- KHÔNG được phép xóa Deployment, Service hay sửa ConfigMap.
- KHÔNG được xem Secret.
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: debug-role
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"] # Exec yêu cầu verb 'create' trên subresource5. Service Accounts: Identity for Bots
Pods không phải là User. Pods cần một "Identity" để nói chuyện với Kubernetes API Server. Đó là ServiceAccount.
- Mọi Pod mặc định được mount
defaultServiceAccount (thường không có quyền gì). - Nếu App của bạn cần tương tác K8s API (ví dụ: Jenkins Agent, Prometheus), hãy tạo ServiceAccount riêng và Binding Role cho nó.
⚠️ Security Warning: Automount Token
Nếu ứng dụng của bạn không cần gọi K8s API (99% các web app thông thường), hãy tắt tính năng tự động mount token để giảm bề mặt tấn công. Hacker nếu chiếm được Pod sẽ không lấy được token để tấn công API Server.
yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: secure-app-sa
automountServiceAccountToken: false # <--- QUAN TRỌNG: Tắt mount token6. Tổng kết
- AuthN != AuthZ: Biết bạn là ai khác với việc bạn được làm gì.
- Namespace Isolation: Ưu tiên dùng
RolevàRoleBinding. Hạn chế dùngClusterRoleBinding. - Least Privilege: Chỉ cấp quyền vừa đủ. "Review quyền là review code".
- Secure Bots: Tắt
automountServiceAccountTokennếu không cần thiết.
CAUTION
Một cấu hình RBAC sai lầm có thể mở toang cánh cửa cho attacker chiếm quyền điều khiển toàn bộ cluster. Hãy cẩn trọng.