Container Orchestration/Kubernetes

CertManager로 Let's Encrypt 인증서 발급

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

Overview

CertManager로  Let's Encrypt 인증서 발급 방법에 대해서 알아보려고 한다.

 

출처 : 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>

 

 


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