DNS 설정 - CA, cert-manager

junkyu lee·2024년 5월 10일
0

도메인을 DNS에 등록, CA기관으로부터 인증을 받아 브라우저를 통해 접속시 해당 인증 기관에서 발급한 인증서로 접근 가능하도록 세팅

1. DNS에 등록

DNS의 역할

  • 도메인 이름을 IP 주소로 변환하여 서버로 접속 가능하게 해주는 기능.
  • 대표적인 DNS: 구글 (8.8.8.8, 8.8.4.4), CF (1.1.1.1)

여기선 CF(cloudeflare) 를 통해 무료로 DNS를 등록, proxy 기능 제공

  • proxy 기능 : 도메인 주소로 온 요청을 ip로 전환 해서 ip를 보호. 요청이 기계에 의한 요청인지 확인(DDoS 공격 등을 사전에 방어)

등록 절차

  1. 도메인 구매 (mailplug을 통해 진행)
  2. cloudflare에 도메인 등록
    1. 로그인 후 Add site 클릭하여 도메인 등록
  3. mailplug에서 해당 도메인의 네임서버를 cloudflare로 등록

설정

  • SSL/TLS : 웹 트래픽을 암호화 규칙 설정

    • FULL strict(전체 엄격) : 브라우저 <-> DNS(cf) <-> Server 간의 모든 통신을 암호화. 서버에 CA 인증이 필요하다.
  • DNS 레코드 추가

    • 루트 도메인에 대한 A, AAAA 또는 CNAME 레코드추가 가능
      • A 설정 > example.com. IN A 192.0.2.1
      • AAAA 설정 > example.com. IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
      • CNAME 레코드 설정 > www.example.com. IN CNAME example.com.

2. CA 인증

CA(Certificate Authority)란?

  • SSL/TLS 인증서(공개 키 기반 구조)를 발급하여 웹사이트와 사용자의 통신을 암호화하고 보안성을 제공

여기서는 Let's Encrypt 라는 무료 CA 기관을 이용. kubenetescert manager를 통해 CA를 자동으로 관리

  • cert manager : 인증 기관(CA)과 통합하여 인증서를 자동으로 발급, 관리, 배포하는 도구

작동 방식

  1. 인증서 요청: Certificate 리소스는 특정 도메인에 대해 인증서를 요청합니다. 이 요청에는 어떤 Issuer를 사용할지에 대한 정보가 포함됩니다(issuerRef 필드).
  2. 인증서 발급: Certificate 리소스가 생성되면, cert-managerissuerRef 필드를 참조하여 해당 Issuer 또는 ClusterIssuer를 찾습니다. 이 예시에서는 lets-encrypt-issuer라는 이름의 Issuer를 참조합니다.
  3. 도메인 검증: Issuer 리소스는 설정된 방식(예: ACME 프로토콜)을 사용하여 도메인 소유권을 검증합니다. Let's Encrypt의 경우 HTTP-01 또는 DNS-01 챌린지를 사용하여 도메인 검증을 수행합니다.
  4. 인증서 발급 및 저장: 검증이 완료되면, Issuer는 인증서를 발급하고, 이를 Certificate 리소스의 secretName 필드에 지정된 Kubernetes 시크릿에 저장합니다.
  5. 자동 갱신: Certificate 리소스는 만료 전에 자동으로 갱신되며, 이 과정에서도 Issuer가 사용됩니다. renewBefore 필드에 지정된 기간 전에 갱신을 시작합니다.

Issuer

Certificate에서 정의된 인증서 요청을 처리하고 실제 인증서를 발급하는 리소스

  1. 종류

    • ACME Issuer: Let's Encrypt와 같은 ACME 프로토콜을 지원하는 CA를 사용하여 인증서를 발급
    • SelfSigned Issuer: 자체 서명된 인증서를 발급
    • ...

letsencrypt를 이용하기 때문에 letsencrypt의 프로토콜인 acme을 사용

apiVersion: cert-manager.io/v1
kind: ClusterIssuer # 클러스터 전체에서 인증서를 발급하고 관리하는 리소스
metadata:
  name: lets-encrypt-issuer
  namespace: cert-manager # namespace 설정을 cert-manager로 하지 않으면 진행 x. RBAC 또는 secret 접근 권한 때문으로 예상
spec:
  acme:
    email: devops@publicai.co.kr
    server: https://acme-staging-v02.api.letsencrypt.org/directory # 스테이징 환경
    privateKeySecretRef:
      name: lets-encrypt-certificate
    solvers: # 도메인 소유권 검증 방식
      - dns01: # CF DNS에서 발급받은 API key를 통해 소유권을 검증
          cloudflare:
            email: devops@publicai.co.kr
            apiTokenSecretRef:
              name: cloudflare-api-secret
              key: api-token
  • 스테이징 환경으로 진행하는 이유 : 프로덕션 Issuer는 시도 횟수가 한정 되어있음

acme 프로토콜를 위한 준비

  1. API token 발급

    1. cloudflare에서 API token 으로 이동 (검색)

    2. token 권한 설정

    3. 발급된 토큰으로 secret 생성

  2. secret 생성

    apiVersion: v1
    kind: Secret
    metadata:
      name: cloudflare-api-secret
      namespace: cert-manager
    stringData:
      api-token: "API token"
    • 생성한 secret은 kubeseal 로 암호화 필요

참고

cert manager: https://cert-manager.io/docs/concepts/issuer/

letsencrypt: https://letsencrypt.org/docs/staging-environment/

Certificate

인증서 요청에 대한 정의

  • 도메인, 키 알고리즘, 크기 등을 정의
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: haimp-cert
  namespace: haimp
spec:
  secretName: haimp-cert
  issuerRef: # 인증서를 발급할 Issuer
    name: lets-encrypt-issuer 
    kind: ClusterIssuer
    group: cert-manager.io
  commonName: pai-world.com # 인증서의 CN(commonName) 필드
  dnsNames: # 도메인 이름 목록
    - "pai-world.com"
    - "*.pai-world.com"

참고

https://cert-manager.io/docs/usage/certificate/

profile
가끔 기록하는 velog

0개의 댓글