본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Calico에서 사용하는 TLS 인증서 관리

원문 보기 위키 갱신

Calico 컴포넌트 간 통신을 보호하는 데 쓰이는 인증서를 발급하고 서명하는 커스텀 워크플로를 만들 수 있어요. 인증서 발급을 자동화하는 Kubernetes Certificates API를 활용하고, 설치 리소스에 간단한 설정 옵션만 추가하면 돼요. 사설 키 접근을 최소화하거나 클러스터 전반에서 신뢰하는 인증서를 직접 통제해야 하는 보안 요구사항이 있을 때 특히 유용해요.

출처: 문서

본문

큰 그림

Calico 컴포넌트 간 통신을 보호하는 데 사용되는 인증서를 발급하고 서명하는 커스텀 워크플로를 활성화해요.

활용 가치

일부 배포 환경에서는 사설 키에 대한 접근을 최소화하거나 없애고, 클러스터 전반에서 신뢰하는 인증서를 통제해야 하는 엄격한 보안 요구사항이 있어요. 인증서 발급을 자동화하는 Kubernetes Certificates API를 사용하면, Calico는 설치에 추가하는 간단한 설정 옵션으로 이 요구사항을 만족시켜 줘요.

시작하기 전에

지원하는 알고리즘

  • 개인 키 쌍(Private Key Pair): RSA (크기: 2048, 4096, 8192), ECDSA (곡선: 256, 384, 521)
  • 인증서 서명(Certificate Signature): RSA (sha: 256, 384, 512), ECDSA (sha: 256, 384, 512)

방법

인증서 관리 활성화하기

  1. installation 리소스를 수정하고 certificateManagement 섹션을 추가하세요. 다음 변경 사항을 클러스터에 적용해요.
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  certificateManagement:
    caCert: <Your CA Cert in Pem format>
    signerName: <your-domain>/<signer-name>
    signatureAlgorithm: SHA512WithRSA
    keyAlgorithm: RSAWithSize4096

끝났어요! 자동 서명자와 승인자가 이미 있다면 더 할 일은 없어요. 상태를 확인하고 모니터링하는 방법은 다음 섹션에서 자세히 설명해요.

확인하고 모니터링하기

  1. 파드가 올라오는 과정을 모니터링하세요:
kubectl get pod -n calico-system -w
NAMESPACE                  NAME                                       READY   STATUS             RESTARTS   AGE
calico-system              calico-node-5ckvq                          0/1     Pending            0          0s
calico-system              calico-typha-688c9957f5-h9c5w              0/1     Pending            0          0s
calico-system              calico-node-5ckvq                          0/1     Init:0/3           0          1s
calico-system              calico-typha-688c9957f5-h9c5w              0/1     Init:0/1           0          1s
calico-system              calico-node-5ckvq                          0/1     PodInitializing    0          2s
calico-system              calico-typha-688c9957f5-h9c5w              0/1     PodInitializing    0          2s
calico-system              calico-node-5ckvq                          1/1     Running            0          3s
calico-system              calico-typha-688c9957f5-h9c5w              1/1     Running            0          3s

Init 단계 동안 파드의 init 컨테이너가 인증서 서명 요청(CSR)을 만들어요. 그동안 파드는 Init 단계에 머물러 있고, CSR이 인증 기관의 승인과 서명을 받으면 파드는 PodInitializing을 거쳐 최종적으로 Running 상태가 돼요.

  1. 인증서 서명 요청(CSR)을 모니터링하세요:
kubectl get csr -w
NAME                                                 AGE   REQUESTOR                                          CONDITION
calico-system:calico-node-5ckvq:9a3a10               0s    system:serviceaccount:calico-system:calico-node    Pending
calico-system:calico-node-5ckvq:9a3a10               0s    system:serviceaccount:calico-system:calico-node    Pending,Issued
calico-system:calico-node-5ckvq:9a3a10               0s    system:serviceaccount:calico-system:calico-node    Approved,Issued
calico-system:typha-688c9957f5-h9c5w:2b0d82          0s    system:serviceaccount:calico-system:calico-typha   Pending
calico-system:typha-688c9957f5-h9c5w:2b0d82          0s    system:serviceaccount:calico-system:calico-typha   Pending,Issued
calico-system:typha-688c9957f5-h9c5w:2b0d82          0s    system:serviceaccount:calico-system:calico-typha   Approved,Issued

CSR은 Issued되고 Approved되기 전까지 Pending 상태로 유지돼요. CSR 이름은 네임스페이스, 파드 이름, 파드 UID의 첫 6자를 조합해 만들어져요. CSR이 Approved되기 전까지 파드도 Pending 상태로 유지돼요.

  1. TigeraStatus로 이 기능의 상태를 모니터링하세요:
kubectl get tigerastatus
NAME     AVAILABLE   PROGRESSING   DEGRADED   SINCE
calico   True        False         False      2m40s

자체 서명 및 승인 프로세스 구현하기

필수 단계

이 기능은 인증서 서명 요청(CSR)을 위해 API 버전 certificates.k8s.io/v1beta1을 사용해요. 서명과 승인 과정을 자동화하려면 다음 작업을 수행하는 서버를 실행하세요:

  1. 상태가 Pending이고 spec.signerName=<your-signer-name>인 CertificateSigningRequests 리소스를 감시(watch)하세요.

    SECONDARY: Kubernetes v1.18 이전 버전을 사용한다면 이 단계는 건너뛰어도 돼요. (signerName 필드가 존재하지 않았어요.)

  2. 각 Pending CSR에 대해 (보안) 검사를 수행하세요 (다음 항목 참고)

  3. 인증서를 발급하고 .spec.status.certificate를 업데이트하세요

  4. CSR을 승인하고 .spec.status.conditions를 업데이트하세요

보안 요구사항

요구사항에 따라 악의적인 사용자에게 인증서가 발급되지 않도록 커스텀 검사를 구현할 수 있어요. CSR이 생성되면 kube-apiserver가 검사에 도움이 되도록 spec에 불변(immutable) 필드를 추가해요:

  • .spec.username: 요청자의 사용자 이름
  • .spec.groups: 요청자의 사용자 그룹
  • .spec.request: pem 형식의 인증서 요청

사용자와/또는 그룹이 요청된 인증서의 subject (alt) 이름과 일치하는지 확인하세요.

golang으로 서명자와 승인자 구현하기

  • client-go를 사용해 clientset을 만드세요
  • CSR을 감시하려면 clientset.CertificatesV1().CertificateSigningRequests().Watch(..)를 사용하세요
  • 인증서를 발급하려면 clientset.CertificatesV1().CertificateSigningRequests().UpdateStatus(...)를 사용하세요
  • CSR을 승인하려면 clientset.CertificatesV1().CertificateSigningRequests().UpdateApproval(...)을 사용하세요

추가 리소스

더 알아보기 (Learn more)

인증서 관리를 켜면 파드가 CSR 승인을 기다리는 동안 Init 단계에 머문다는 점을 기억하세요. 자동 승인자가 없다면 client-go로 컨트롤러를 직접 구현해야 해요. Kubernetes CSR 문서도 함께 읽어보면 이해에 큰 도움이 돼요.