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 에 내장된 방식을 제공하며, 정적 시크릿과 동적 시크릿을 모두 지원합니다. 예를 들어, 다음 시나리오를 고려하십시오.
- 개발자는 Vault Dedicated를 사용하여 Kubernetes 클러스터에 배포하려는 애플리케이션의 시크릿을 저장합니다.
- Vault Dedicated 인스턴스에 연결하려면 VaultConnection 및 VaultAuth 리소스를 사용하여 Vault Secrets Operator를 구성합니다.
- VaultStaticSecret 또는 VaultDynamicSecret 리소스를 생성하여 동기화할 시크릿을 정의합니다.
- 애플리케이션 실행 시, VSO는 Vault Dedicated에서 시크릿 데이터를 가져와 클러스터용 ‘ Kubernetes ’ 시크릿을 생성합니다.
- VSO는 시크릿을 지속적으로 모니터링하고 동기화하며, 시크릿의 교체 및 업데이트를 자동으로 처리합니다.
Vault Secrets Operator는 HashiCorp 의 공식 도구입니다. 지원 및 문제 해결에 대해서는 공식 문서를 참조하십시오.
시작하기 전에
시작하기 전에 계정 신임 정보 및 프로비저닝 자원을 작성할 수 있도록 관리자 플랫폼 액세스 권한이 있는지 확인하십시오. 또한 다음 전제 조건이 필요합니다.
-
jq을(를) 사용하여 JSON 데이터를 분할하고 필터링할 수 있습니다. 이 학습서에서는jq을(를)사용하여 저장된 환경 변수를 가져오고 사용합니다.
-
IBM Cloud 계정에서 프로비저닝된 Vault Dedicated 인스턴스. 자세한 내용은 ‘Vault Dedicated 인스턴스 설정’을 참조하십시오.
환경 설정
Vault Dedicated 및 Kubernetes Service 을 사용하려면 클러스터를 생성하고, Vault Dedicated 인스턴스를 AppRole 인증 방식으로 구성해야 합니다.
Kubernetes 클러스터 작성
IBM Cloud 계정에서 ‘ Kubernetes ’ 클러스터를 생성하세요.
-
명령행에서 IBM Cloud CLI를 통해 IBM Cloud에 로그인하십시오.
ibmcloud login로그인에 실패하면
ibmcloud login --sso명령을 실행하여 다시 시도하십시오.--sso매개변수는 연합 ID로 로그인할 때 필요합니다. 이 옵션이 사용되면 CLI 출력에 나열되는 링크로 이동하여 일회성 패스코드를 생성하십시오. -
클러스터를 생성할 계정, 지역 및 리소스 그룹을 선택하십시오.
ibmcloud target -r REGION -g RESOURCE_GROUP -
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분이 소요됩니다.
-
클러스터가 성공적으로 프로비저닝되었는지 확인하십시오.
ibmcloud ks worker ls --cluster vso-test-cluster상태가 ‘준비됨 ’으로 변경될 때까지 기다리세요.
-
Kubernetes 클러스터의 컨텍스트를 설정하십시오.
ibmcloud ks cluster config --cluster vso-test-cluster kubectl config current-context
Vault 전용 인스턴스를 준비하세요
VSO용 시크릿 및 AppRole 인증을 사용하여 Vault Dedicated 인스턴스를 구성하십시오.
-
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 토큰으로 대체하십시오. -
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_passwordVault Dedicated는 KV 시크릿 엔진의 마운트 경로로
kv/을 사용한다는 점에 유의하십시오. -
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/approleVSO는 AppRole, Kubernetes, JWT, AWS 또는 GCP 인증을 요구합니다. 직접 토큰 인증을 지원하지 않습니다.
-
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 -
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 -
역할 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를 설치하십시오.
-
HashiCorp Helm 저장소를 추가하세요.
helm repo add hashicorp https://helm.releases.hashicorp.com helm repo update -
Vault Secrets Operator를 설치합니다.
helm install vault-secrets-operator \ hashicorp/vault-secrets-operator \ --namespace vault-secrets-operator-system \ --create-namespace \ --version 0.9.0 -
설치를 확인하십시오.
kubectl get pods -n vault-secrets-operator-system모든 포드가 '실행 중 ' 상태가 될 때까지 기다리십시오.
-
사용자 정의 리소스 정의(CRD)가 설치되었는지 확인하십시오.
kubectl get crd | grep vaultvaultauths,vaultconnections,vaultdynamicsecrets,vaultstaticsecrets와 같은 CRD를 확인할 수 있을 것입니다.
VaultConnection 를 구성하고 VaultAuth
VaultConnection 및 VaultAuth 리소스를 사용하여 VSO가 Vault Dedicated 인스턴스에 연결되도록 구성하십시오.
만들기 VaultConnection
-
AppRole ( SecretID )를 사용하여 ‘ Kubernetes ’ 시크릿을 생성합니다.
kubectl create secret generic approle-secret \ --namespace default \ --from-literal=id="$SECRET_ID"VSO가 이 키를 인식하려면 키 이름을 ‘
id’로 지정해야 합니다. -
vaultconnection.yaml파일을 작성하십시오.touch vaultconnection.yaml -
다음 구성을 추가하십시오.
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 를 구성하십시오. -
VaultConnection 를 적용하세요.
kubectl apply -f vaultconnection.yaml
만들기 VaultAuth
-
vaultauth.yaml파일을 작성하십시오.touch vaultauth.yaml -
다음 구성을 추가하십시오.
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 -
VaultAuth 를 적용하세요.
kubectl apply -f vaultauth.yaml -
VaultAuth 의 상태를 확인하십시오.
kubectl get vaultauth vault-dedicated-auth -n default kubectl describe vaultauth vault-dedicated-auth -n default
만들기 VaultStaticSecret
Vault Dedicated의 시크릿을 Kubernetes 로 동기화하기 위해 VaultStaticSecret 리소스를 생성합니다.
-
vaultstaticsecret.yaml파일을 작성하십시오.touch vaultstaticsecret.yaml -
다음 구성을 추가하십시오.
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 시크릿을 생성합니다. 비밀은 매시간 새로 고쳐집니다. -
VaultStaticSecret 을 바르세요.
kubectl apply -f vaultstaticsecret.yaml -
시크릿이 동기화되었는지 확인하세요.
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에서 동기화된 시크릿을 사용하는 애플리케이션을 배포합니다.
-
테스트 배포를 생성합니다.
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 -
포드 로그를 확인해 보세요.
kubectl logs test-app-vso -n default예상 출력:
Username: vso-user Password: vso-secure-pass-123
(선택사항) 리소스 정리
더 이상 해당 리소스가 필요하지 않다면, 계정에서 삭제하십시오.
-
테스트 네임스페이스와 리소스를 삭제하십시오.
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 -
Vault Secrets Operator를 제거합니다.
helm uninstall vault-secrets-operator -n vault-secrets-operator-system kubectl delete namespace vault-secrets-operator-system -
테스트 클러스터를 삭제하세요.
ibmcloud ks cluster rm --cluster vso-test-cluster -
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를 사용할 때 고려해야 할 주요 사항:
-
인증 방법: VSO는 직접 토큰 인증을 지원하지 않습니다. AppRole, Kubernetes, JWT AWS 또는 GCP 인증 방법 중 하나를 사용해야 합니다.
-
SecretID 키 이름: AppRole 인증을 위한 Kubernetes 시크릿을 생성할 때, 키 이름은
id이어야 하며,secret-id이나secretId이어서는 안 됩니다. -
갱신 간격: ‘
refreshAfter’ 필드는 VSO가 비밀 정보 업데이트를 확인하는 빈도를 결정합니다. 신선함과 API 부하 간의 균형. -
자동 배포 : VaultStaticSecret 에서
rolloutRestartTargets을 사용하여 시크릿이 변경될 때 배포가 자동으로 다시 시작되도록 설정하세요. -
Vault Dedicated 마운트 경로: Vault Dedicated는 KV 시크릿 엔진의 기본 마운트 경로로
secret/이 아닌kv/을 사용합니다. -
Vault Dedicated 네임스페이스: Vault Dedicated는 Vault Enterprise 네임스페이스를 사용합니다. 기본 네임스페이스는
admin입니다. VaultAuth 구성에서 항상 올바른 네임스페이스를 지정하십시오. -
TLS 구성: 프로덕션 환경에서는
skipTLSVerify를 사용하는 대신, 적절한 TLS 인증서 유효성 검사를 구성하십시오.
다음 단계
수고하셨습니다! 이 튜토리얼에서는 Vault Secrets Operator를 사용하여 Vault Dedicated를 Kubernetes 클러스터와 연동하는 방법을 배웠습니다. VSO의 다양한 기능을 살펴보세요:
- 다음에 대해 알아보세요 VaultDynamicSecret 동적 데이터베이스 자격 증명에 대해 알아보세요.
- 대안적인 다중 공급자 솔루션으로서 ‘External Secrets Operator’를 살펴보세요.
- Vault Secrets Operator 문서를 검토하십시오.
- Vault의 기능 및 구성에 대해 자세히 알아보세요.