일반사용자용 인증서 기반 kubeconfig 생성

1 개요[ | ]

일반사용자용 인증서 기반 kubeconfig 생성
특정 네임스페이스만 접근가능한 인증서 기반 kubeconfig 생성
특정 네임스페이스만 사용가능한 인증서 기반 kubeconfig 생성

2 변수 지정[ | ]

USERNAME=jmnote
NS=namespace1

3 key & csr 파일 생성[ | ]

openssl req -new -newkey 2048 -nodes -keyout user.key -out user.csr -subj "/CN=$USERNAME"

4 CertificateSigningRequest 생성 및 승인[ | ]

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: $USERNAME
spec:
  request: $(cat user.csr | base64 -w0)
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF
kubectl certificate approve $USERNAME

5 crt 파일 생성[ | ]

kubectl get csr $USERNAME -o jsonpath='{.status.certificate}'| base64 -d > user.crt

6 Role & RoleBinding 생성[ | ]

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: $USERNAME
  namespace: $NS
rules:
- apiGroups: ["", "apps", "batch", "extensions", "networking.k8s.io"]
  resources: ["*"]
  verbs: ["*"]
EOF
kubectl -n $NS create rolebinding $USERNAME --role=$USERNAME --user=$USERNAME

7 ca.crt 파일 생성[ | ]

kubectl config view --flatten -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d > ca.crt

8 kubeconfig 파일 생성[ | ]

kubectl config set-cluster $(kubectl config view -o jsonpath='{.clusters[0].name}') \
--server=$(kubectl config view -o jsonpath='{.clusters[0].cluster.server}') \
--certificate-authority=ca.crt \
--embed-certs --kubeconfig=./$USERNAME-kubeconfig
kubectl config set-credentials $USERNAME \
--client-certificate=user.crt --client-key=user.key \
--embed-certs --kubeconfig=./$USERNAME-kubeconfig
kubectl config set-context $USERNAME \
--cluster=$(kubectl config view -o jsonpath='{.clusters[0].name}') \
--namespace=$NS --user=$USERNAME \
--kubeconfig=./$USERNAME-kubeconfig
kubectl config use-context $USERNAME --kubeconfig=./$USERNAME-kubeconfig

9 테스트[ | ]

kubectl --kubeconfig=$USERNAME-kubeconfig get no # 권한없음 (정상)
kubectl --kubeconfig=$USERNAME-kubeconfig get pod
kubectl --kubeconfig=$USERNAME-kubeconfig get pod -n $NS

10 ⚠️ 원복 (모두 제거)[ | ]

kubectl delete csr $USERNAME
kubectl -n $NS delete Role $USERNAME
kubectl -n $NS delete RoleBinding $USERNAME
rm -f *

11 같이 보기[ | ]

12 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}