CAK - Security - Certificates API

혹시·2023년 9월 6일

K8S

목록 보기
2/11

[ CSR in Kubernetes ]

통신 보안: Kubernetes 클러스터 내의 리소스 간 통신은 암호화되어야 합니다. 디지털 인증서는 TLS/SSL 프로토콜을 사용하여 통신을 암호화하는 데 사용됩니다. CSR을 생성하고 인증 기관(CA)에게 제출하여 디지털 인증서를 발급받으면, 이를 사용하여 클러스터 내의 리소스 간 통신을 안전하게 암호화할 수 있습니다.

클라이언트 신원 확인: Kubernetes는 다양한 유형의 클라이언트(사용자, 서비스 계정 등)가 API 서버와 상호 작용합니다. CSR을 사용하면 클라이언트가 자신의 신원(식별 정보)을 증명할 수 있습니다. 예를 들어, 개별 사용자가 자체 인증서와 개인 키를 생성하여 CSR로 제출하면 해당 사용자는 그들의 신원을 증명할 수 있습니다.

CA 기반 보안: Kubernetes에서 CA를 구성하고 관리함으로써 전체 클러스터에 대한 보안 정책과 규칙을 설정할 수 있습니다. CA는 CSR 요청을 검토하고 승인함으로써 인증서 발급에 대한 권한과 절차를 관리합니다.
외부 서비스와의 상호 운용성: Kubernetes 클러스터가 외부 시스템과 상호 작용해야 할 때도 CSR이 유용합니다. 예를 들어, 외부 로드 밸런서나 인그레스 컨트롤러와 같은 서비스와 연결하기 위해 SSL/TLS 기반의 디지털 인증서가 필요할 수 있습니다.

[ TLS in Kubernetes ]

TLS에선 공개키, 비밀키 방식으로 암호화를 사용하는데
공개키는 개인키, 공개키를 쌍으로 비밀키는 비밀키, 비밀키를 쌍으로하여 대칭키라 한다.

  • 서버 = user / kubeapi
  • 클라이언트 = web / sheduler, controller, proxy, etcd, kubelet
[ TLS ]
0. openssl 을 통해 공개키와 비밀키 쌍을 생성
1. user의 web 접속
2. web 서버로부터 공개키 발급
3. 2에서 받은 공개키로 비밀키를 암호화하여 서버로 전송
4. 서버는 개인키로 메시지를 해독하고 비밀키를 회수
5. 사용자와 서버는 같은 비밀키를 활용하여 데이터를 암호화하여 보안 통신

( CA: web 서버를 위장하여 user를 피싱할 일에 대응하여 CA기관에서 인증서를 이용해 안전한 서버임을 인증한다.)  

[Kubernetes]

주로 CA = 인증서+키인데 쿠버네티스 내에 CA 인증서로 서명해야한다.
CA서버는 따로 있고, 인증서를 자동 갱신하는 API는 Certificate API이다.

(Controller manger가 수행)

1. C API를 호출하여 쿠버네티스로 인증서 서명 요청을 전송한다.

2. 마스터 노드에서 CertificateSigningRequest Object(인증서 서명 요청 객체)를 YAML로 생성한다.

3. kubectl approve 명령을 통해 요청을 객체를 활용하여 검토하고 승인한다.



  1. A new member akshay joined our team. He requires access to our cluster. The Certificate Signing Request is at the /root location. Inspect it
ls
  1. Create a CertificateSigningRequest object with the name akshay with the contents of the akshay.csr file
    As of kubernetes 1.19, the API to use for CSR is certificates.k8s.io/v1.
    Please note that an additional field called signerName should also be added when creating CSR. For client authentication to the API server we will use the built-in signer kubernetes.io/kube-apiserver-client.

request 필드는 인증서 서명 요청을 지정하는 부분으로, base64 명령어를 통해 암호화하여 넣어야 한다.

cat akshay.csr | base64 -w 0 //CSR 의 request에는 base64 로 인코딩된 csr 파일 내용이 들어가야 함
vi akshay.yaml
k apply -f akshay.yaml 
kubectl get csr
k certificate approve akshay //Approve the CSR

yaml에는 https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#create-certificatessigningrequest 내용을 name, request 수정하면 됨.

  1. What is the Condition of the newly created Certificate Signing Request object?
k get csr //csr list
  1. Approve the CSR Request
k certificate approve akshay
  1. How many CSR requests are available on the cluster? Including approved and pending
k get csr
  1. During a routine check you realized that there is a new CSR request in place. What is the name of this request?
k get csr
  1. Hmmm.. You are not aware of a request coming in. What groups is this CSR requesting access to?
    Check the details about the request. Preferebly in YAML.
k get csr/agent-smith -o yaml
  1. That doesn't look very right. Reject that request.
k certificate deny agent-smith
  1. Let's get rid of it. Delete the new CSR object
k delete csr agent-smith

참고
https://infra-for-prime.tistory.com/33

profile
클라우드하는 귀여운 애

0개의 댓글