User vs Service Account
쿠버네티스에서 일반 사용자(Human User)와 Service Account라는 두 종류의 사용자가 존재한다.
- 일반 사용자 : 쿠버네티스 클러스터 외부에서 쿠버네티스 클러스터를 조작하는 사용자. 클러스터 관리자 입장에서의 사용자에 해당한다.
- Service Account : 쿠버네티스 내부에서 관리되는, Pod가 쿠버네티스 API를 조작할 때 사용한다. 개발자 입장에서의 사용자에 해당한다.
그리고 사용자는 RBAC에 의해서 클러스터를 조작할 권한을 부여받는데, 이 글에서는 일반 사용자를 생성하는 방법을 정리해둔다.
API 인증 방법
쿠버네티스는 사용자 인증을 위해 아래와 같은 방법을 지원한다.
- Service Account Token
- 정적 Token
- Password file
- X.509 Client 인증서 : 비대칭 암호화 기술을 이용한 공개키 기반의 인증 체계의 표준
- OpenID Connect : Google OAuth와 같은 인증 provider를 이용한 인증
인증서를 이용하는 방법이 기본적이므로 이 글에서는 인증서를 이용하는 사용자를 생성할 것이다.
인증서 발급
쿠버네티스는 자체적으로 발급한 인증서로 사용자를 인증한다.
1. 개인 키(Private Key) 생성
openssl을 사용해 개인 키를 생성한다.
openssl genrsa -out <user.key> 2048
# 예시
openssl genrsa -out test_user.key 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은 인증서의 수명을 설정한다. 이 글에서는 주석 처리할 것이다.
yaml 파일 수정이 끝나면 apply 한다.
kubectl apply -f <csr.yaml>
# 예시
kubectl apply -f test_user_csr.yaml
4. CSR 승인
인증서를 승인한다.
kubectl certificate approve <user>
# 예시
kubectl certificate approve test_user
승인하면 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