Phân quyền quản trị cluster bằng RBAC
Hướng dẫn này giúp bạn thực hiện phân quyền quản trị cơ bản cho nhiều người (user/client) bằng cách sử dụng Role-based access control (RBAC):
-
Tạo mới client certificates và kubeconfig
-
Generate RSA Private key và CSR (Certificate Signing Request)
-
Ký CSR
-
Tải về Certificate đã được ký và generate kubeconfig mới
-
-
Tạo RBAC rule để phân quyền cho client
-
Tạo Role hoặc ClusterRole
-
Tạo RoleBinding hoặc ClusterRoleBinding để gán quyền cho client
-
1. Chuẩn bị các công cụ cần thiết
Trước tiên hay đảm bảo bạn đã thực hiện kết nối vào Kubernetes cluster bằng công cụ kubectl
Hướng dẫn dưới đây sử dụng các câu lệnh openssl
, cat
, base64
, jq
, tr
.. trên môi trường Linux
2. Tạo mới client certificates và kubeconfig
Generate RSA private key
openssl genrsa -out "client-key.pem" 2048
Generate CSR với user là demo
, thuộc group demo
, các giá trị này sẽ được sử dụng để phân quyền RBAC ở bước sau
openssl req -new -key "client-key.pem" -out "client.csr" -subj "/CN=demo/O=demo"
Gửi CSR lên kubernetes cluster và ký
# Create CertificateSigningRequest
cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: user-demo
spec:
groups:
- system:authenticated
request: $(cat "client.csr" | base64 | tr -d '\n')
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
EOF
# Approve
kubectl certificate approve "user-demo"
Thời gian hiệu lực của certificate là 1 năm
Lưy ý: Một khi certificate đã được ký, sẽ không có cách nào có thể thu hồi lại được. Chúng chỉ vô hiệu khi hết thời gian hiệu lực.
Tải về Certificate đã được ký và generate kubeconfig
# Download client certificate
kubectl get csr user-demo -o jsonpath='{.status.certificate}'| base64 -d > client.crt
# Generate new kubeconfig
cat <<EOF > demo.kubeconfig
apiVersion: v1
kind: Config
preferences: {}
current-context: default
clusters:
- name: default
cluster:
certificate-authority-data: $(kubectl config view --raw -o json | jq -r '.clusters[0].cluster."certificate-authority-data"')
server: $(kubectl config view --raw -o json | jq -r '.clusters[0].cluster."server"')
contexts:
- name: default
context:
cluster: default
user: default
users:
- name: default
user:
client-certificate-data: $(cat client.crt | base64 | tr -d '\n')
client-key-data: $(cat client-key.pem | base64 | tr -d '\n')
EOF
Kiểm tra file kubeconfig vừa tạo, ta sẽ thấy user demo đã có thể xác thực với API, tuy nhiên chưa có quyền thực hiện bất cứ thao tác gì (forbidden)
$ KUBECONFIG=demo.kubeconfig kubectl get pod
Error from server (Forbidden): pods is forbidden: User "demo" cannot list resource "pods" in API group "" in the namespace "default"
Tham khảo thêm Certificate Signing Requests
Tạo RBAC rule để phân quyền cho client
Role và ClusterRole định nghĩa một tập các quyền có thể thực hiện
Ví dụ một ClusterRole có quyền list pod
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: demo-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list"]
Binding role cho user
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: demo-clusterrolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: demo-clusterrole
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: demo
Giờ đây user demo
đã có thể list pods
$ KUBECONFIG=demo.kubeconfig kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7c65667b68-kl54d 1/1 Running 0 35m
kube-system coredns-7c65667b68-ngjln 1/1 Running 0 35m
kube-system csi-bizflycloud-nodeplugin-n4hws 2/2 Running 0 35m
kube-system csi-bizflycloud-nodeplugin-p6km7 2/2 Running 0 35m
kube-system kube-router-d4l4r 1/1 Running 0 35m
kube-system kube-router-nmrnk 1/1 Running 0 35m
Mẹo: Tạo user cho chính mình và binding vào ClusterRole cluster-admin
để bỏ qua việc sử dụng kubeconfig file được tải từ Kubernetes Engine có thời gian hiệu lực ngắn.
Tham khảo thêm Role and ClusterRole