Vault Dedicated 및 External Secrets Operator를 사용하여 앱의 비밀 정보를 안전하게 보호하세요
이 튜토리얼에서는 오픈소스 도구인 External Secrets Operator를 사용하여 IBM Cloud Kubernetes Service 클러스터에서 실행되는 애플리케이션의 시크릿을 IBM Cloud Vault Enterprise로 관리하는 방법을 알아봅니다.
귀하는 어떤 조직의 개발자이며, 귀하의 팀은 Kubernetes Service 를 사용하여 IBM Cloud 에 컨테이너화된 애플리케이션과 서비스를 배포하고 있습니다. 애플리케이션 비밀 정보를 Vault Dedicated( IBM Cloud 의 관리형 HashiCorp Vault 서비스)에 저장하고자 합니다. 이곳에서는 저장된 비밀 정보를 암호화하고, 수명 주기를 관리하며, 손쉽게 갱신할 수 있습니다.
Vault Dedicated 및 External Secrets Operator를 사용하면, Kubernetes 클러스터에서 실행되는 앱에서 사용하는 시크릿을 중앙 집중화하고 안전하게 관리할 수 있습니다. 배포 시점에 시크릿을 직접 주입하는 대신, 런타임에 Vault Dedicated에서 시크릿을 안전하게 가져오도록 앱을 구성할 수 있습니다. 예를 들어, 다음 시나리오를 고려하십시오.
- 개발자는 Vault Dedicated를 사용하여 Kubernetes 클러스터에 배포하려는 애플리케이션의 시크릿을 저장합니다.
- HashiCorp Vault 제공자를 사용하여 Vault Dedicated 인스턴스에 연결하도록 External Secrets Operator를 구성합니다.
- 외부 시크릿 컨트롤러는 Kubernetes API를 사용하여 정의한 구성 파일에서
ExternalSecrets오브젝트를 페치합니다. - 애플리케이션 실행 시, 컨트롤러는 Vault Dedicated에서 비밀 데이터를 가져와
ExternalSecrets객체를 클러스터용Kubernetes비밀로 변환합니다.
이 시나리오는 Kubernetes 클러스터에서 실행되는 워크로드의 규제 준수 준비 상태에 영향을 줄 수 있는 써드파티 도구를 제공합니다. 커뮤니티 또는 타사 도구를 추가하는 경우, 앱의 규정 준수 상태를 유지하는 것은 사용자의 책임이며, 문제가 발생할 경우 해당 제공업체와 협력하여 해결해야 한다는 점을 유의하시기 바랍니다. 자세한 정보는 IBM Cloud Kubernetes Service 사용에 대한 책임을 참조하십시오.
시작하기 전에
시작하기 전에 계정 신임 정보 및 프로비저닝 자원을 작성할 수 있도록 관리자 플랫폼 액세스 권한이 있는지 확인하십시오. 또한 다음 전제 조건이 필요합니다.
jq을(를) 사용하여 JSON 데이터를 분할하고 필터링할 수 있습니다. 이 학습서에서는 jq을(를)사용하여 저장된 환경 변수를 가져오고 사용합니다.
- IBM Cloud 계정에서 프로비저닝된 Vault 전용 인스턴스. 자세한 내용은 ‘Vault Dedicated 인스턴스 설정’을 참조하세요.
환경 설정
Vault Dedicated 및 Kubernetes Service 을 사용하려면, IBM Cloud 계정에서 클러스터를 생성하고 Vault Dedicated 인스턴스에 대한 액세스 권한을 구성해야 합니다.
Kubernetes 클러스터 작성
IBM Cloud 계정에서 ‘ Kubernetes ’ 클러스터를 생성하세요.
-
명령행에서 IBM Cloud CLI를 통해 IBM Cloud에 로그인하십시오.
ibmcloud login로그인에 실패하면
ibmcloud login --sso명령을 실행하여 다시 시도하십시오.--sso매개변수는 연합 ID로 로그인할 때 필요합니다. 이 옵션이 사용되면 CLI 출력에 나열되는 링크로 이동하여 일회성 패스코드를 생성하십시오. -
클러스터를 생성할 계정, 지역 및 리소스 그룹을 선택하십시오.
ibmcloud target -r REGION -g RESOURCE_GROUPREGION을 대상 리전(예:au-syd)으로,RESOURCE_GROUP을 리소스 그룹 이름으로 대체하십시오. -
Kubernetes 클러스터를 작성합니다.
ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name eso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_IDZONE,FLAVOR,VPC_ID,SUBNET_ID을(를) 각자의 값으로 대체하십시오. Kubernetes 클러스터 프로비저닝에는 5~15분이 소요됩니다. -
다음 단계로 진행하기 전에 클러스터가 성공적으로 프로비저닝되었는지 확인하십시오.
ibmcloud ks worker ls --cluster eso-test-cluster작업자 노드의 프로비저닝을 완료하면 상태가 준비됨으로 변경됩니다.
-
CLI에서 Kubernetes 클러스터에 대한 컨텍스트를 설정합니다.
ibmcloud ks cluster config --cluster eso-test-cluster -
kubectl명령이 올바르게 실행되고 Kubernetes 컨텍스트가 클러스터로 설정되었는지 확인하십시오.kubectl config current-context
Vault 전용 인스턴스를 준비하세요
Vault Dedicated 인스턴스를 구성하여 시크릿을 사용할 수 있도록 하고, External Secrets Operator에 대한 인증을 설정하십시오.
-
Vault Dedicated 인스턴스 세부 정보와 함께 환경 변수를 내보내세요.
export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud" export VAULT_DEDICATED_NAMESPACE="admin"<your-vault_dedicated-instance-id>을 귀하의 Vault Dedicated 인스턴스 ID로,<region>을 귀하의 Vault Dedicated 리전으로 대체하십시오(예:au-syd). -
Vault Dedicated 인스턴스에서 Vault 토큰을 가져옵니다.
Vault Dedicated UI에서 또는 Vault CLI를 사용하여 토큰을 생성할 수 있습니다. 개발 및 테스트를 위해 루트 토큰을 사용할 수 있습니다. 실제 운영 환경에서는 적절한 정책이 적용된 토큰을 생성하십시오.
export VAULT_TOKEN="<your-vault-token>" -
Vault Dedicated에서 KV 시크릿 엔진의 마운트 지점을 확인하십시오.
Vault 전용 인스턴스에는 기본적으로 KV v2 시크릿 엔진이
kv/에 마운트되어 있습니다. Vault Dedicated UI에서 확인하거나 마운트 목록을 열람하여 이를 확인할 수 있습니다.curl -k -X GET \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ $VAULT_DEDICATED_ADDR/v1/sys/mounts | jq -
Vault Dedicated에서 테스트용 시크릿을 생성합니다.
curl -k -X POST \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ -d '{"data":{"username":"user123","password":"cloudy-rainy-coffee-book"}}' \ $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_passwordVault Dedicated는 KV 시크릿 엔진의 마운트 경로로
kv/을 사용한다는 점에 유의하십시오. -
비밀 키가 생성되었는지 확인하십시오.
curl -k -X GET \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password | jq
외부 시크릿 오퍼레이터 설치
Helm 를 사용하여 External Secrets Operator를 설치합니다.
-
Helm 저장소를 외부 시크릿으로 추가하세요.
helm repo add external-secrets https://charts.external-secrets.io helm repo update -
External Secrets Operator를 설치합니다.
helm install external-secrets \ external-secrets/external-secrets \ --namespace external-secrets \ --create-namespace \ --set installCRDs=true -
설치를 확인하십시오.
kubectl get pods -n external-secrets모든 포드가 ‘실행 중( Running )’ 상태가 될 때까지 기다리십시오.
-
사용자 정의 리소스 정의(CRD)가 설치되었는지 확인하십시오.
kubectl get crd | grep external-secretssecretstores,clustersecretstores,externalsecrets와 같은 CRD를 확인해 보시기 바랍니다.
Vault Dedicated용 SecretStore 구성
External Secrets Operator가 Vault Dedicated 인스턴스에 연결하는 방식을 정의하는 SecretStore 리소스를 생성합니다.
-
Vault 토큰을 사용하여 ‘ Kubernetes ’ 시크릿을 생성하세요.
kubectl create secret generic vault-token \ --namespace external-secrets \ --from-literal=token="$VAULT_TOKEN" -
secretstore.yaml파일을 작성하십시오.touch secretstore.yaml -
파일에 다음 구성을 추가하십시오.
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-dedicated-secretstore namespace: default spec: provider: vault: server: "<VAULT_DEDICATED_ADDR>" path: "kv" version: "v2" namespace: "admin" auth: tokenSecretRef: name: "vault-token" key: "token" namespace: "external-secrets"<VAULT_DEDICATED_ADDR>을 귀하의 Vault Dedicated 인스턴스 주소로 대체하십시오.path가kv로 설정되어 있다는 점에 유의하십시오. 이는 Vault Dedicated에서 KV 시크릿 엔진의 기본 마운트 지점입니다. -
SecretStore 구성을 적용합니다.
kubectl apply -f secretstore.yaml -
SecretStore 가 유효한지 확인하십시오.
kubectl get secretstore vault-dedicated-secretstore -n default kubectl describe secretstore vault-dedicated-secretstore -n defaultVault Dedicated에 성공적으로 연결되면 상태가 ‘유효(Valid)’로 표시되어야 합니다.
만들기 ExternalSecret
Vault Dedicated에서 어떤 시크릿을 가져올지 정의하는 ExternalSecret 리소스를 생성합니다.
-
externalsecret.yaml파일을 생성합니다.touch externalsecret.yaml -
다음 구성을 추가하십시오.
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: vault-dedicated-app-secret namespace: default spec: refreshInterval: 1h secretStoreRef: name: vault-dedicated-secretstore kind: SecretStore target: name: my-k8s-secret creationPolicy: Owner data: - secretKey: username remoteRef: key: example_username_password property: username - secretKey: password remoteRef: key: example_username_password property: passwordrefreshInterval는 External Secrets Operator가 Vault Dedicated에서 업데이트를 확인하는 빈도를 결정합니다. 기본값이자 권장값은 1시간입니다. -
ExternalSecret 구성을 적용합니다.
kubectl apply -f externalsecret.yaml -
External Secrets Operator가 Vault Dedicated에서 시크릿을 가져왔는지 확인하십시오.
kubectl get secret my-k8s-secret -o json | jq '.data | map_values(@base64d)'출력 예:
{ "password": "cloudy-rainy-coffee-book", "username": "user123" }성공! 이제 Vault Dedicated 인스턴스에서 비밀 데이터를 가져와 Kubernetes 클러스터에서 사용할 수 있습니다.
클러스터에 앱 배치
마지막으로, Vault Dedicated 시크릿을 사용하는 애플리케이션을 클러스터에 배포할 수 있습니다. 애플리케이션 실행 시, Vault Dedicated에서 가져온 비밀 데이터는 클러스터에서 사용할 수 있는 ‘ Kubernetes ’ 비밀로 변환됩니다.
-
시크릿을 사용하는 간단한 테스트 배포를 생성합니다.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: test-app 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 key: username - name: PASSWORD valueFrom: secretKeyRef: name: my-k8s-secret key: password EOF -
포드 로그를 확인하여 시크릿이 정상적으로 주입되었는지 확인하십시오.
kubectl logs test-app -n default예상 출력:
Username: user123 Password: cloudy-rainy-coffee-book
앱 배포 방법에 대한 더 많은 예시를 찾고 계신가요? 애플리케이션 배포에 대한 자세한 내용은 “클러스터에서 Kubernetes 네이티브 앱 배포” 문서를 참조하세요.
(선택사항) 리소스 정리
이 튜토리얼에서 만든 리소스가 더 이상 필요하지 않은 경우 다음 단계를 완료하여 제거할 수 있습니다.
-
테스트 Kubernetes 클러스터를 삭제합니다.
ibmcloud ks cluster rm --cluster eso-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
참고할 만한 사항
YAML 문서를 작성할 때는 다음 사항들을 유의하시기 바랍니다:
-
폴링 간격: 기본적으로 폴링 간격은 1시간(
refreshInterval: 1h)으로 설정되어 있으며, 이 값을 사용하는 것이 권장됩니다. 이 값은 ‘ ExternalSecret ’ 템플릿에서 변경할 수 있습니다. 이 간격은s,m또는h단위로 나타낼 수 있습니다. -
Vault Dedicated 마운트 경로: Vault Dedicated는 KV 시크릿 엔진의 기본 마운트 경로로
secret/이 아닌kv/을 사용합니다. SecretStore 구성에서 올바른 경로를 지정했는지 확인하십시오. -
Vault Dedicated 네임스페이스: Vault Dedicated는 Vault Enterprise 네임스페이스를 사용합니다. 기본 네임스페이스는
admin입니다. SecretStore 구성에서 올바른 네임스페이스를 지정했는지 확인하십시오. -
인증 방법: 이 튜토리얼에서는 간편성을 위해 토큰 인증 방식을 사용합니다. 프로덕션 환경에서는 보안을 강화하기 위해 AppRole 또는 Kubernetes 인증 방식을 사용하는 것을 고려해 보십시오.
-
TLS 유의 사항: Vault Dedicated는 TLS 연결을 필요로 합니다. 프로덕션 환경에서는
skipTLSVerify을 사용하는 대신, 인증서 검증이 올바르게 구성되었는지 확인하십시오.
다음 단계
수고하셨습니다! 이 튜토리얼에서는 External Secrets Operator를 사용하여 Vault Dedicated를 설정하고, 애플리케이션 시크릿을 Kubernetes 클러스터에 안전하게 반영하는 방법을 배웠습니다. Vault Dedicated를 시작하는 데 도움이 되는 더 많은 자료를 확인해 보세요.
- Kubernetes 통합을 위한 공식 오퍼레이터인 Vault Secrets Operator ( HashiCorp's )에 대해 알아보세요.
- ‘External Secrets Operator Vault’ 공급자 문서를 검토하십시오.
- 더 고급 기능 및 구성에 대해서는 Vault Dedicated 설명서를 참고하세요.
- 자세히 알아보기 HashiCorp Vault.