2.4. GitOps를 사용하여 OpenShift에서 HashiCorp Vault를 시크릿 공급자로 구성


OpenShift Container Platform에서 Secrets Store CSI Driver Operator를 사용하여 HashiCorp Vault를 시크릿 공급자로 구성할 수 있습니다. Argo CD에서 관리하는 GitOps 워크플로우와 결합하는 경우 Vault에서 시크릿을 안전하게 검색하고 OpenShift에서 실행되는 애플리케이션에 삽입할 수 있습니다.

OpenShift Container Platform의 Secrets Store CSI 드라이버와 통합하도록 GitOps 리포지토리를 구조화하고 Vault CSI 공급자를 구성합니다.

다음 샘플 GitOps 리포지토리 레이아웃은 Vault를 애플리케이션과 통합하는 데 사용됩니다.

GitOps 리포지토리의 디렉터리 구조 예

├── config
│   ├── argocd 
1

│   │   ├── vault-secret-provider-app.yaml
│   │   ├── ...
│── environments
│   ├── dev
│   │   ├── apps
│   │   │   ├── demo-app
│   │   │       ├── manifest 
2

│   │   │       |    ├── secretProviderClass.yaml
│   │   │       |    ├── serviceAccount.yaml
│   │   │       |    ├── deployment.yaml
│   │   │       ├── argocd 
3

│   │   │            ├── demo-app.yaml
Copy to Clipboard Toggle word wrap

1
config/argocd/ - Vault CSI 공급자와 같은 클러스터 전체 툴에 대한 Argo CD 애플리케이션 정의를 저장합니다.
2
environments/<env>/apps/<app-name>/manifest/: 특정 환경의 애플리케이션과 관련된 Kubernetes 매니페스트가 포함됩니다.
3
environments/<env>/apps/<app-name>/argocd/: 애플리케이션 및 해당 리소스를 배포하는 Argo CD 애플리케이션 정의가 포함되어 있습니다.

2.4.1. GitOps를 사용하여 Vault CSI 공급자 설치

HashiCorp의 공식 Helm 차트를 사용하는 Argo CD 애플리케이션을 배포하여 Vault CSI 공급자를 설치합니다. 이 방법은 버전이 제어하는 Argo CD 애플리케이션 리소스를 통해 선언적으로 설치를 관리하여 GitOps 모범 사례를 따릅니다.

사전 요구 사항

  • OpenShift Container Platform 클러스터에 관리자로 로그인되어 있습니다.
  • OpenShift Container Platform 웹 콘솔에 액세스할 수 있습니다.
  • SSCSI Driver Operator 가 클러스터에 설치되어 있습니다.
  • OpenShift Container Platform 클러스터에 Red Hat OpenShift GitOps 를 설치했습니다.
  • secrets를 사용할 수 있는 GitOps 리포지토리가 있습니다.

프로세스

  1. Vault CSI 공급자용 Argo CD 애플리케이션 리소스 생성.

    1. Argo CD 애플리케이션 리소스를 생성하여 Vault CSI 공급자를 배포합니다. GitOps 리포지토리에 이 리소스를 추가합니다(예: config/argocd/vault-secret-provider-app.yaml ):

      vault-secret-provider-app.yaml 파일 예

      apiVersion: argoproj.io/v1alpha1
      kind: Application
      metadata:
        name: vault-secret-provider-app
        namespace: openshift-gitops
      spec:
        destination:
          namespace: vault-csi-provider
          server: https://kubernetes.default.svc
        project: default
        source:
          repoURL: https://helm.releases.hashicorp.com
          chart: vault
          targetRevision: 0.30.0
          helm:
            releaseName: vault
            values: |
              csi:
                enabled: true
              server:
                enabled: true
                dataStorage:
                   enabled: false
              injector:
                enabled: false
        syncPolicy:
          automated:
            prune: true
            selfHeal: true
          syncOptions:
          - CreateNamespace=true
        ignoreDifferences:
        - kind: DaemonSet
          group: apps
          jsonPointers:
            - /spec/template/spec/containers/0/securityContext/privileged
      Copy to Clipboard Toggle word wrap

      참고

      server.enabled: truedataStorage.enabled: false 설정에서는 임시 스토리지를 사용하여 HashiCorp Vault 서버 인스턴스를 배포합니다. 이 설정은 개발 또는 테스트 환경에 적합합니다. 프로덕션의 경우 PV(영구 볼륨)를 사용하여 dataStorage 를 활성화하거나 외부 Vault 클러스터를 사용하고 server.enabledfalse 로 설정할 수 있습니다. Vault 서버가 이미 배포된 경우 server.enabledfalse 로 설정할 수 있습니다.

  2. GitOps 리포지토리에서 vault-secret-provider-app.yaml 파일을 클러스터로 적용합니다.

    $ oc apply -f vault-secret-provider-app.yaml
    Copy to Clipboard Toggle word wrap

    Vault CSI 공급자를 배포한 후 vault-csi-provider DaemonSet이 실행되지 않을 수 있습니다. 이 문제는 OpenShift Container Platform이 기본적으로 권한 있는 컨테이너를 제한하기 때문에 발생합니다. 또한 Vault CSI 공급자 및 Secrets Store CSI 드라이버는 pod가 privileged로 실행되지 않는 한 hostPath 마운트에 액세스해야 합니다.

    1. OpenShift Container Platform의 권한 문제를 해결하려면 다음을 수행합니다.

      1. vault-csi-provider DaemonSet를 패치하여 컨테이너를 privileged로 실행합니다.

        $ oc patch daemonset vault-csi-provider -n vault-csi-provider --type=json --patch='[{"op":"add","path":"/spec/template/spec/containers/0/securityContext","value":{"privileged":true}}]
        Copy to Clipboard Toggle word wrap
      2. OpenShift Container Platform의 권한 있는 SCC(보안 컨텍스트 제약 조건)에 대한 Secrets Store CSI Driver 서비스 계정 액세스 권한을 부여합니다.

        $ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-cluster-csi-drivers:secrets-store-csi-driver-operator
        Copy to Clipboard Toggle word wrap
      3. OpenShift Container Platform의 권한 있는 SCC(보안 컨텍스트 제약 조건)에 대한 Vault CSI 공급자 서비스 계정 액세스 권한을 부여합니다.

        $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:vault-csi-provider:vault-csi-provider
        Copy to Clipboard Toggle word wrap
        참고

        Helm 차트에서 server.enabledtrue 로 설정된 경우 Vault 서버 Pod는 OpenShift Container Platform이 기본적으로 차단하는 특정 사용자 ID(UID) 또는 그룹 ID(GID)와 함께 실행됩니다.

      4. Vault 서버 서비스 계정에 필요한 SCC(보안 컨텍스트 제약 조건) 권한을 부여합니다.

        $ oc adm policy add-scc-to-user anyuid  system:serviceaccount:vault-csi-provider:vault
        Copy to Clipboard Toggle word wrap

2.4.2. 시크릿을 저장하도록 Vault 초기화 및 구성

Argo CD를 사용하여 Vault를 배포하고 필요한 SCC 권한 및 DaemonSet 패치를 적용한 후 Vault를 초기화하고 봉인하고 Kubernetes 인증을 구성하여 보안 보안 스토리지 및 액세스를 활성화합니다.

