Kubernetes

[k8s] 인증서 기반 Group User 생성

비번변경 2023. 2. 2. 16:26

개요

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://medium.com/@JoooostB/kubernetes-how-to-create-a-system-masters-user-and-why-you-really-shouldnt-8c17d19e7b8e

https://ssup2.github.io/theory_analysis/Kubernetes_CSR/

https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/