# 🔑 RBAC, ServiceAccount và Pod Security

> This lesson is part of the paid section. Sign in and purchase the course to view the full content.

## Mục tiêu bài học

- Phân biệt được `Role`, `ClusterRole`, `RoleBinding`, `ClusterRoleBinding` và biết khi nào dùng cái nào.
- Viết được `Role`/`RoleBinding` đúng phạm vi cho một `ServiceAccount` cụ thể, theo nguyên tắc least privilege.
- Hiểu `ServiceAccount` là gì, token mount hoạt động ra sao và cách tắt khi không cần.
- Áp được Pod Security Admission (PSA) ở mức `baseline` và `restricted` cho một namespace, và sửa manifest để qua được `restricted`.
- Nhận ra các cạm bẫy hay gặp: bind sai namespace, `roleRef` bất biến, quyền cộng dồn không có deny.

## Ôn nhanh

Bài trước ta đã chốt: mạng Pod mặc định là **phẳng và mở**, `NetworkPolicy` chỉ là allow-list theo namespace, không có rule deny. Nói cách khác, `NetworkPolicy` trả lời câu hỏi *"Pod nào được nói chuyện với Pod nào"*.

Bài này là lớp bảo vệ thứ hai, ở hai trục khác: **ai được gọi API server** (RBAC + `ServiceAccount`) và **container được phép làm gì trên node** (Pod Security). Hai lớp này độc lập với `NetworkPolicy`, nên phải nghĩ tới cả ba cùng lúc khi thiết kế một namespace.

## Lý thuyết

### RBAC: ba mảnh ghép

RBAC luôn là công thức: **Subject** + **Binding** + **Role/ClusterRole**.

| Mảnh | Vai trò | Phạm vi |
| --- | --- | --- |
| `Role` | Tập rule (cho phép làm gì) | Một namespace |
| `ClusterRole` | Tập rule | Toàn cluster (hoặc dùng lại nhiều namespace) |
| `RoleBinding` | Gắn subject vào role | Một namespace |
| `ClusterRoleBinding` | Gắn subject vào ClusterRole | Toàn cluster |

Một rule gồm bốn phần: `apiGroups`, `resources`, `verbs`, và tuỳ chọn `resourceNames`. Ví dụ đọc log Pod cần `get` trên subresource `pods/log`, không phải trên `pods`.

> [!IMPORTANT]
> `RoleBinding` có thể trỏ tới `ClusterRole`, nhưng quyền vẫn chỉ có hiệu lực **trong namespace của binding**. Đây là mẹo hay dùng: viết một `ClusterRole` chung (ví dụ `view`), rồi bind vào từng namespace bằng `RoleBinding`.
