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