Email Doanh NghiệpSSLFirewall Anti DDoS

NỘI DUNG

Banner blog lễ 30.4 và 1.5

Hướng dẫn phân quyền trong k8s cho người dùng chi tiết

Hưng Nguyễn

Đã kiểm duyệt nội dung

Ngày đăng:24/04/2026
Lượt xem

Quy trình sản xuất nội dung

Đánh giá

[esi kkstarratings cache="private" ttl="3"]

Phân quyền trong K8s là một nền tảng bảo mật quan trọng, thường được triển khai thông qua cơ chế Role-Based Access Control (RBAC) để kiểm soát quyền truy cập của user, group và service account vào tài nguyên trong cluster. Bài viết này được mình đúc kết từ quá trình triển khai và rà soát phân quyền thực tế trên nhiều hệ thống Kubernetes tại Vietnix, giúp bạn nắm rõ cách định nghĩa rule, tổ chức quyền truy cập và áp dụng đúng cho workload, control plane cũng như các công cụ DevOps như ArgoCD.

Những điểm chính

  • Quan điểm của mình: Trong năm 2026, việc thiết kế và vận hành RBAC chặt chẽ theo nguyên tắc “ít quyền nhất có thể” sẽ là nền tảng bắt buộc nếu bạn muốn giữ cụm Kubernetes an toàn và dễ kiểm soát về lâu dài.
  • Tổng quan về RBAC: Hiểu rõ RBAC là cơ chế phân quyền dựa trên vai trò, giúp bạn nắm được nền tảng cốt lõi để kiểm soát truy cập và bảo mật trong Kubernetes.
  • Cách phân quyền cho các thành phần: Tìm hiểu cách phân quyền cho các thành phần khác nhau như workload, control plane và các công cụ như ArgoCD, giúp bạn áp dụng đúng chính sách bảo mật cho từng trường hợp cụ thể.
  • Quản lý quyền trên ArgoCD: Tìm hiểu cách quản lý người dùng và phân quyền trực tiếp trên ArgoCD, giúp bạn bảo mật quy trình GitOps và kiểm soát chặt chẽ các hành động triển khai.
  • Giới thiệu Vietnix: Biết đến Vietnix là nhà cung cấp Enterprise Cloud mạnh mẽ, giúp bạn có một nền tảng hạ tầng đáng tin cậy để triển khai các giải pháp Kubernetes của bạn.
  • Câu hỏi thường gặp: Giải đáp các thắc mắc liên quan đến phân quyền trong k8s.
những điểm chính

Tổng quan RBAC và phân quyền trong Kubernetes

Role-based access control (RBAC) trong Kubernetes là cơ chế điều khiển truy cập dựa trên vai trò gán cho user, group hoặc service account, thay vì gán trực tiếp quyền lẻ cho từng đối tượng. RBAC sử dụng API group rbac.authorization.k8s.io để định nghĩa và áp dụng các chính sách phân quyền thông qua Kubernetes API, giúp quản lý quyền truy cập tài nguyên một cách cấu trúc và có thể khai báo dưới dạng manifest.

RBAC trong Kubernetes là cơ chế điều khiển truy cập dựa trên vai trò gán cho user
RBAC trong Kubernetes là cơ chế điều khiển truy cập dựa trên vai trò gán cho user

Trong một cluster Kubernetes, RBAC quyết định user hoặc service account có được phép thực hiện thao tác cụ thể (ví dụ: get, list, watch, create, update) lên tài nguyên như Pod, Deployment, ConfigMap, Secret, Node hay các non-resource endpoint như /healthz. Cơ chế này đặc biệt quan trọng trong môi trường nhiều người dùng, ví dụ như khi cần cho developer tự xem Pod và log ở namespace dev mà không có quyền truy cập vào môi trường pro.

Để triển khai RBAC hiệu quả và đảm bảo kiểm soát truy cập chặt chẽ trong môi trường thực tế, việc sử dụng hạ tầng cloud ổn định, bảo mật cao là rất cần thiết. Enterprise Cloud Vietnix cung cấp nền tảng hạ tầng mạnh mẽ, hỗ trợ triển khai Kubernetes linh hoạt, giúp doanh nghiệp dễ dàng quản lý phân quyền, tối ưu bảo mật và vận hành hệ thống một cách an toàn, hiệu quả.

