Kubernetes 시크릿 엔진

Kubernetes 시크릿 엔진

Kubernetes 시크릿 엔진은 애플리케이션이 Kubernetes API에 인증할 수 있도록 Kubernetes 서비스 계정 토큰 또는 서비스 계정 자격 증명(JSON 웹 토큰)을 생성해요. 이 시크릿 엔진은 Kubernetes TokenReview API를 사용해 토큰을 인증하고, 특정 기능이 담긴 Kubernetes 서비스 계정 토큰을 생성하는 데 도움을 줘요.

Kubernetes 시크릿 엔진은 시크릿 엔진 역할(role)을 활용해 동작해요. 역할은 생성된 서비스 계정 토큰에 추가되어야 하는 기능 집합을 정의해요. 사용자나 머신이 서비스 계정 토큰을 생성하려면 역할을 만들고 그 역할의 경로에 쓰기 접근 권한이 있어야 해요. 역할은 시크릿 엔진의 creds 엔드포인트에 생성돼요.

출처: 문서

본문

설정(Setup)

대부분의 시크릿 엔진은 기능을 수행하기 전에 미리 구성해야 해요. 이 단계는 보통 운영자 또는 구성 관리 도구가 수행해요.

Kubernetes 시크릿 엔진을 활성화해요.

$ vault secrets enable kubernetes
Success! Enabled the kubernetes secrets engine at: kubernetes/

시크릿 엔진이 Kubernetes API 서버와의 연결을 설정하도록 구성하려면 적절한 Kubernetes 자격 증명을 제공해야 해요. JSON 웹 토큰 형태의 Kubernetes 서비스 계정 자격 증명을 제공하거나, Kubernetes가 호스팅하는 서버 측 서비스 계정 토큰(server-hosted service account token)을 사용할 수 있어요.

Vault에 Kubernetes 자격 증명을 제공하지 않으면, Vault는 가능할 때 Kubernetes in-cluster 서비스 계정 토큰을 기본으로 사용해요.

  1. Kubernetes API 서버에 도달하는 데 사용될 연결 세부 정보로 Kubernetes 시크릿 엔진을 구성해요. JWT 또는 JWT와 선택적 인증 기관(CA) 인증서가 담긴 Vault k8s 시크릿을 제공해요. JWT를 사용하려면 base64 디코딩된 JWT를 제공해요.

    $ vault write kubernetes/config \
        kubernetes_host=https://127.0.0.1:6443 \
        [email protected] \
        [email protected]
    Success! Data written to: kubernetes/config
    

    잠깐, 이 token_reviewer_jwt는 자동으로 회전되지 않아요. 이 토큰 리뷰어 JWT 만료로 인증 실패를 포함한 연결 오류가 발생할 수 있어요. 이 문제를 해결하려면 자격 증명을 다시 갱신하고 토큰을 Kubernetes 시크릿 엔진 구성에 업데이트해야 해요.

    참고: minikube를 쓰고 있거나 CA 인증서가 유효하지 않으면(리눅스 CA 스토어/시스템 CA 스토어에 없으면), "system" CA로 TLSVerify false를 써야 하거나 Vault에 완전한 체인을 제공해야 할 수 있어요. kubernetes_ca_cert를 전체 체인으로 설정하는 것을 권장해요. kubernetes_cert_authority(API로 구성하는 게 아니라 페이지에서 언급된 옛 방식)는 사용하지 않는 것이 좋아요.

  2. (대안) 서비스 계정 토큰(JWT)과 선택적으로 인증 기관(CA) 인증서가 담긴 Kubernetes 시크릿을 Kubernetes 시크릿 엔진에 제공해요.

    $ vault write kubernetes/config \
        kubernetes_host=https://127.0.0.1:6443 \
        [email protected]
    Success! Data written to: kubernetes/config
    

    다음과 같은 형식의 Kubernetes 시크릿을 제공해야 해요.

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-vault-token-xxxxx
      namespace: vault
    

    또한 Vault에서 토큰을 생성할 수 있도록 추가 권한이 필요해요. 예를 들어 다음 ClusterRoleBinding이 필요합니다.

    clusterRoleBinding: vault-auth-delegator:
      roles:
        - apiGroups: [""]
          resources: ["serviceaccounts/token"]
          verbs: ["create"]
        - apiGroups: [""]
          resources: ["serviceaccounts"]
          verbs: ["get"]
        - apiGroups: [""]
          resources: ["namespaces"]
          verbs: ["get"]
      subjects:
        - kind: ServiceAccount
          name: vault-auth
          namespace: vault
    

    kubernetes_k8s_secret을 사용하면 시크릿의 서비스 계정 토큰(JWT)이 기존의 token_reviewer_jwt 값을 대체해요.

  3. (대안) 외부 identity 공급자로 Kubernetes 서비스 계정 토큰을 제공해요. 이 방식은 Vault가 Kubernetes 클러스터 안에서 파드로 실행 중일 때 동작해요.

    $ vault write kubernetes/config \
        kubernetes_host=https://127.0.0.1:6443
        [email protected]
    

    그리고 Vault의 in-cluster 토큰으로 시크릿 엔진을 구성할 수 있어요. (구성 시 Vault가 in-cluster 서비스 계정 토큰을 자동으로 사용하도록 하면 됩니다.)

  4. (선택) TLS 설정을 제어하기 위한 명시적 구성을 제공해요.

    $ vault write kubernetes/config \
        kubernetes_host=https://127.0.0.1:6443 \
        [email protected] \
        [email protected] \
        tls_server_name=kubernetes.default.svc.cluster.local \
        tls_skip_verify=false
    

Kubernetes 구성 파라미터

구성 파라미터 설명
kubernetes_host Kubernetes API 서버의 URL. 파라미터에 스킴을 포함하면 안 돼요. 예: https://kubernetes.default.svc.cluster.local:443
kubernetes_ca_cert Kubernetes API 서버의 TLS 인증서를 검증하는 데 사용되는 PEM 인코딩 CA 인증서. 끝에 빈 줄이 허용돼요.
kubernetes_cluster_certificate_authority (비권장) 대신 kubernetes_ca_cert를 사용하세요.
kubernetes_cert_authority (레거시 전용) 대신 kubernetes_ca_cert를 사용하세요.
tls_server_name TLS 핸드셰이크의 SNI에 보낼 TLS 서버 이름이자, 서버 인증서를 검증할 이름.
tls_skip_verify 인증서 체인과 호스트 이름 검증을 건너뛸지 여부.
token_reviewer_jwt base64 디코딩된 또는 원시 JWT. 참고: 기존 kubernetes_k8s_secret 값을 대체해요.
kubernetes_k8s_secret 서비스 계정 토큰이 담긴 Kubernetes 시크릿. YAML 또는 JSON 형식으로 제공돼요. kubernetes_ca_certtoken_reviewer_jwt를 채우는 데 사용돼요.

참고: token_reviewer_jwt는 자동으로 회전되지 않아요.

사용법(Usage)

신뢰를 설정해 수퍼유저 권한으로 Kubernetes 서비스 계정 토큰을 생성하거나, 대안으로 UI를 통해 시크릿 엔진을 구성하고 서비스 계정 토큰을 생성할 수 있어요.

  1. 서비스 계정에 대한 Kubernetes 역할을 만들어요. 역할은 토큰을 생성하거나 발급할 수 있어요.

    $ vault write kubernetes/roles/my-role \
        service_account_name="my-sa" \
        kubernetes_namespace="default" \
        allowed_kubernetes_namespaces="default" \
        token_default_ttl="8h" \
        token_max_ttl="12h"
    Success! Data written to: kubernetes/roles/my-role
    
  2. creds 엔드포인트를 읽어 새 서비스 계정 자격 증명 집합을 생성해요.

    $ vault read kubernetes/creds/my-role
    Key                 Value
    ---                 -----
    lease_id            kubernetes/creds/my-role/example-lease-id
    service_account_name   my-sa
    service_account_namespace   default
    token                  <token>
    token_expires_at    2019-06-06T00:29:53.507691944Z
    

Kubernetes 시크릿 엔진은 이제 Kubernetes TokenReview API를 통한 토큰 생성을 지원해요.

API

Kubernetes 시크릿 엔진은 완전한 HTTP API를 갖고 있어요. 자세한 내용은 Kubernetes secrets engine API 페이지를 참고해 주세요.

튜토리얼(Tutorial)

시작 가이드에 대한 자세한 내용은 Kubernetes Secrets Engine 튜토리얼을 참고하세요. 이 튜토리얼은 서비스 계정과 역할 생성, Vault Agent를 사용한 파드 시크릿 주입, Vault Agent Injector 구성 등 다양한 사용 사례를 안내해요. 또한 Kubernetes에서 Vault 실행 튜토리얼도 확인해 보세요.

더 알아보기 (Learn more)

  • Kubernetes Secrets Engine 시작하기(Learn 튜토리얼)
  • Kubernetes SSRF 사용하기(KubeCon 2021, 19m)
  • 5분짜리 Kubernetes Secrets Engine 동영상 보기(HashiCorp의 5분 설치·설정 데모)
  • Kubernetes Secrets Engine의 기능 살펴보기(KubeCon 2021, 26m)