프로세스

  1. Vault Pod에 액세스합니다.

    1. Vault가 OpenShift Container Platform 클러스터 내에서 실행 중인 경우(예: vault-csi-provider 네임스페이스의 vault-0 Pod) 다음 명령을 실행하여 Pod 내의 Vault CLI에 액세스합니다.

      $ oc exec -it vault-0 -n vault-csi-provider -- /bin/sh
      Copy to Clipboard Toggle word wrap
  2. Vault를 초기화합니다.

    1. Vault 인스턴스가 아직 초기화되지 않은 경우 다음 명령을 실행합니다.

      $ vault operator init
      Copy to Clipboard Toggle word wrap

      결과적으로 다음 출력이 표시됩니다.

      5 Unseal Keys - required to unseal the Vault.
      Initial Root Token - required to log in and configure Vault.
      Copy to Clipboard Toggle word wrap
      중요

      이러한 인증 정보를 안전하게 저장합니다. 자격 증명 모음을 해제하려면 5개 키 중 3개 이상의 키가 필요합니다. 키가 손실되면 저장된 보안에 대한 액세스가 영구적으로 차단됩니다.

  3. Vault를 봉인하지 않습니다.

    1. Vault는 봉인된 상태에서 시작됩니다. 다음 명령을 실행하여 이전 단계에서 얻은 5개의 Unseal Keys 중 3개를 사용합니다.

      $ vault operator unseal <Unseal Key 1>
        vault operator unseal <Unseal Key 2>
        vault operator unseal <Unseal Key 3>
      Copy to Clipboard Toggle word wrap

      봉인을 해제하면 Vault가 활성화되고 사용할 준비가 됩니다.

  4. Vault에 로그인합니다.

    1. 루트 토큰을 사용하여 Vault에 로그인하려면 다음 명령을 실행합니다.

      $ vault login <Initial Root Token>
      Copy to Clipboard Toggle word wrap

      이를 통해 시크릿 엔진 및 인증 방법을 활성화하고 구성할 수 있는 관리자 액세스 권한이 제공됩니다.

  5. Vault에서 Kubernetes 인증을 활성화합니다.

    1. 다음 명령을 실행하여 Vault에서 Kubernetes 인증을 활성화합니다.

      $ vault auth enable kubernetes
      Copy to Clipboard Toggle word wrap

      이를 통해 Kubernetes 워크로드(예: pod)는 서비스 계정을 사용하여 Vault로 인증할 수 있습니다.

  6. Vault에서 Kubernetes 인증 방법을 구성합니다.

    1. Kubernetes API와 통신할 Vault를 구성하려면 다음 명령을 실행합니다.

      $ vault write auth/kubernetes/config \
      issuer="https://kubernetes.default.svc" \
      token_reviewer_jwt="$(cat/var/run/secrets/kubernetes.io/serviceaccount/token)" \
      kubernetes_host="https://${KUBERNETES_PORT_443_TCP_ADDR}:443" \
      kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      Copy to Clipboard Toggle word wrap

      결과적으로 다음 출력이 표시됩니다.

      Success! Data written to: auth/kubernetes/config
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      • <issuer >는 Kubernetes 토큰 발행자 URL의 이름입니다.
      • < token_reviewer_jwt >는 Vault에서 Kubernetes TokenReview API를 호출하고 서비스 계정 토큰을 확인하는 데 사용하는 JSON 웹 토큰(JWT)입니다.
      • <kubernetes_host >는 Vault에서 Kubernetes API 서버와 통신하는 데 사용하는 URL입니다.
      • <kubernetes_ca_cert >는 Vault에서 Kubernetes API 서버와의 보안 통신에 사용하는 CA 인증서입니다.

2.4.3. Vault에서 시크릿, 정책 및 역할 관리

Vault에서 시크릿을 생성하려면 Vault 정책을 정의하고 Kubernetes 워크로드가 시크릿을 안전하게 검색할 수 있는 Kubernetes 인증 역할을 구성합니다.

프로세스

  1. KV 시크릿 엔진 활성화

    1. KV(Key-Value) 버전 2 시크릿 엔진을 사용하여 버전 관리 지원과 함께 임의의 시크릿을 저장합니다. 다음 명령을 실행하여 경로 secret/에서 KV 시크릿 엔진을 활성화합니다.

      $ vault secrets enable -path=secret/ kv
      Copy to Clipboard Toggle word wrap
  2. Vault에 시크릿을 저장합니다.

    1. KV 버전 2 시크릿 엔진을 사용하여 시크릿을 저장합니다. 다음 명령을 실행하여 경로 secret/demo/config: 시크릿 데이터, 사용자 이름 및 암호를 저장합니다.

      $ vault kv put secret/demo/config username="demo-user" password="demo-pass"
      Copy to Clipboard Toggle word wrap
  3. Vault 정책을 생성합니다.

    1. 보안에 대한 읽기 액세스 권한을 부여하는 정책을 생성하려면 다음 명령을 실행합니다.

      $ vault policy write demo-app-policy -<<EOF
      path "secret/demo/config" {
        capabilities = ["read"]
      }
      EOF
      Copy to Clipboard Toggle word wrap

      demo-app-policysecret/demo/config 에서 보안에 대한 읽기 액세스 권한을 부여하며 나중에 Kubernetes 역할에 연결됩니다.

  4. Vault에서 Kubernetes 인증 역할을 생성합니다.

    1. Kubernetes 서비스 계정을 Vault 정책에 바인딩하는 역할을 생성하려면 다음 명령을 실행합니다.

      $ vault write auth/kubernetes/role/app \ bound_service_account_names=demo-app-sa \ bound_service_account_namespaces=demo-app \ policies=demo-app-policy \ ttl=24h
      Copy to Clipboard Toggle word wrap

      이를 통해 서비스 계정을 사용하는 모든 Pod에서 Vault에 인증하고 시크릿을 검색할 수 있습니다.

      다음과 같습니다.

      • <bound_service_account_names >는 Vault에서 신뢰하는 Kubernetes 서비스 계정의 이름입니다.
      • <bound_service_account_namespaces >는 서비스 계정이 있는 네임스페이스의 이름입니다.
      • <policies >는 연결된 Vault 정책의 이름입니다.
      • <TTL >은 토큰에 대해 발행된 Time-to-live 값입니다.

2.4.4. Vault로 마운트된 보안을 사용하도록 GitOps 관리 리소스 구성

Secrets Store CSI 드라이버 및 Vault 공급자를 사용하여 HashiCorp Vault의 시크릿을 GitOps 관리 Kubernetes 워크로드에 안전하게 삽입합니다. 보안은 Pod 파일 시스템에 파일로 마운트되므로 애플리케이션이 Kubernetes Secret 오브젝트에 저장하지 않고 데이터에 액세스할 수 있습니다.

프로세스

  1. SecretProviderClass 생성

    1. 애플리케이션의 매니페스트 디렉터리에 SecretProviderClass 리소스를 생성합니다(예: environments/dev/apps/demo-app/manifest/secretProviderClass.yaml ). 이 리소스는 Secrets Store CSI 드라이버가 Vault에서 시크릿을 검색하는 방법을 정의합니다.

      vault-secret-provider-app.yaml 파일 예

      apiVersion: secrets-store.csi.x-k8s.io/v1
        kind: SecretProviderClass
           metadata:
               name: demo-app-creds
               namespace: demo-app
       spec:
              provider: vault 
      1
      
              parameters:
                    vaultAddress: http://vault.vault-csi-provider:8200 # <name>.<namespace>:port 
      2
      
                    roleName: app 
      3
      
              objects: | 
      4
      
                 - objectName: "demoAppUsername"
                   secretPath: "secret/demo/config"
                   secretKey: "username"
                - objectName: "demoAppPassword"
                  secretPath: "secret/demo/config"
                   secretKey: "password"
      Copy to Clipboard Toggle word wrap

      1
      <provider: vault > - HashiCorp Vault의 이름을 지정합니다.
      2
      <vaultAddress > - Vault 서버의 네트워크 주소를 지정합니다. 클러스터 내 서비스 또는 외부 URL과 같은 Vault 설정에 따라 이를 조정합니다.
      3
      <roleName > - 애플리케이션 서비스 계정에서 사용하는 Vault Kubernetes 인증 역할을 지정합니다. 검색할 시크릿과 파일 이름에 매핑하는 방법을 정의하는 배열을 설명합니다.
      4
      <objects > - 검색할 시크릿과 파일 이름에 매핑하는 방법을 정의하는 배열을 지정합니다. KV v2의 secretPath 에는 /data/ 가 포함됩니다.
  2. ServiceAccount 와 같은 애플리케이션을 생성합니다.

    1. 애플리케이션 워크로드에 대한 Kubernetes ServiceAccount 를 생성합니다. ServiceAccount 이름은 Vault Kubernetes 인증 역할에 정의된 bound_service_account_names 값과 일치해야 합니다. GitOps 리포지토리에 매니페스트를 저장합니다(예: environments/dev/apps/demo-app/manifest/serviceAccount.yaml ).

      ServiceAccount.yaml 예제 파일

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: demo-app-sa
        namespace: demo-app
      Copy to Clipboard Toggle word wrap

  3. 애플리케이션 배포를 생성합니다.

    1. 지정된 ServiceAccount 를 사용하고 CSI 볼륨을 사용하여 시크릿을 마운트하도록 애플리케이션의 배포를 수정합니다. GitOps 리포지토리에 업데이트된 매니페스트를 저장합니다(예: environments/dev/apps/demo-app/manifest/deployment.yaml ).

      deployment.yaml 파일의 예

      apiVersion: apps/v1
      kind: Deployment
      metadata:
         name: app
         namespace: demo-app
         labels:
           app: demo
      spec:
         replicas: 1
         selector:
           matchLabels:
              app: demo
         template:
            metadata:
             labels:
               app: demo
         spec:
              serviceAccountName: demo-app-sa 
      1
      
              containers:
                 - name: app
                   image: nginxinc/nginx-unprivileged:latest
                   volumeMounts: 
      2
      
                   - name: vault-secrets
                     mountPath: /mnt/secrets-store
                     readOnly: true
         volumes: 
      3
      
              - name: vault-secrets
                csi:
                  driver: secrets-store.csi.k8s.io
                  readOnly: true
                  volumeAttributes:
                  secretProviderClass: demo-app-creds
      Copy to Clipboard Toggle word wrap

      1
      serviceAccountName - 애플리케이션 포드에서 사용하는 Kubernetes ServiceAccount 이름(예: demo-app-sa )을 할당합니다. 이 ServiceAccount 는 필요한 시크릿을 검색할 수 있는 권한을 부여하는 Vault 역할에 연결되어 있으므로 HashiCorp Vault를 사용한 인증의 기본 요소입니다.
      2
      volumeMounts - vault-secrets 볼륨을 /mnt/secrets-store 디렉터리의 컨테이너에 마운트합니다.
      3
      volumes - secrets-store.csi.k8s.io 드라이버를 사용하여 vault-secrets 볼륨을 정의하고 demo-app-creds SecretProviderClass 를 참조합니다.
  4. 워크로드에 대한 Argo CD 애플리케이션을 정의합니다.

    1. Argo CD 애플리케이션 리소스를 정의하여 GitOps 리포지토리에서 ServiceAccount,SecretProviderClassDeployment 와 같은 애플리케이션 구성 요소를 배포합니다. environments/dev/apps/demo-app/argocd/demo-app.yaml 과 같은 디렉터리 위치에 Argo CD 매니페스트를 저장합니다.

      demo-app.yaml 파일 예

      apiVersion: argoproj.io/v1alpha1
      kind: Application
      metadata:
        name: demo-app
        namespace: openshift-gitops
      spec:
        project: default
        source:
          repoURL: https://your-git-repo-url.git
          targetRevision: HEAD
          path: environments/dev/apps/demo-app/manifest
        destination:
          server: https://kubernetes.default.svc
          namespace: demo-app
        syncPolicy:
          automated:
            prune: true
            selfHeal: true
          syncOptions:
            - CreateNamespace=true
      Copy to Clipboard Toggle word wrap

2.4.5. 보안 삽입 확인

시크릿 삽입을 확인하여 Vault에 예상 값이 포함되어 있는지 확인합니다.

프로세스

  1. Pod 상태를 확인합니다.

    1. Argo CD 애플리케이션이 동기화되고 모든 리소스가 배포된 후 demo-app 네임스페이스에서 애플리케이션 포드가 성공적으로 실행되고 있는지 확인합니다. 다음 명령을 실행합니다.

      $ oc get pods -n demo-app
      Copy to Clipboard Toggle word wrap
  2. 쉘 세션을 엽니다.

    1. 애플리케이션 포드 이름을 사용하여 쉘 세션을 엽니다. & lt;your-app-pod-name&gt;을 실제 Pod 이름으로 바꿉니다.

      $ oc exec -it <your-app-pod-name> -n demo-app -- sh
      Copy to Clipboard Toggle word wrap
  3. 마운트된 보안을 확인합니다.

    1. 보안이 예상 경로에 마운트되었는지 확인하려면 다음 명령을 실행합니다.

      $ ls -l /mnt/secrets-store
        cat /mnt/secrets-store/demoAppUsername
        cat /mnt/secrets-store/demoAppPassword
      Copy to Clipboard Toggle word wrap

      마운트된 시크릿 파일 demoAppUsernamedemoAppPassword 에 Vault의 예상 값이 포함되어 있는지 확인합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat