개요
Kubernetes에서 작업하는 사용자(User)와 서비스 계정(Service Accounts)은 Role-based access control(RBAC)에 의해 클러스터 내 리소스 접근을 제어받는다. Kubernetes 클러스터 관리자는 RoleBinding을 생성하여 User, Group, ServiceAccount에게 권한이 부여된 Role을 연결할 수 있는데, 이때 Group은 User의 집합을 의미한다.
2022.09.07 - [k8s] 인증서 기반 User 생성에서는 단순 User를 생성해 보았는데, 이 글에서는 특정 Group에 속한 User를 생성해 볼 것이다. 기본적으로 OpenSSL을 사용하여 CSR을 생성하는 것은 동일하다.
+ 인증서를 생성하는 도구로 꼭 OpenSSL을 사용할 필요는 없다.
1. 개인 키 생성
CSR을 생성하기 위한 개인 키(Private Key)를 생성한다.
openssl genrsa -out <user.key> 2048
# 예시
openssl genrsa -out test_user.key 2048
2. CSR 생성
이 글에서는 test_user가 쿠버네티스 관리자 권한을 가질 수 있도록 system:masters 그룹에 소속되도록 하려고 한다.
쿠버네티스 User가 특정 그룹에 소속되기 위해서는 특정 조직 아래에 속한 인증서가 필요하다. 즉, 인증서 정보에 O(Organization) 정보가 포함되어 있어야 한다.
CSR을 생성할 때 필드 값을 입력하는 부분에서 관련 정보를 추가하거나,
openssl req -new -key <user.key> -out <user.csr>
# 예시
openssl req -new -key test_user.key -out test_user.csr
-subj 옵션을 이용해 관련 정보를 기재하여 생성할 수 있다. 사용자가 소속될 Group의 이름을 적는다.
openssl req -new -key <user.key> -out <user.csr> -subj '/O=<GROUP_NAME>/CN=<USER_NAME>'
# 예시
openssl req -new -key test_user.key -out test_user.csr -subj '/O=developer/CN=test_user'
생성한 CSR 정보를 확인해보면 조직 정보가 포함되어 있음을 확인할 수 있다.
openssl req -in <user.csr> -noout -text
# 예시
openssl req -in test_user.csr -noout -text
3. 쿠버네티스 CertificateSigningRequest 리소스 생성
openssl로 생성한 CSR로 CertificateSigningRequest 객체를 생성한다.
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: <USER_NAME>
spec:
request: <CSR>
signerName: kubernetes.io/kube-apiserver-client
# expirationSeconds: 86400 # one day
usages:
- client auth
EOF
spec.request 필드에는 CSR을 base64로 인코딩한 값을 추가하여 apply 한다.
cat <user.csr> | base64 | tr -d "\n"
# 예시
cat test_user.csr | base64 | tr -d "\n"
4. 생성한 CSR 정보 확인 및 승인
get 또는 describe 명령을 이용해 생성한 CSR 정보를 확인한다.
kubectl get csr
kubectl describe csr <CSR_NAME>
적절하게 생성되었으면 인증서를 승인한다.
kubectl certificate approve <CSR>
5. 권한 부여
Group을 대상으로 권한을 부여해보자. 간단히 Pod에 대한 Get, List, Update, Delete 권한을 부여해보려고 한다.
Role 생성
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
RoleBinding 생성
developer Group에 developer Role을 연결하는 RoleBinding을 생성한다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer:developer
subjects:
- kind: Group
name: developer # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
6. 권한 확인
developer 그룹의 test_user에 정상적으로 권한이 부여되었는지 확인한다.
kubectl auth can-i <VERB> <RESOUCE> --as-group=<GROUP> --as=<USER>
# 예시
kubectl auth can-i create pods --as-group=developer --as=test_user
참고 문서
https://faun.pub/give-users-and-groups-access-to-kubernetes-cluster-using-rbac-b614b6c0b383
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/
https://ssup2.github.io/theory_analysis/Kubernetes_CSR/
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/