Định nghĩa rules và ví dụ phân quyền trong RBAC

Trong RBAC Kubernetes, mỗi Role/ClusterRole chứa danh sách rules với các trường chính apiGroups, resources, verbs, tùy chọn resourceNamesnonResourceURLs. apiGroups xác định nhóm API, resources chỉ loại tài nguyên, verbs là tập hành động cho phép, còn resourceNames giới hạn trên một số đối tượng cụ thể. nonResourceURLs được dùng cho các endpoint không phải resource như /healthz hoặc /metrics.

Wildcard * trong apiGroups, resources hoặc verbs cho phép cấp quyền rất rộng nên thường chỉ xuất hiện trong các ClusterRole đặc biệt như cluster-admin. Các kịch bản phân quyền chi tiết cho developer hoặc hệ thống thường khai báo rules cụ thể theo từng tài nguyên, thao tác và namespace để tránh phạm vi quyền quá lớn. Ví dụ Role trong namespace dev chỉ cho phép get, list, watch Pod và xem log, rồi gán cho một ServiceAccount dùng với kubectl.

Ví dụ rule phổ biến gồm rule đọc Pod (apiGroups: [""], resources: ["pods"], verbs: ["get","list","watch"]), rule thao tác Deployment trong group apps, rule quản lý Job/CronJob trong group batch, rule truy cập một ConfigMap duy nhất bằng resourceNames và rule đọc Node trong ClusterRole. Với non-resource rules, RBAC cho phép truy cập các URL như /healthz, /metrics để phục vụ monitoring và kiểm tra tình trạng hệ thống. Trong ArgoCD, rules được khai báo trong policy.csv dưới dạng p, subject, resource, action, object, dùng để kiểm soát các hành động như sync ứng dụng hoặc thao tác lên Deployment theo project/application.

Phân quyền cho workload (user, ServiceAccount, kubectl)

Bước 1: Xác định nhu cầu và namespace phân quyền

Xác định namespace (ví dụ dev) và phạm vi quyền cần cấp, chẳng hạn chỉ cho phép xem Pod và log phục vụ debug. Quyết định dùng ServiceAccount để gắn quyền và dùng token ServiceAccount này làm thông tin đăng nhập cho kubectl.

Mẹo từ chuyên gia: Ở bước xác định nhu cầu, mình thường liệt kê rõ các thao tác “must-have” (get, list, watch) thay vì cấp quyền theo cảm tính, để bám sát nguyên tắc “ít quyền nhất có thể”.

Bước 2: Tạo ServiceAccount dùng để phân quyền

Bạn tạo ServiceAccount trong namespace mục tiêu, ví dụ dev-reader trong dev. ServiceAccount này sẽ được bind với Role/ClusterRole và token của nó dùng trong kubeconfig.

kubectl create serviceaccount dev-reader -n dev

Bước 3: Tạo Role định nghĩa quyền trên workload

Bạn viết Role chỉ định rõ apiGroups, resources, verbs để giới hạn thao tác trên Pod và log. Ví dụ cho phép get, list, watch với podspods/log trong namespace dev.

kubectl apply -f - << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-logs-reader
  namespace: dev
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log"]
    verbs: ["get", "list", "watch"]
EOF

Bước 4: Tạo RoleBinding gán Role cho ServiceAccount

Bạn tạo RoleBinding trong cùng namespace để gán Role pod-logs-reader cho ServiceAccount dev-reader. RoleBinding xác định subject là ServiceAccount và tham chiếu Role thông qua roleRef.

kubectl apply -f - << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-logs-reader-binding
  namespace: dev
subjects:
  - kind: ServiceAccount
    name: dev-reader
    namespace: dev
roleRef:
  kind: Role
  name: pod-logs-reader
  apiGroup: rbac.authorization.k8s.io
EOF

Bước 5: Lấy token ServiceAccount và cấu hình kubeconfig

Liệt kê Secret gắn với ServiceAccount dev-reader trong namespace dev, giải mã token từ Secret và cấu hình user, context trong kubeconfig để dùng với kubectl.

#Tạo token cho ServiceAccount (ví dụ set thời hạn 24 giờ) và lưu vào biến TOKEN 
$TOKEN=$(kubectl create token dev-reader -n dev --duration=24h)

