Kubernetes

[k8s] 인증서 기반 User 생성

비번변경 2022. 9. 7. 20:50

User vs Service Account

쿠버네티스에서 일반 사용자(Human User)와 Service Account라는 두 종류의 사용자가 존재한다.

user, serviceAccount

  • 일반 사용자 : 쿠버네티스 클러스터 외부에서 쿠버네티스 클러스터를 조작하는 사용자. 클러스터 관리자 입장에서의 사용자에 해당한다.
  • Service Account : 쿠버네티스 내부에서 관리되는, Pod가 쿠버네티스 API를 조작할 때 사용한다. 개발자 입장에서의 사용자에 해당한다.

 

그리고 사용자는 RBAC에 의해서 클러스터를 조작할 권한을 부여받는데, 이 글에서는 일반 사용자를 생성하는 방법을 정리해둔다.

 

 

API 인증 방법

쿠버네티스는 사용자 인증을 위해 아래와 같은 방법을 지원한다.

  • Service Account Token
  • 정적 Token
  • Password file
  • X.509 Client 인증서 : 비대칭 암호화 기술을 이용한 공개키 기반의 인증 체계의 표준
  • OpenID Connect :  Google OAuth와 같은 인증 provider를 이용한 인증

 

인증서를 이용하는 방법이 기본적이므로 이 글에서는 인증서를 이용하는 사용자를 생성할 것이다.

 

 

인증서 발급

쿠버네티스는 자체적으로 발급한 인증서로 사용자를 인증한다. 

인증서 발급 및 인증
https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/

 

1. 개인 키(Private Key) 생성

openssl을 사용해 개인 키를 생성한다.

openssl genrsa -out <user.key> 2048

# 예시
openssl genrsa -out test_user.key 2048

openssl genrsa -out &lt;user.key&gt; 2048

 

2. CSR(Cerfiticate Signing Request) 생성

💡 CSR(Cerfiticate Signing Request)
인증서 발급을 위해 필요한 정보를 저장하고 있는 인증서 신청 형식 데이터
공개 키와 인증서 적용되는 도메인에 대한 정보 등이 포함된다.
openssl req -new -key <user.key> -out <user.csr>

# 예시
openssl req -new -key test_user.key -out test_user.csr -subj "/CN=test_user"

-subj 옵션 없이 사용하면 많은 정보를 입력해야 한다. 이 글에서는 간단히 생성할 수 있도록 -subj 옵션을 주어 생성한다.

 

3. 쿠버네티스 CertificateSigningRequest 리소스 생성

cat > test_user_csr.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: test_user
spec:
  request: <csr>
  signerName: kubernetes.io/kube-apiserver-client
  # expirationSeconds: 86400  # one day
  usages:
  - client auth

spec.request 필드에는 아래 명령어를 실행한 결과를 붙여 넣는다.

cat <user.csr> | base64 | tr -d "\n"

# 예시
cat test_user.csr | base64 | tr -d "\n"

spec.expirationSeconds은 인증서의 수명을 설정한다. 이 글에서는 주석 처리할 것이다.

CertificateSigningRequest.yaml

yaml 파일 수정이 끝나면 apply 한다.

kubectl apply -f <csr.yaml>

# 예시
kubectl apply -f test_user_csr.yaml

kubectl get csr

 

4. CSR 승인

인증서를 승인한다.

kubectl certificate approve <user>

# 예시
kubectl certificate approve test_user

kubectl certificate approve &lt;user&gt;

승인하면 Pending 상태였던  csr인 Approved, Isused 상태로 변경된다.

 

 

인증서 받기

쿠버네티스 인증을 받은 키 값은 아래 명령어로 저장할 수 있다.

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

# 예시
kubectl get csr test_user -o jsonpath='{.status.certificate}'| base64 -d > test_user.crt

 

 

참고 문서

https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/

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

https://ahnseungkyu.com/254