Skip to content

Instantly share code, notes, and snippets.

@taveek
Created March 9, 2021 06:48
Show Gist options
  • Save taveek/a0b26e957041301d8228901a20303278 to your computer and use it in GitHub Desktop.
Save taveek/a0b26e957041301d8228901a20303278 to your computer and use it in GitHub Desktop.

K8s RBAC user creation

CertificateSigningRequest

generate key - certificate signing request

export USER_NAME=user1
openssl genrsa -out $USER_NAME.key 2048
openssl req -new -key $USER_NAME.key -out $USER_NAME.csr 

# Common Name (eg, fully qualified host name) []:user1 <--- only set common name as $USER_NAME

# จะมีไฟล์ 
ls $USER_NAME.csr $USER_NAME.key

create CertificateSigningRequest with base64

certificate-signing-request

USER_CSR=$(cat $USER_NAME.csr | base64)

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: ${USER_NAME}
spec:
  groups:
  - system:authenticated
  request: ${USER_CSR}
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF

approve & export csr

# <-- จะมี certificate signing request ชื่อ ${USER_NAME} สถานะ Pending -->
k get csr 
# <-- approve csr -->
k certificate approve ${USER_NAME} 
# <-- สถานะ csr จะเปลี่ยนเป็น Approved,Issued -->
k get csr ${USER_NAME}

# <-- export cert -->
k get csr/${USER_NAME} -o jsonpath='{.status.certificate}' | base64 -d >> ${USER_NAME}.crt

# 2 ไฟล์ที่เราจะใช้
ls ${USER_NAME}.key ${USER_NAME}.crt

add new KUBECONFIG

k config set-credentials ${USER_NAME} --client-key=${USER_NAME}.key --client-certificate=${USER_NAME}.crt --embed-certs=true
k config set-context <ชื่อ context> --cluster=<ชื่อ cluster> --user=${USER_NAME} --namespace=<ชื่อ default namespace>
k config get-contexts
k config use-context <ชื่อ context>

ถึงตรงนี้ user ที่เพิ่งสร้างควรจะสามารถเรียกใช้งาน kube ได้แล้ว แต่ยังไม่มีสิทธิ์ทำอะไรเลย

Create ClusterRole & ClusterRoleBinding

เปลี่ยนไปใช้ context ของ kubeadmin

# <-- สร้าง cluster role ที่สามารถทำทุกอย่างกับ pods, deployments, configmap และ service ได้
k create clusterrole developer --verb=create,get,list,watch,delete,update,patch --resource=pods --resource=deployments --resource=configmaps --resource=services --resource=secrets

# <-- สร้าง rolebinding ${USER_NAME} ไปยัง developer clusterrole -->
k create namespace dev
k create rolebinding developer-role-binding --namespace dev --clusterrole=developer --user=${USER_NAME}
# <-- สามารถ create rolebinding ใน namespace อื่นๆ ที่อยากให้สิทธิ์ user นี้ใช้งาน

# check
# <-- มี rolebinding -->
k get rolebinding -n dev

# เช็คสิทธิ์ในการสร้าง pod
k auth can-i create pod -n dev --as ${USER_NAME}
k auth can-i create deploy -n dev --as ${USER_NAME}
k auth can-i create svc -n dev --as ${USER_NAME}
k auth can-i create cm -n dev --as ${USER_NAME}
k auth can-i create secret -n dev --as ${USER_NAME}

# เช็คว่าไม่มีสิทธิ์ใดๆ ใน default namespace
k auth can-i create pod -n default --as ${USER_NAME}
k auth can-i create deploy -n default --as ${USER_NAME}
k auth can-i create svc -n default --as ${USER_NAME}
k auth can-i create secret -n default --as ${USER_NAME}
k auth can-i create cm -n default --as ${USER_NAME}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment