Container Orchestration/Kubernetes

CertManager로 Let's Encrypt 인증서 발급

Somaz 2023. 10. 3. 22:21
728x90
반응형

Overview

오늘은 Kubernetes 클러스터 환경에서 HTTPS 통신을 위한 TLS 인증서를 자동으로 발급하고 갱신할 수 있는 CertManager와 Let's Encrypt의 연동 방법에 대해 알아본다.

 

CertManager는 Kubernetes에서 인증서 관리 작업을 자동화해주는 컨트롤러로, Let's Encrypt와 함께 사용하면 ACME 프로토콜을 통해 별도의 수작업 없이도 유효한 TLS 인증서를 발급받을 수 있다.

 

이 글에서는 CertManager 설치부터 시작해, DNS 공급자별로 AWS Route53, Google CloudDNS, Cloudflare를 활용해 인증서를 발급받는 전체 흐름을 단계별로 정리해본다. 또한 ACME challenge 방식에 대한 배경 지식도 함께 소개하며, 인증서 자동화에 필요한 구성요소들을 실습 기반으로 학습해본다.

 

 

이를 통해 실무에서 Kubernetes 기반 서비스를 운영할 때 HTTPS를 간편하게 구성하고, 인증서 갱신에 대한 부담을 줄이는 데 큰 도움이 될 것이다.

 

 

출처 : https://blog.opstree.com/2022/09/27/securing-k8s-traffic-with-cert-manager-amp-lets-encrypt/

 

모든 소스코드는 아래의 Github에 저장되어 있다.

 

 

 

 


 

 

CertManager란?

CertManager는 CustomResourceDefinitions 세트로 구성된 Kubernetes 기본 인증서 관리 컨트롤러이다. 

Kubernetes 클러스터에 CertManager를 추가하면 인증서 및 인증서 발급자가 Kubernetes 클러스터의 사용자 지정 리소스 유형으로 추가된다.

CertManager는 Let's encrypt, Vault, SelfSigned, Venafi와 같은 다양한 소스에서 인증서를 발급할 수 있다.

 

 

CertManager 설치

최신 버전을 설치하려면 공식 certmanager 릴리스를 참조하면 된다. 버전 v1.12.3의 경우 다음 명령을 실행한다.

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.3/cert-manager.yaml

 

설치 확인한다.

kubectl get po -n cert-manager

k get po -n cert-manager
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-75f8fbb664-q4k6f              1/1     Running   0          33s
cert-manager-cainjector-69448777d5-hnz5d   1/1     Running   0          33s
cert-manager-webhook-694b449697-7d4zp      1/1     Running   0          33s

 

 

 


 

 

 

 

DNS 공급자 구성

ACME DNS-01 챌린지 공급자를 구성하는 방법에 대한 자세한 내용은 공식 certmanager 설명서를 참조하면 된다.

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: example-issuer
spec:
  acme:
    email: user@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: example-issuer-account-key
    solvers:
    - dns01:
        cloudDNS:
          project: my-project
          serviceAccountSecretRef:
            name: prod-clouddns-svc-acct-secret
            key: service-account.json

 

 

 

 

 


 

 

 

Let's Encrypt란?

 

 Let's Encrypt는 비영 Internet Security Research Group(ISRG)에서 제공하는 무료, 자동화된 개방형 인증 기관(CA)이다. 

주요 목표는 SSL/TLS 인증서를 최대한 쉽고 원활하게 획득하고 관리하여 보다 안전하고 개인 정보를 존중하는 웹을 홍보하는 것이다. Let's Encrypt는 신청자가 특정 도메인 이름을 제어할 수 있는지 확인하는 DV(도메인 검증) 인증서를 제공하지만 일부 상업용 인증서 제공업체처럼 확장된 확인을 제공하지는 않는다.

 

 

 

 

Let's Encrypt 운영 프로세스

 

  1. Account Creation(계정 생성)
  2. Domain Verification(도메인 확인)
    • HTTP challenge(HTTP 챌린지)
    • DNS challenge(DNS 챌린지)
    • TLS-ALPN challenge(TLS-ALPN 챌린지)
  3. Certificate Issuance(인증서 발급)
  4. Automation with ACME(ACME를 통한 자동화)
  5. Certificate Renewal(인증서 갱신)

 

 

Let's Encrypt 작동 과정

 

 

 

 

Account Creation(계정 생성)

인증서를 받기 전에 사용자는 Let's Encrypt를 사용하여 계정을 생성해야 한다. 일반적으로 개인 키를 생성하고 이를 사용하여 Let's Encrypt에 대한 요청에 서명하는 작업이 포함된다.

 

 

 

Domain Verification(도메인 확인)

인증서를 발급하려면 Let's Encrypt는 요청자가 인증서를 요청하는 도메인을 제어하는지 확인해야 한다. 일반적으로 다음과 같은 여러 과제 중 하나를 통해 수행한다.

 

HTTP challenge(HTTP 챌린지)

  • 사용자가 웹사이트의 미리 결정된 URL에 특정 파일을 배치한다.

 

DNS challenge(DNS 챌린지)

  • 사용자는 도메인에 대한 특정 DNS 레코드를 생성한다.

 

TLS-ALPN challenge(TLS-ALPN 챌린지)

  • 특정 도메인 서버에 특수 확장이 포함된 인증서를 제공하는 작업이 포함된다.

 

 

Certificate Issuance(인증서 발급)

도메인 제어가 확인되면 Let's Encrypt는 사용자 도메인에 대한 인증서를 생성한다. 인증서와 해당 개인 키(사용자가 이미 가지고 있어야 함)를 웹 서버에 설치하여 HTTPS를 활성화할 수 있다.

 

 

Automation with ACME(ACME를 통한 자동화)

Let's Encrypt의 주요 기능 중 하나는 자동화된 인증서 관리 환경(ACME) 프로토콜이다. ACME는 도메인 유효성 검사, 인증서 발급 및 인증서 갱신 프로세스를 자동화한다. ACME 프로토콜을 구현하는 소프트웨어 클라이언트는 인증서를 자동으로 관리하도록 서버에 설정할 수 있다. 이는 Let's Encrypt의 인증서 유효 기간이 90일로 상대적으로 짧기 때문에 특히 유용하다. 널리 사용되는 ACME 클라이언트에는 Certbot, acme.sh 등이 포함된다.

 

 

Certificate Renewal(인증서 갱신)

Let's Encrypt 인증서는 수명이 90일로 짧기 때문에 정기적으로 갱신해야 한다. ACME 클라이언트 소프트웨어를 사용하면 이 프로세스를 자동화할 수 있다. 갱신 문제가 발생할 경우 지속적인 보호를 보장하려면 인증서가 약 60일 정도 지난 후에 갱신을 시도하는 것이 좋다.

 

 

 

 

 


 

 

 

 

CertManager로  Let's Encrypt 인증서 발급

 

ACME는 다양한 DNS 공급자가 지원된다. 다양한 DNS 공급자 중에 `AWS Route53`, `CloudFlare`, `Google CloudDNS`에 대해서 알아볼 예정이다.

 

전제조건

  • 버전 1.20 이상으로 실행 중인 Kubernetes 클러스터
  • Kubectl CLI가 설치되고 Kubernetes 클러스터와 통신하도록 구성

 

 

 

 

 

CertManager로 Let's Encrypt 인증서 발급 프로세스

CertManager로 Let's Encrypt 인증서 발급 프로세스를 구성할땐 순서가 가장 중요하다. 순서대로 진행하지 않으면 에러가 발생한다. 순서대로 구성하고, 구성후에는 항상 정상적으로 리소스가 생성되었는지 확인해야한다.

 

  1. CertManager 설치
  2. DNS 공급자 선정 `(ex. AWS Route53, CloudFlare, Google CloudDNS)`
  3. DNS 공급자 Secret or API Token 생성
  4. Clusterissuer 생성
  5. Certificate & ingress 생성

 

 

 

 


 

 

 

 

 

AWS Route53

 

AWS Secret Access Key를 사용하여 Kubernetes Secret을 생성한다.

kubectl create secret generic route53-credentials-secret \
--from-literal=secret-access-key=AWS_SECRET_ACCESS_KEY \
--namespace=[CERT-MANAGER-NAMESPACE] > route53-credentials-secret.yaml

 

 

 

순차적으로 `clusterissuer`, `certificate`, `ingress`를 생성한다.

`route53-credentials-secret`은 `cert-manager namespace`에 생성되고 `clusterissuer`는 네임스페이스에 속하지 않는다.

k apply -f route53-credentials-secret.yaml -n certmanager
k apply -f clusterissuer.yaml  # No namespace

 

 

 

 

마지막으로 나머지 리소스들을 생성해준다.

참고로, 적용할 애플리케이션의 네임스페이스를 생성해야 한다.

k apply -f certificate.yaml -n <application namespace>
k apply -f ingress.yaml -n <application namespace>

 

 

 

 

 


 

 

 

 

 

Google CloudDNS

 

GCP ServiceAccount를 사용하여 Kubernetes Secret을 생성한다.

kubectl create secret generic clouddns-credentials-secret \
--from-file=key.json=/path/to/SERVICE_ACCOUNT_KEY.json \
--namespace=[CERT-MANAGER-NAMESPACE] > clouddns-credentials-secret.yaml

 

 

 

순차적으로 `clusterissuer`, `certificate`, `ingress`를 생성한다.

`clouddns-credentials-secret`은 `cert-manager namespace`에 생성되고 `clusterissuer`는 네임스페이스에 속하지 않는다.

k apply -f clouddns-credentials-secret.yaml -n certmanager
k apply -f clusterissuer.yaml  # No namespace

 

 

 

 

마지막으로 나머지 리소스들을 생성해준다.

참고로, 적용할 애플리케이션의 네임스페이스를 생성해야 한다.

k apply -f certificate.yaml -n <application namespace>
k apply -f ingress.yaml -n <application namespace>

 

 

 

 

 

 


 

 

 

 

 

CloudFlare

 

API Token 생성

  1. Cloudflare 계정 생성 을 한다.
  2. `My Profile` 섹션으로 이동한 후 API Token을 생성한다. 
  3. API Token 권한은 `zone-zone(영역-영역)`과 읽기 권한, `zone-dns(영역-dns)` 편집 권한을 부여하여 생성한다.

 

순차적으로 `clusterissuer`, `certificate`, `ingress`를 생성한다.

`cloudflare-api-token-secret`은 `cert-manager namespace`에 생성되고 `clusterissuer`는 네임스페이스에 속하지 않는다.

k apply -f cloudflare-api-token-secret.yaml -n certmanager
k apply -f clusterissuer.yaml  # No namespace

 

 

 

마지막으로 나머지 리소스들을 생성해준다.

참고로, 적용할 애플리케이션의 네임스페이스를 생성해야 한다.

k apply -f certificate.yaml -n <application namespace>
k apply -f ingress.yaml -n <application namespace>

 

 

 

 

 


 

 

 

 

 

인증서 발급 확인 및 트러블슈팅 팁

  • `kubectl describe certificate <name>` 으로 상태 확인
  • `kubectl describe order, kubectl describe challenge` 로 ACME 흐름 추적 가능
  • DNS-01 챌린지의 경우, 실제 DNS에 TXT 레코드가 생성되었는지 확인

 

 

 

추가 꿀팁: staging vs production

 

Let's Encrypt에는 테스트용 Staging 서버와 실제 인증서를 발급하는 Production 서버가 있다.

  • `Staging: https://acme-staging-v02.api.letsencrypt.org/directory`
  • `Production: https://acme-v02.api.letsencrypt.org/directory` 

 

초기 실습이나 테스트 시에는 반드시 Staging을 사용하자. Let's Encrypt에는 rate limit이 존재한다.

 
 
 

Ingress Controller 연동 주의사항

 

Ingress에 다음 어노테이션을 반드시 지정해야 한다.

cert-manager.io/cluster-issuer: "letsencrypt-prod" # clusterissuer name
  • "letsencrypt-prod" 에는 clusterissuer name이 들어가야 한다.

 

 

 

 

 


 

 

 

 

 

 

마무리

CertManager는 Kubernetes 환경에서 인증서 수명 주기를 자동화하는 매우 유용한 도구이다. 특히 Let's Encrypt와의 연동을 통해 공인 인증서를 손쉽게 발급받고 갱신할 수 있으며, 다양한 DNS 공급자와의 연동도 매우 유연하게 제공된다.

 

이번 글에서는 AWS Route53, Google CloudDNS, Cloudflare 세 가지 대표적인 DNS 공급자와의 연동 방법을 중심으로 인증서 발급 절차를 실습해보았다. 핵심은 순서를 정확히 지키고, 각 Secret, ClusterIssuer, Certificate, Ingress 설정이 올바르게 구성되어 있는지 확인하는 것이다.

 

추가적으로, CertManager는 단순한 HTTPS 인증서 발급 도구를 넘어 Vault, Venafi, SelfSigned 등 다양한 CA 연동이 가능하고, webhook 인증이나 IRSA, Pod Identity 같은 클라우드 네이티브 보안 패턴과도 잘 통합된다.

 

 

앞으로 Helm을 활용한 배포 자동화나 ArgoCD 같은 GitOps 파이프라인에 CertManager를 통합한다면, TLS 보안 설정도 코드 기반으로 관리할 수 있는 강력한 인프라 자동화 체계를 구성할 수 있을 것이다.

 

 

 

 

 

 

 


Reference

https://blog.opstree.com/2022/09/27/securing-k8s-traffic-with-cert-manager-amp-lets-encrypt/

 

https://github.com/somaz94/certmanager-letsencrypt

 

https://cert-manager.io/docs/configuration/acme/dns01/#supported-dns01-providers

 

https://www.cloudflare.com/ko-kr/

728x90
반응형

'Container Orchestration > Kubernetes' 카테고리의 다른 글

2. Kustomize + ArgoCD ApplicationSet  (2) 2023.10.14
1. Kustomize란?  (0) 2023.10.12
Kubernetes Autoscaling & Karpenter  (0) 2023.05.24
Helm Chart 작성방법  (0) 2023.05.18
Helm 이란? (Kubernetes Package manager)  (2) 2023.05.16