Vault Dedicated 및 Vault Secrets Operator를 사용하여 앱의 비밀 정보를 안전하게 보호하세요

이 튜토리얼에서는 Vault Secrets Operator ( HashiCorp's 의 공식 Kubernetes 오퍼레이터)를 사용하여 IBM Cloud Vault Enterprise를 통해 IBM Cloud Kubernetes Service 클러스터에서 실행되는 애플리케이션의 시크릿을 관리하는 방법을 배웁니다.

귀하는 Kubernetes Service 를 사용하여 IBM Cloud 에 컨테이너화된 애플리케이션을 배포하는 조직의 개발자입니다. 귀사의 팀은 시크릿 관리를 위해 HashiCorp Vault 을 사용하고 있으며, Kubernetes 워크로드에 대한 네이티브 Vault 통합 기능을 원하고 있습니다. Vault Secrets Operator(VSO)는 Vault와 긴밀하게 연동되어 동적 시크릿, 시크릿 순환, Vault 고유의 인증 방식과 같은 고급 기능을 지원합니다.

Vault Dedicated 및 Vault Secrets Operator를 사용하면 Kubernetes 환경에서 HashiCorp Vault 의 모든 기능을 최대한 활용할 수 있습니다. Vault Secrets Operator는 Vault 시크릿을 처리하기 위한 Kubernetes 에 내장된 방식을 제공하며, 정적 시크릿과 동적 시크릿을 모두 지원합니다. 예를 들어, 다음 시나리오를 고려하십시오.

이 다이어그램은 Secrets Manager 과 사용자의 Kubernetes 클러스터 간의 기본 흐름 과정을 보여줍니다.
외부 시크릿 흐름

  1. 개발자는 Vault Dedicated를 사용하여 Kubernetes 클러스터에 배포하려는 애플리케이션의 시크릿을 저장합니다.
  2. Vault Dedicated 인스턴스에 연결하려면 VaultConnection 및 VaultAuth 리소스를 사용하여 Vault Secrets Operator를 구성합니다.
  3. VaultStaticSecret 또는 VaultDynamicSecret 리소스를 생성하여 동기화할 시크릿을 정의합니다.
  4. 애플리케이션 실행 시, VSO는 Vault Dedicated에서 시크릿 데이터를 가져와 클러스터용 ‘ Kubernetes ’ 시크릿을 생성합니다.
  5. VSO는 시크릿을 지속적으로 모니터링하고 동기화하며, 시크릿의 교체 및 업데이트를 자동으로 처리합니다.

Vault Secrets Operator는 HashiCorp 의 공식 도구입니다. 지원 및 문제 해결에 대해서는 공식 문서를 참조하십시오.

시작하기 전에

시작하기 전에 계정 신임 정보 및 프로비저닝 자원을 작성할 수 있도록 관리자 플랫폼 액세스 권한이 있는지 확인하십시오. 또한 다음 전제 조건이 필요합니다.

환경 설정

Vault Dedicated 및 Kubernetes Service 을 사용하려면 클러스터를 생성하고, Vault Dedicated 인스턴스를 AppRole 인증 방식으로 구성해야 합니다.

Kubernetes 클러스터 작성

IBM Cloud 계정에서 ‘ Kubernetes ’ 클러스터를 생성하세요.

  1. 명령행에서 IBM Cloud CLI를 통해 IBM Cloud에 로그인하십시오.

    ibmcloud login
    

    로그인에 실패하면 ibmcloud login --sso 명령을 실행하여 다시 시도하십시오. --sso 매개변수는 연합 ID로 로그인할 때 필요합니다. 이 옵션이 사용되면 CLI 출력에 나열되는 링크로 이동하여 일회성 패스코드를 생성하십시오.

  2. 클러스터를 생성할 계정, 지역 및 리소스 그룹을 선택하십시오.

    ibmcloud target -r REGION -g RESOURCE_GROUP
    
  3. Kubernetes 클러스터를 작성합니다.

    ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name vso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_ID
    

    프로비저닝에는 5~15분이 소요됩니다.

  4. 클러스터가 성공적으로 프로비저닝되었는지 확인하십시오.

    ibmcloud ks worker ls --cluster vso-test-cluster
    

    상태가 ‘준비됨 ’으로 변경될 때까지 기다리세요.

  5. Kubernetes 클러스터의 컨텍스트를 설정하십시오.

    ibmcloud ks cluster config --cluster vso-test-cluster
    kubectl config current-context
    

Vault 전용 인스턴스를 준비하세요

VSO용 시크릿 및 AppRole 인증을 사용하여 Vault Dedicated 인스턴스를 구성하십시오.

  1. Vault Dedicated 인스턴스 정보와 함께 환경 변수를 내보내세요.

    export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud"
    export VAULT_DEDICATED_NAMESPACE="admin"
    export VAULT_TOKEN="<your-vault-token>"
    

    <your-vault_dedicated-instance-id> 을 귀하의 Vault Dedicated 인스턴스 ID로, <region> 을 귀하의 Vault Dedicated 리전으로, <your-vault-token> 을 귀하의 Vault 토큰으로 대체하십시오.

  2. Vault Dedicated에서 테스트용 시크릿을 생성합니다.

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"data":{"username":"vso-user","password":"vso-secure-pass-123"}}' \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password
    

    Vault Dedicated는 KV 시크릿 엔진의 마운트 경로로 kv/ 을 사용한다는 점에 유의하십시오.

  3. VSO에 대해 ‘ AppRole ’ 인증을 활성화하십시오.

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"type":"approle"}' \
      $VAULT_DEDICATED_ADDR/v1/sys/auth/approle
    

    VSO는 AppRole, Kubernetes, JWT, AWS 또는 GCP 인증을 요구합니다. 직접 토큰 인증을 지원하지 않습니다.

  4. VSO에 대한 정책을 수립하십시오.

    curl -k -X PUT \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"policy":"path \"kv/data/*\" { capabilities = [\"read\", \"list\"] }\npath \"kv/metadata/*\" { capabilities = [\"read\", \"list\"] }"}' \
      $VAULT_DEDICATED_ADDR/v1/sys/policies/acl/kv-read
    
  5. VSO용 AppRole 를 생성합니다.

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"policies":["kv-read"],"token_ttl":"1h","token_max_ttl":"4h"}' \
      $VAULT_DEDICATED_ADDR/v1/auth/approle/role/vso-role
    
  6. 역할 ID와 비밀 ID를 확인하세요.

    export ROLE_ID=$(curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/auth/approle/role/vso-role/role-id | jq -r '.data.role_id')
    export SECRET_ID=$(curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/auth/approle/role/vso-role/secret-id | jq -r '.data.secret_id')
    echo "Role ID: $ROLE_ID"
    echo "Secret ID: $SECRET_ID"
    

Vault Secrets Operator 설치

Helm 를 사용하여 Vault Secrets Operator를 설치하십시오.

  1. HashiCorp Helm 저장소를 추가하세요.

    helm repo add hashicorp https://helm.releases.hashicorp.com
    helm repo update
    
  2. Vault Secrets Operator를 설치합니다.

    helm install vault-secrets-operator \
      hashicorp/vault-secrets-operator \
      --namespace vault-secrets-operator-system \
      --create-namespace \
      --version 0.9.0
    
  3. 설치를 확인하십시오.

    kubectl get pods -n vault-secrets-operator-system
    

    모든 포드가 '실행 중 ' 상태가 될 때까지 기다리십시오.

  4. 사용자 정의 리소스 정의(CRD)가 설치되었는지 확인하십시오.

    kubectl get crd | grep vault
    

    vaultauths, vaultconnections, vaultdynamicsecrets, vaultstaticsecrets 와 같은 CRD를 확인할 수 있을 것입니다.

VaultConnection 를 구성하고 VaultAuth

VaultConnection 및 VaultAuth 리소스를 사용하여 VSO가 Vault Dedicated 인스턴스에 연결되도록 구성하십시오.

만들기 VaultConnection

  1. AppRole ( SecretID )를 사용하여 ‘ Kubernetes ’ 시크릿을 생성합니다.

    kubectl create secret generic approle-secret \
      --namespace default \
      --from-literal=id="$SECRET_ID"
    

    VSO가 이 키를 인식하려면 키 이름을 ‘ id ’로 지정해야 합니다.

  2. vaultconnection.yaml 파일을 작성하십시오.

    touch vaultconnection.yaml
    
  3. 다음 구성을 추가하십시오.

    apiVersion: secrets.hashicorp.com/v1beta1
    kind: VaultConnection
    metadata:
      name: vault-connection
      namespace: default
    spec:
      address: "<VAULT_DEDICATED_ADDR>"
      skipTLSVerify: true
    

    <VAULT_DEDICATED_ADDR> 을 귀하의 Vault Dedicated 인스턴스 주소로 바꾸십시오. 프로덕션 환경에서는 skipTLSVerify 를 사용하는 대신 적절한 TLS 를 구성하십시오.

  4. VaultConnection 를 적용하세요.

    kubectl apply -f vaultconnection.yaml
    

만들기 VaultAuth

  1. vaultauth.yaml 파일을 작성하십시오.

    touch vaultauth.yaml
    
  2. 다음 구성을 추가하십시오.

    apiVersion: secrets.hashicorp.com/v1beta1
    kind: VaultAuth
    metadata:
      name: vault-dedicates-auth
      namespace: default
    spec:
      vaultConnectionRef: vault-dedicated-connection
      method: appRole
      mount: approle
      namespace: admin
      appRole:
        roleId: vso-role
        secretRef: approle-secret
    
  3. VaultAuth 를 적용하세요.

    kubectl apply -f vaultauth.yaml
    
  4. VaultAuth 의 상태를 확인하십시오.

    kubectl get vaultauth vault-dedicated-auth -n default
    kubectl describe vaultauth vault-dedicated-auth -n default
    

만들기 VaultStaticSecret

Vault Dedicated의 시크릿을 Kubernetes 로 동기화하기 위해 VaultStaticSecret 리소스를 생성합니다.

  1. vaultstaticsecret.yaml 파일을 작성하십시오.

    touch vaultstaticsecret.yaml
    
  2. 다음 구성을 추가하십시오.

    apiVersion: secrets.hashicorp.com/v1beta1
    kind: VaultStaticSecret
    metadata:
      name: vault-dedicated-app-secret
      namespace: default
    spec:
      vaultAuthRef: vault-dedicated-auth
      mount: kv
      type: kv-v2
      path: example_username_password
      refreshAfter: 1h
      destination:
        name: my-k8s-secret-vso
        create: true
    

    이 구성은 Vault Dedicated의 kv/data/example_username_password 에서 시크릿을 가져와 my-k8s-secret-vso 라는 이름의 Kubernetes 시크릿을 생성합니다. 비밀은 매시간 새로 고쳐집니다.

  3. VaultStaticSecret 을 바르세요.

    kubectl apply -f vaultstaticsecret.yaml
    
  4. 시크릿이 동기화되었는지 확인하세요.

    kubectl get vaultstaticsecret vault-dedicated-app-secret -n default
    kubectl get secret my-k8s-secret-vso -n default -o json | jq '.data | map_values(@base64d)'
    

    출력 예:

    {
        "password": "vso-secure-pass-123",
        "username": "vso-user"
    }
    

클러스터에 앱 배치

Vault Dedicated에서 동기화된 시크릿을 사용하는 애플리케이션을 배포합니다.

  1. 테스트 배포를 생성합니다.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-app-vso
      namespace: default
    spec:
      containers:
      - name: app
        image: busybox
        command: ['sh', '-c', 'echo "Username: \$USERNAME"; echo "Password: \$PASSWORD"; sleep 3600']
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret-vso
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret-vso
              key: password
    EOF
    
  2. 포드 로그를 확인해 보세요.

    kubectl logs test-app-vso -n default
    

    예상 출력:

    Username: vso-user
    Password: vso-secure-pass-123
    

(선택사항) 리소스 정리

더 이상 해당 리소스가 필요하지 않다면, 계정에서 삭제하십시오.

  1. 테스트 네임스페이스와 리소스를 삭제하십시오.

    kubectl delete pod test-app-vso -n default
    kubectl delete vaultstaticsecret vault-dedicated-app-secret -n default
    kubectl delete vaultauth vault-dedicated-auth -n default
    kubectl delete vaultconnection vault-dedicated-connection -n default
    kubectl delete secret approle-secret -n default
    
  2. Vault Secrets Operator를 제거합니다.

    helm uninstall vault-secrets-operator -n vault-secrets-operator-system
    kubectl delete namespace vault-secrets-operator-system
    
  3. 테스트 클러스터를 삭제하세요.

    ibmcloud ks cluster rm --cluster vso-test-cluster
    
  4. Vault 전용 테스트 데이터를 정리합니다.

    curl -k -X DELETE \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/metadata/example_username_password
    

참고 사항

Vault Secrets Operator를 사용할 때 고려해야 할 주요 사항:

  1. 인증 방법: VSO는 직접 토큰 인증을 지원하지 않습니다. AppRole, Kubernetes, JWT AWS 또는 GCP 인증 방법 중 하나를 사용해야 합니다.

  2. SecretID 키 이름: AppRole 인증을 위한 Kubernetes 시크릿을 생성할 때, 키 이름은 id 이어야 하며, secret-id 이나 secretId 이어서는 안 됩니다.

  3. 갱신 간격: ‘ refreshAfter ’ 필드는 VSO가 비밀 정보 업데이트를 확인하는 빈도를 결정합니다. 신선함과 API 부하 간의 균형.

  4. 자동 배포 : VaultStaticSecret 에서 rolloutRestartTargets 을 사용하여 시크릿이 변경될 때 배포가 자동으로 다시 시작되도록 설정하세요.

  5. Vault Dedicated 마운트 경로: Vault Dedicated는 KV 시크릿 엔진의 기본 마운트 경로로 secret/ 이 아닌 kv/ 을 사용합니다.

  6. Vault Dedicated 네임스페이스: Vault Dedicated는 Vault Enterprise 네임스페이스를 사용합니다. 기본 네임스페이스는 admin 입니다. VaultAuth 구성에서 항상 올바른 네임스페이스를 지정하십시오.

  7. TLS 구성: 프로덕션 환경에서는 skipTLSVerify 를 사용하는 대신, 적절한 TLS 인증서 유효성 검사를 구성하십시오.

다음 단계

수고하셨습니다! 이 튜토리얼에서는 Vault Secrets Operator를 사용하여 Vault Dedicated를 Kubernetes 클러스터와 연동하는 방법을 배웠습니다. VSO의 다양한 기능을 살펴보세요: