Vault Secrets Store CSI provider

Vault Secrets Store CSI provider

Vault Secrets Store CSI provider는 파드가 Secrets Store CSI 볼륨을 사용해 Vault 시크릿을 소비할 수 있게 해줍니다. Vault Secrets Store CSI provider에는 CSI Secret Store Driver가 설치되어 있어야 합니다.

출처: 문서

본문

개요 (Overview)

높은 수준에서 Secrets Store CSI 드라이버는 SecretProviderClass 개체를 만들 수 있게 해줍니다. 이 개체는 사용할 시크릿 프로바이더와 가져올 시크릿을 정의합니다. CSI 볼륨을 요청하는 파드가 생성되면 Secrets Store CSI 드라이버는 프로바이더가 vault일 때 요청을 Vault Secrets Store CSI provider로 보냅니다. 그러면 Vault Secrets Store CSI provider는 지정된 SecretProviderClass와 파드의 서비스 계정을 사용해 Vault에서 시크릿을 가져와 파드의 CSI 볼륨에 마운트합니다.

시크릿은 ContainerCreation 단계 동안 Vault에서 가져와 CSI 시크릿 스토어 볼륨에 채워집니다. 즉 시크릿이 Vault에서 읽혀 볼륨에 기록될 때까지 파드가 시작되지 않고 차단됩니다.

기능 (Features)

Vault Secrets Store CSI provider는 다음 기능을 지원합니다.

  • 모든 Vault 시크릿 엔진 지원
  • 요청하는 파드의 서비스 계정을 사용한 인증
  • Vault와의 TLS/mTLS 통신
  • Vault 시크릿을 파일로 렌더링
  • Agent가 수행하는 동적 임대 캐싱·갱신
  • 환경 변수로 사용할 수 있도록 시크릿을 Kubernetes 시크릿에 동기화
  • Vault Helm을 통한 설치

참고: Helm으로 설치하면 Vault CSI provider가 Vault Agent와 같은 파드 안에서 실행됩니다. Vault Agent는 재시작 전에 생성된 토큰을 갱신할 수 없습니다. 따라서 Vault Agent 컨테이너가 중지되거나 재시작되면, 기존 토큰이 만료될 때 Vault Agent가 관련 임대를 폐기합니다.

지원되는 Kubernetes 버전

IBM은 다음 Kubernetes 마이너 릴리스에 대해 Vault를 테스트·검증합니다. IBM은 다른 버전의 Kubernetes에서는 기능이 작동할 수 있지만 Vault를 지원하지 않습니다.

  • 1.36
  • 1.35
  • 1.34
  • 1.33
  • 1.32

Vault에 인증하기

Vault Secrets Store CSI provider는 CSI 볼륨을 마운트하는 파드의 서비스 계정으로 Vault에 인증합니다. Kubernetes와 JWT 인증 메서드가 지원됩니다. 파드의 서비스 계정은 Vault 역할과 원하는 시크릿에 대한 접근을 부여하는 정책에 바인딩되어야 합니다.

애플리케이션이 필요한 것보다 더 많은 시크릿에 접근하지 못하도록 전용 Kubernetes 서비스 계정으로 파드를 실행하는 것을 강력히 권장합니다.

시크릿 프로바이더 클래스 예시 (Secret provider class example)

다음은 vault 프로바이더를 사용하는 Secret Provider Class의 예시입니다.

---
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: vault-db-creds
spec:
  # Vault Secrets Store CSI provider
  provider: vault
  parameters:
    # Vault role name to use during login
    roleName: 'app'
    # Vault address and TLS connection config is normally best configured by the
    # helm chart, but can be overridden per SecretProviderClass:
    # Vault's hostname
    #vaultAddress: 'https://vault:8200'
    # TLS CA certification for validation
    #vaultCACertPath: '/vault/tls/ca.crt'
    objects: |
      - objectName: "dbUsername"
        secretPath: "database/creds/db-app"
        secretKey: "username"
      - objectName: "dbPassword"
        secretPath: "database/creds/db-app"
        secretKey: "password"
    # "objectName" is an alias used within the SecretProviderClass to reference
    # that specific secret. This will also be the filename containing the secret.
    # "secretPath" is the path in Vault where the secret should be retrieved.
    # "secretKey" is the key within the Vault secret response to extract a value from.

Secret Provider Class는 Kubernetes의 네임스페이스 범위 개체입니다.

시크릿 프로바이더 클래스 사용하기

애플리케이션 파드는 위의 예시 Secret Provider Class를 CSI 볼륨으로 마운트해 사용합니다.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: demo
spec:
  selector:
    matchLabels:
      app: demo
  replicas: 1
  template:
    spec:
      serviceAccountName: app
      containers:
        - name: app
          image: my-app:1.0.0
          volumeMounts:
            - name: 'vault-db-creds'
              mountPath: '/mnt/secrets-store'
              readOnly: true
      volumes:
        - name: vault-db-creds
          csi:
            driver: 'secrets-store.csi.k8s.io'
            readOnly: true
            volumeAttributes:
              secretProviderClass: 'vault-db-creds'

이 예시에서 volumes.csi는 애플리케이션 배포에 생성되며 vault-db-creds라는 Secret Provider Class를 참조합니다.

튜토리얼

Helm 차트로 Vault와 그 의존성을 설정하는 방법은 Vault Secrets Store CSI provider 튜토리얼을 참고하세요.

더 알아보기 (Learn more)