Certificates API

zuckerfrei·2024년 1월 8일
0

Kubernetes

목록 보기
39/63

kubectl certificate 명령어 알아보기

만약 admin이 추가로 필요하다면? 인증서가 만료된다면?
해당 유저의 csr을 생성하여 ca에 서명을 받는 프로세스를 똑같이 진행한다.

ca는 무엇이고, k8s 클러스터 중 어디에 위치하는가?
ca는 인증서와 키 파일 한 쌍이다. 이 파일 쌍에 접근할 수 있는 사람은 누구든 인증서에 서명할 수 있다.
ca 파일 쌍은 안전하게 보관되어야 하고, 보관되는 그 서버(주로 마스터 노드)가 ca 서버가 된다. 서명받고 싶을 때 마다 해당 서버에 로그인 해야한다.


인증서 서명 자동화

cert api를 사용하여 추가 인증서 서명, 만료된 인증서 갱신 서명 등을 자동화 할 수 있다.


1
유저가 csr을 생성한다.

# jane.key 생성
openssl genrsa -out jane.key 2048

# jane.csr 생성
openssl req -new -key jane.key -subj "/CN=jane" -out jane.csr


2
생성한 csr 파일과 key 파일을 가지고 관리자에게 서명 요청을 보낸다.

관리자가 인증서 서명 요청을 받을 때 마스터 노드에 로그인하여, csr의 정보를 바탕으로 CertificateSigningRequest 객체를 생성한다.

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: jane
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth

request의 내용은 base64로 인코딩하여 붙여넣어야 한다.

cat jane.csr | base64


3
관리자는 요청을 살펴보면서 서명 해줄지 말지 결정한다.

서명해주기로 결정 했다면, 관리자가 cert api를 사용하여 서명 요청을 허락한다.

# 서명 요청 csr 확인
kubectl get csr

# 승인/거부 결정이 나기 전까지는 pending 상태로 대기함
-------------------------------
controlplane ~ ➜  k get csr
NAME     ....   CONDITION
jane     ....    Pending
csr-mnm6j ....  Approved,Issued
-------------------------------

# 서명 승인
kubectl certificate approve {csr이름}

# 서명 거부
kubectl certificate deny {csr이름}

# csr 삭제
kubectl delete csr {csr이름}

# csr을 yaml 형식으로 확인하기
kubectl get csr {csr이름} -o yaml

request 내용은 base64 인코딩 되어있으니, 디코딩하여 확인 가능

echo "{base64 인코딩내용}" | base64 --decode

마지막으로 서명된 인증서는 추출되고 요청한 유저에게 공유된다.


cert api와 kube-controller-manager

cert api는 kube-contoller-manager에 의해 실행된다.
controller manager 내부에는 CSR-APPROVING, CSR-SIGNING이 존재하여 이들이 처리한다.

맨 앞에서 언급한 것 처럼 누군가 인증서에 서명해야 한다면, ca 서버에서 인증서와 키 파일에 접근할 수 있어야 한다.

kube-controller-manager의 manifest file을 열어보면 cluster-signing-cert-file, cluster-signing-key-file 항목이 존재한다.
컨트롤러 매니저가 해당 인증서 파일 쌍에 접근하여 서명할 수 있다는 증거이다.

profile
무설탕 음료를 좋아합니다

0개의 댓글