#Thêm user vào kubeconfig bằng token vừa tạo
$kubectl config set-credentials dev-reader --token="$TOKEN"

User "dev-reader" set.

##Tạo context mới liên kết user dev-reader với namespace dev
$kubectl config set-context dev-reader-dev --cluster=cloud-docs --namespace=dev --user=dev-reader 

#Chuyển sang sử dụng context vừa tạo kubectl config use-context dev-reader-dev
$kubectl config use-context dev-reader-dev

Switched to context "dev-reader-dev".

#Kiểm tra lại quyền của user (Xác minh RBAC hoạt động)
$kubectl auth can-i get pods
yes

$kubectl auth can-i get pods/log
yes

$kubectl auth can-i delete pods
no

Lỗi thường gặp: Chia sẻ chung một kubeconfig có quyền rộng cho nhiều người, dẫn đến khó truy vết khi có thao tác sai hoặc sự cố bảo mật.

phan quyen trong k8s 2 1
Quy trình phân quyền cho workload

Phân quyền cho control plane và node

Bước 1: Kiểm tra các ClusterRole hệ thống cho control plane

Bạn liệt kê các ClusterRole có prefix system: để xem các role hệ thống dành cho kube-scheduler, controller-manager, kube-proxy. Sau đó xác định ClusterRole nào đang được dùng cho từng thành phần thông qua ClusterRoleBinding.

kubectl get clusterrole | grep 'system:'
kubectl get clusterrolebinding | grep 'system:kube-scheduler'
kubectl get clusterrolebinding | grep 'system:kube-controller-manager'
kubectl get clusterrolebinding | grep 'system:node-proxier'

Bước 2: Kiểm tra quyền node/kubelet với ClusterRole system:node

Xem chi tiết ClusterRole system:node để hiểu phạm vi quyền cấp cho kubelet, đảm bảo kube-apiserver sử dụng Node authorizer và NodeRestriction để ràng buộc quyền kubelet theo node tương ứng.

kubectl get clusterrole system:node -o yaml

Cấu hình kube-apiserver liên quan:

--authorization-mode=Node,RBAC
--enable-admission-plugins=NodeRestriction

Bước 3: Hạn chế chỉnh sửa ClusterRole hệ thống, dùng aggregation nếu cần mở rộng

Tránh sửa trực tiếp ClusterRole hệ thống mà nên tạo ClusterRole mới với nhãn aggregate-to-* để mở rộng role người dùng như admin, edit, view. Sử dụng aggregationRule trong ClusterRole mục tiêu để tự động tổng hợp rules từ các ClusterRole con.

Mẹo từ chuyên gia: Cách làm mình hay áp dụng là giữ nguyên role mặc định rồi thêm một ClusterRole “bổ sung” cho từng nhóm team, như team-a-extra-permissions, để dễ rollback nếu phát hiện cấp thừa quyền.

Phân quyền cho control plane và node
Phân quyền cho control plane và node

Phân quyền cho ArgoCD tương tác với workload trong cluster

Bước 1: Tạo ServiceAccount và ClusterRole/Role cho ArgoCD

Bạn tạo ServiceAccount trong namespace argocd để ArgoCD dùng khi thao tác với Kubernetes cluster. Sau đó tạo ClusterRole hoặc Role phù hợp (tùy phạm vi) cấp quyền quản lý các tài nguyên cần thiết như deployments, services, jobs.

kubectl create serviceaccount argocd-manager -n argocd

kubectl apply -f - << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: argocd-manager-role
rules:
  - apiGroups: ["", "apps", "batch"]
    resources: ["pods","services","deployments","statefulsets","jobs","cronjobs"]
    verbs: ["get","list","watch","create","update","patch","delete"]
EOF

Bước 2: Gán ClusterRole cho ServiceAccount ArgoCD

Bạn tạo ClusterRoleBinding để ánh xạ argocd-manager-role với ServiceAccount argocd-manager. ServiceAccount này sau đó được cấu hình làm cluster credential trong ArgoCD.

kubectl apply -f - << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: argocd-manager-binding
subjects:
  - kind: ServiceAccount
    name: argocd-manager
    namespace: argocd
