[kubernetes] CSR

Kubernetes에서 CSR(Certificate Signing Request)은 클러스터 내에서 사용자가 인증을 위해 인증서를 요청하는 메커니즘이다. CSR은 인증서 서명 요청으로, 사용자가 클러스터 내에서 안전하게 작업을 수행할 수 있도록 하기 위한 인증서를 발급받기 위한 요청을 나타낸다.

Kubernetes에서 CSR의 주요 목적은 클러스터 내 인증과 권한 부여와 관련된 작업을 하는 것이다. 예를 들어, API 서버에 접근하거나 클러스터 내 다른 서비스에 접근하려는 사용자는 특정한 인증서를 사용해야 한다. 이를 통해 사용자는 클러스터에 안전하게 접근할 수 있게 된다.

CSR의 주요 용도와 흐름

  1. 클라이언트 인증서 요청
    • 클러스터 내에서 인증이 필요한 사용자가 인증서 서명 요청(CSR)을 생성한다.
    • 이 요청에는 공개키와 함께 인증서에 대한 필요한 정보(예: 사용자 이름, 사용자 유형 등)가 포함된다.
  2. Kubernetes API 서버에서 처리
    • CSR은 Kubernetes API 서버로 제출된다.
    • API 서버는 클러스터의 관리자가 CSR을 승인하도록 설정할 수 있다. 관리자나 승인된 컨트롤러가 CSR을 승인하면, API 서버는 요청된 인증서를 서명하여 인증서를 발급한다. 
  3. 인증서 사용
    • 서명된 인증서는 클러스터 내에서 클라이언트(사용자, 서비스 계정 등)에게 배포된다.
    • 인증서는 클러스터의 인증과 권한 부여 과정에서 사용된다. 예를 들어, kubectl 명령어나 다른 클러스터 리소스에 접근할 때 이 인증서를 사용하여 인증이 이루어진다. 

CSR의 흐름 예시

  1. 사용자가 kubectl 등을 사용하여 클러스터에 접근하려고 할 때, 인증서가 필요하다.
  2. 사용자 또는 서비스 계정은 CSR을 생성하고, 이 CSR을 API 서버에 제출한다.
  3. API 서버는 CSR을 승인하고, 사용자에게 서명된 인증서를 반환한다.
  4. 서명된 인증서를 사용하여 사용자는 Kubernetes API 서버에 접근할 수 있다.

CSR의 주요 필드

  • metadata.name: CSR 요청의 이름.
  • spec.request: CSR 요청의 실제 데이터(PEM 형식의 인증서 서명 요청).
  • spec.usages: 인증서가 어떤 용도로 사용될 것인지 정의합니다. 예를 들어, client auth, server auth 등이 있다..
  • spec.username: 인증서를 요청한 사용자 이름을 지정합니다.

예시

CSR 리소스를 생성하는 예시

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: example-csr
spec:
  request: <CSR의 base64 인코딩 된 데이터>
  usages:
    - client auth
  username: example-user

이 CSR을 Kubernetes에 제출하면, 관리자가 승인 후 해당 인증서를 서명하여, 클러스터에서 인증을 할 때 사용하도록 제공된다.

CSR을 사용하는 이유

  • 보안: CSR을 사용하면 인증서가 안전하게 서명되어 사용된다. 이는 사용자가 클러스터에 접근할 때 중요한 보안 요소로 작용한다.
  • 사용자 인증: Kubernetes API 서버에 대한 인증을 위해 클라이언트 인증서가 필요하다. 이를 통해 사용자와 클러스터 간의 상호 인증을 구현할 수 있다.
  • 자동화된 인증: 클러스터 내에서 서비스 계정이나 시스템 간의 자동 인증을 처리하는 데 유용하다.

결론적으로, Kubernetes에서 CSR은 클러스터 리소스에 접근할 수 있는 인증서를 요청하고 발급받는 과정을 관리하는 중요한 역할을 한다.