Cert-manager: kubernetes에서 인증서 관리 자동화

보안 HTTP 통신은 일반적으로 TLS 인증서를 통해 이루어집니다. 이러한 인증서는 일반적으로 상호 TLS(mTLS)로 알려진 통신(https://your-bank.comhttps://amount-sender.com)에 관련된 서버(https://amount-receiver.com) 또는 양 당사자의 유효성을 검사하는 것일 수 있습니다. mTLS는 웹 브라우저에서 일반적이지 않지만 서비스 간 통신 모델에 사용됩니다.
보안을 유지하기 위해 이러한 인증서는 수명이 있으며 만료 시 갱신해야 합니다.

예를 들어 kubernetes에서 kublet는 mTLS를 통해 kube-api-server로 인증합니다. 인증서는 kubernetes 컨트롤 플레인 자체 내에서 제공되며 가입하는 모든 새 노드에 대해 새 인증서가 발급됩니다. 내부용으로 CertificateSigningRequest 개체가 제공되지만 워크로드 자체에서 사용할 만큼 유연하지 않습니다.

인증서 관리자



Cert-manager는 Kubernetes용 범용 x509 인증서 관리 도구입니다.
  • 표준 인증 기관(CA)으로 사용할 수 있습니다.
  • Hashicorp Vault 및 LetsEncrypt와 같이 잘 알려진 다른 CA와도 작동할 수 있습니다.
  • 자체 서명된 인증서를 생성할 수 있습니다
  • .
  • 주석을 통해 자동으로 작업 부하에 인증서를 삽입할 수 있습니다
  • .
  • 인증서 순환을 처리할 수 있습니다
  • .


    설치



    ❯ helm repo add jetstack https://charts.jetstack.io
    "jetstack" has been added to your repositories
    ❯ helm repo update
    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "jetstack" chart repository
    Update Complete. ⎈Happy Helming!⎈
    ❯ helm install \
      cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --create-namespace \
      --version v1.9.1 \
      --set installCRDs=true
    NAME: cert-manager
    LAST DEPLOYED: Mon Sep 19 08:45:10 2022
    NAMESPACE: cert-manager
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    cert-manager v1.9.1 has been deployed successfully!
    ...
    
    ❯ kubectl get all -n cert-manager
    NAME                                           READY   STATUS    RESTARTS   AGE
    pod/cert-manager-85f68f95f-k9f6q               1/1     Running   0          2m19s
    pod/cert-manager-cainjector-7d9668978d-lrtgn   1/1     Running   0          2m19s
    pod/cert-manager-webhook-66c8f6c75-hq7lj       1/1     Running   0          2m19s
    
    NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/cert-manager           ClusterIP   10.96.27.186   <none>        9402/TCP   2m19s
    service/cert-manager-webhook   ClusterIP   10.96.27.27    <none>        443/TCP    2m19s
    
    NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/cert-manager              1/1     1            1           2m19s
    deployment.apps/cert-manager-cainjector   1/1     1            1           2m19s
    deployment.apps/cert-manager-webhook      1/1     1            1           2m19s
    
    NAME                                                 DESIRED   CURRENT   READY   AGE
    replicaset.apps/cert-manager-85f68f95f               1         1         1       2m19s
    replicaset.apps/cert-manager-cainjector-7d9668978d   1         1         1       2m19s
    replicaset.apps/cert-manager-webhook-66c8f6c75       1         1         1       2m19s
    




    개념

  • 발급자
    인증서 서명 요청(CSR)을 통해 요청된 대로 인증서를 생성하는 CA를 나타내는 개체입니다. 네임스페이스 범위 리소스입니다. 운영 중인 네임스페이스 범위에서 유효한 인증서를 발급할 수 있습니다
  • .

  • 클러스터 발급자
    클러스터 범위가 있는 발급자 - 클러스터 전체에서 유효한 인증서를 발급할 수 있음

  • 자격증
    X.509 인증서를 정의하는 개체입니다. 이 인증서는 발급되며 cert-manager를 통해 갱신을 통해 최신 상태로 유지됩니다. Issuer를 통해 발급된 인증서는 네임스페이스 범위가 지정된 반면 ClusterIssuer를 통해 발급된 인증서는 클러스터
  • 를 통해 유효합니다.

  • 인증서 요청Issuer에서 인증서를 요청하는 데 사용되는 네임스페이스 리소스입니다. 여기에는 Issuer로 전송된 base-64로 인코딩된 CSR이 포함되어 있습니다. 성공하면 CSR을 기반으로 유효하고 서명된 인증서를 반환합니다.
    more info

  • cert-manager는 Let's Encrypt을 사용하여 ACME Issuer을 포함하여 ACME 서버에서 인증서 요청을 지원합니다. 이러한 인증서는 일반적으로 대부분의 컴퓨터가 공용 인터넷에서 신뢰합니다. 인증서를 성공적으로 요청하려면 cert-manager는 클라이언트가 요청 중인 DNS 주소를 소유하고 있음을 증명하기 위해 완료된 ACME 챌린지를 해결해야 합니다.

  • 주문하다
    서명된 TLS 인증서에 대한 ACME '주문'의 수명 주기를 관리하기 위해 ACME 발급자가 사용하는 리소스입니다. 단일 CSR을 나타냅니다.

  • 도전
    리소스는 단일 DNS 이름/식별자에 대한 '권한 부여'를 완료하기 위해 완료해야 하는 ACME '도전'의 수명 주기를 관리하기 위해 ACME 발급자가 사용하는 리소스입니다. challenge-controller에 의해 생성되고 관리됩니다.
    more info

  • 카인젝터
    웹후크 및 기타 API 서비스에 대한 CA 인증서를 가져오는 데 도움이 됩니다. caBundle , ValidatingWebhookConfiguration MutatingWebhookConfigurationCustomResourceDefinition 의 네 가지 API 유형의 APIService 필드를 채웁니다. KubernetesSecret, cert-managerCertificate 또는 Kubernetes API 서버 CA 인증서의 세 가지 소스 중 하나에서 CA 데이터를 복사합니다.
    참고: 소스가 KubernetesSecret인 경우 해당 리소스에도 cert-manager.io/allow-direct-injection: "true" 주석이 있어야 합니다.


  • 자체 서명된 인증서의 예



    # assumption: cert-manager is installed and configured as described above
    
    # Prepare a namespace
    ❯ kubectl create ns demo-ns
    namespace/demo-ns created
    
    # Prepare an issuercat issuer.yaml
    ---
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: selfsigned-issuer
      namespace: demo-ns
    spec:
      selfSigned: {}
    
    # Create
    ❯ kubectl create -f issuer.yaml
    issuer.cert-manager.io/selfsigned-issuer created
    
    # Verify
    ❯ kubectl get issuers.cert-manager.io -n demo-ns
    NAME                READY   AGE
    selfsigned-issuer   True    17s
    
    # Create a Certificate objectcat certificate.yaml
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: sample-certificate
      namespace: demo-ns
    spec:
      secretName: sample-certificate
      dnsNames:
      - sample.demo-ns
      issuerRef:
        name: selfsigned-issuer
    
    # Request for certificate
    ❯ kubectl create -f certificate.yaml
    certificate.cert-manager.io/sample-certificate created
    
    # Verify 
    ❯ kubectl get certificate -n demo-ns
    NAME                 READY   SECRET               AGE
    sample-certificate   True    sample-certificate   10s
    
    # Describe the secret
    ❯ kubectl get secrets/sample-certificate -n demo-ns -o yaml | cut -c -80
    apiVersion: v1
    data:
      ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lRWjFCcU
      tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lRWjFCc
      tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNEdQT
    kind: Secret
    metadata:
      annotations:
        cert-manager.io/alt-names: sample.demo-ns
        cert-manager.io/certificate-name: sample-certificate
        cert-manager.io/common-name: ""
        cert-manager.io/ip-sans: ""
        cert-manager.io/issuer-group: ""
        cert-manager.io/issuer-kind: Issuer
        cert-manager.io/issuer-name: selfsigned-issuer
        cert-manager.io/uri-sans: ""
      name: sample-certificate
      namespace: demo-ns
    type: kubernetes.io/tls
    
    # Inject secret to a validation webhookcat val-webhook.yaml
    ---
    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    metadata:
      name: test-webhook
      annotations:
        cert-manager.io/inject-ca-from-secret: demo-ns/sample-certificate
    webhooks:
    - name: test-webhook.example.com
      admissionReviewVersions:
      - v1
      clientConfig:
        service:
          name: test-webhook
          namespace: demo-ns
          path: /validate
          port: 443
      sideEffects: None
    
    # Instantiate assuming test-webhook is a valid service in demo-ns pointing to port 443 to validate on /validate route
    ❯ kubectl create -f val-webhook.yaml
    validatingwebhookconfiguration.admissionregistration.k8s.io/test-webhook created
    
    # Verify 
    ❯ kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io
    NAME                   WEBHOOKS   AGE
    cert-manager-webhook   1          137m
    test-webhook           1          6s
    
    

    좋은 웹페이지 즐겨찾기