roleRef:
  kind: ClusterRole
  name: argocd-manager-role
  apiGroup: rbac.authorization.k8s.io
EOF

Bước 3: Cấu hình RBAC nội bộ trong ArgoCD

Trong ConfigMap argocd-cm, định nghĩa account ArgoCD và bật login, apiKey cho user/role tương ứng. Trong ConfigMap argocd-rbac-cm, cấu hình file policy.csv với các rule dạng p, subject, resource, action, object và ánh xạ user vào role bằng dòng g, user, role.

Ví dụ rule ArgoCD:

p, role:dev, applications, sync, dev/*
g, user:alice, role:dev

Lỗi thường gặp: Viết rule policy.csv quá rộng (ví dụ */* cho mọi project) hoặc gán trực tiếp user vào role admin, khiến việc phân tách trách nhiệm giữa các nhóm triển khai không còn rõ ràng.

Tạo user mới trên ArgoCD thông qua ConfigMap argocd-cm

Bước 1: Sao chép cấu hình argocd-cm mặc định

Bạn lấy ConfigMap argocd-cm trong namespace cài ArgoCD (ví dụ argocd) và lưu ra file argocd-cm.yaml. Trong phần data, giữ lại khóa url hiện có để không thay đổi endpoint truy cập ArgoCD.

kubectl -n argocd get configmap argocd-cm -o yaml > argocd-cm.yaml

Bước 2: Khai báo account user mới và capabilities

Trong trường data của argocd-cm.yaml, bạn thêm dòng accounts.<username>: <capabilities> , ví dụ tạo user hanli với quyền login:

data:
  url: https://argocd.example.com
  accounts.hanli: login

Các capabilities hợp lệ gồm login (đăng nhập UI/CLI) và apiKey (tạo token gọi API).

Sau đó bạn cập nhật lại ConfigMap:

kubectl apply -f argocd-cm.yaml

Lỗi thường gặp: Quên xóa account test sau khi hoàn tất PoC, để lại user không còn sử dụng nhưng vẫn có thể đăng nhập vào ArgoCD.

Bước 3: Đặt mật khẩu cho user ArgoCD

Sau khi ConfigMap được áp dụng, ArgoCD tạo account hanli với trạng thái readonly mặc định. Thiết lập mật khẩu cho hanli bằng CLI ArgoCD, sử dụng mật khẩu admin hiện tại cho tham số --current-password.

argocd account update-password \
  --account hanli \
  --current-password <ADMIN_PASSWORD> \
  --new-password hanli \
  --grpc-web
phan quyen trong k8s 4
Tạo user mới trên ArgoCD thông qua ConfigMap argocd-cm

Cấu hình phân quyền ArgoCD qua ConfigMap argocd-rbac-cm

Bước 1: Lấy cấu hình argocd-rbac-cm mặc định

Bạn lấy ConfigMap argocd-rbac-cm và lưu ra file argocd-rbac-cm.yaml.

kubectl -n argocd get configmap argocd-rbac-cm -o yaml > argocd-rbac-cm.yaml

Trong cấu hình mặc định, trường policy.default: role:readonly áp dụng role readonly cho user không có rule cụ thể.

Bước 2: Định nghĩa rule trong policy.csv

Trong argocd-rbac-cm.yaml, thêm khóa policy.csv trong data và viết các dòng policy theo định dạng:

p, <subject>, <resource>, <action>, <object>, <effect>

Ví dụ cấp quyền cho user hanli được thực hiện action restart Deployment trên tất cả ứng dụng thuộc project default:

data:
  policy.default: role:readonly
  policy.csv: |
    p, hanli, applications, action/apps/Deployment/restart, default/*, allow

Trong đó: resource là applications, action dùng format action/<group>/<Kind>/<tên-action>, object default/* nghĩa là mọi application trong project default. Bạn áp dụng lại ConfigMap:

kubectl apply -f argocd-rbac-cm.yaml

Mẹo từ chuyên gia: Sau khi chỉnh rule, nên dùng lệnh argocd admin settings rbac validate (nếu môi trường cho phép) để xác minh cú pháp và tránh lỗi chính tả làm rule không được áp dụng.

Bước 3: Tạo role chung và gán cho nhiều user (tùy chọn)

Để tránh lặp lại rule cho nhiều user, bạn có thể tạo role logic rồi gán nhiều user vào role thông qua dòng g,.

data:
  policy.default: role:readonly
  policy.csv: |
    p, role:deployment-restart, applications, action/apps/Deployment/restart, default/*, allow
    g, hanli, role:deployment-restart
    g, natsu, role:deployment-restart
    g, lucy, role:deployment-restart

Khi ConfigMap được cập nhật, các user được ánh xạ qua role sẽ có quyền theo rule đã định nghĩa.

Cấu hình phân quyền ArgoCD qua ConfigMap argocd-rbac-cm
Cấu hình phân quyền ArgoCD qua ConfigMap argocd-rbac-cm

Vietnix – Nền tảng Enterprise Cloud tối ưu cho mọi giải pháp Kubernetes

Để triển khai và quản lý hiệu quả các hệ thống Kubernetes, đặc biệt là khi thiết lập các cơ chế phân quyền phức tạp, đòi hỏi một hạ tầng đám mây với hiệu năng cao và khả năng tùy biến linh hoạt. Vietnix cung cấp dịch vụ Enterprise Cloud hiệu suất vượt trội, lý tưởng để bạn xây dựng và vận hành các cụm Kubernetes. Với các tùy chọn cấu hình mạnh mẽ, bộ vi xử lý hiệu suất cao, ổ cứng NVMe siêu tốc và kết nối mạng ổn định, Vietnix đảm bảo bạn có một nền tảng vững chắc để triển khai các control plane, quản lý RBAC và bảo vệ các workload của mình.

Thông tin liên hệ:

  • Website: https://vietnix.vn/
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh

Câu hỏi thường gặp

Tại sao lại nên sử dụng ServiceAccount để cấp quyền cho các ứng dụng hoặc các quy trình tự động hóa thay vì sử dụng tài khoản người dùng?

Nên sử dụng ServiceAccount vì nó được thiết kế đặc biệt cho các quy trình không phải con người. ServiceAccount cung cấp một danh tính riêng cho các ứng dụng, có thể được quản lý và giới hạn quyền một cách chặt chẽ thông qua RBAC mà không cần chia sẻ thông tin đăng nhập của người dùng. Token của ServiceAccount cũng có thể được quản lý và luân chuyển tự động.

Khi phân quyền cho ArgoCD, tại sao cần phải cấu hình RBAC ở cả Kubernetes và bên trong ArgoCD?

Cần cấu hình ở cả hai nơi vì chúng quản lý các cấp độ quyền khác nhau. RBAC của Kubernetes cấp quyền cho ServiceAccount của ArgoCD để tương tác với cluster (ví dụ: tạo, xóa Deployment). RBAC bên trong ArgoCD (qua argocd-rbac-cm) cấp quyền cho người dùng ArgoCD để tương tác với chính ArgoCD (ví dụ: ai được phép đồng bộ ứng dụng, ai được xem log).

Lệnh kubectl auth can-i có tác dụng gì và tại sao nó lại hữu ích?

Lệnh kubectl auth can-i cho phép bạn kiểm tra xem người dùng hiện tại (hoặc một người dùng được chỉ định) có quyền thực hiện một hành động cụ thể trên một tài nguyên hay không (ví dụ: kubectl auth can-i get pods). Nó rất hữu ích để gỡ lỗi các vấn đề về quyền truy cập và xác minh các chính sách RBAC đã được áp dụng đúng cách hay chưa.

Phân quyền trong K8s thông qua cơ chế RBAC là một yếu tố nền tảng và không thể thiếu để đảm bảo an ninh và quản lý hiệu quả một cụm Kubernetes. Việc hiểu rõ cách định nghĩa quy tắc, tạo và gán quyền sẽ là chìa khóa để xây dựng một môi trường Kubernetes không chỉ mạnh mẽ, linh hoạt mà còn an toàn và tuân thủ các tiêu chuẩn bảo mật hiện đại.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

kien-thuc-dich-vu

kien-thuc-kubernetes

text
icon popup single post

CẢM ƠN BẠN ĐÃ ĐÁNH GIÁ BÀI VIẾT

Vietnix sẽ luôn cố gắng cải thiện chất lượng dịch vụ mỗi ngày

ĐÓNG

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG