Certificates API 로 인증서 발급 자동화하기
기존의 방식의 문제점
기존의 방식(수동)
-
프로세스
- 첫 발급
- 새로운 User가 개인키를 생성하고 CSR을 만든다.
- 관리자에게 CSR을 전달한다.
- 관리자는 CA서버(보통 마스터노드)에 접속하여 CA키와 루트 인증서로 CSR에 서명한다. -> 인증서 생성
- 생성된 인증서를 사용자에게 전달한다.
- 인증서 갱신
- User가 개인키를 생성하고 CSR을 만든다.
- 관리자에게 CSR을 전달한다.
- 관리자는 CA서버(보통 마스터노드)에 접속하여 CA키와 루트 인증서로 CSR에 서명한다. -> 인증서 생성
- 생성된 인증서를 사용자에게 전달한다.
- 첫 발급
-
문제점: 팀이 커지거나 인증서 만료로 인한 갱신이 빈번해지면 관리 부담이 커진다.
Certificate API
프로세스
1. User(jane) - 개인키, CSR 생성
openssl genrsa -out jane.key 2048
openssl req -new -key jane.key -subj "/CN=jane" -out jane.csr
2. CertificateSigningRequest 객체 생성
- 첫 발급
- 사용자는
kubectl접근 자체가 불가능하므로 CSR을 관리자에게 넘긴다. - 관리자가
CertificateSigningRequest객체를 만든다.
- 사용자는
- 인증서 갱신
- 사용자가
CertificateSigningRequest객체를 만든다.
- 사용자가
cat jane.csr | base64 | tr -d "\n"
- CSR 내용은 Base64로 인코딩되어야한다.
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: jane
spec:
signerName: kubernetes.io/kube-apiserver-client
groups:
- system:authenticated
usages:
- digital signature
- key encipherment
- client auth
request:
<Base64로_인코딩된_CSR_내용>
kubectl create -f jane.yaml
3. 관리자 - 요청 확인 및 승인
kubectl get csr
- 요청이 들어온 CSR 목록 확인
kubectl certificate approve jane
- 요청을 승인
4. 인증서 발급
kubectl get csr jane -o yaml
echo "<certificate_값>" | base64 --decode > jane.crt
- 첫 발급
- 사용자는 클러스터 접근 자체가 불가능하므로 '관리자'가 발급된 인증서를 유저에게 전달해야한다.
- 갱신
- 갱신이라면
kubectl명령어를 유저가 입력 가능하므로 위 과정을 유저가 직접 하면 된다.
- 갱신이라면
장점
- 이러한 인증서 발급 프로세스를 중앙 집중화하면서 관리의 이점을 누릴 수 있다.
- 새로운 유저 생성보다는 인증서 갱신 부분에서 이점이 있다.
- 직접 CA 개인키에 접근하지 않아도 된다. (보안적 이점)
- 외부 컨트롤러(ex:
Cert-Manager)나kubelet이 인증서 라이프사이클을 자동화할 수 있도록 하는 표준 인터페이스를 제공한다.
동작 원리
- 이러한 모든 인증서 관련 작업(승인, 서명 등)을 실제로 수행하는 컴포넌트는
kube-controller-manager이다. kube-controller-manager내부의CSR-Approving,CSR-Signing등의 컨트롤러가 해당 작업을 수행한다.- 실제로
kube-controller-manager의 yaml 파일에 보면cluster-signing-cert-file,cluster-signing-key-file에 CA의 루트 인증서와 개인키 경로를 입력하는 란이 있다.
- 실제로
레퍼런스
- https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/
- https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/
- Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests (Mumshad)