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 리포지토리의 디렉터리 구조 예
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 리포지토리가 있습니다.
프로세스
Vault CSI 공급자용 Argo CD 애플리케이션 리소스 생성.
Argo CD 애플리케이션 리소스를 생성하여 Vault CSI 공급자를 배포합니다. GitOps 리포지토리에 이 리소스를 추가합니다(예:
config/argocd/vault-secret-provider-app.yaml
):vault-secret-provider-app.yaml
파일 예Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고server.enabled: true
및dataStorage.enabled: false
설정에서는 임시 스토리지를 사용하여 HashiCorp Vault 서버 인스턴스를 배포합니다. 이 설정은 개발 또는 테스트 환경에 적합합니다. 프로덕션의 경우 PV(영구 볼륨)를 사용하여dataStorage
를 활성화하거나 외부 Vault 클러스터를 사용하고server.enabled
를false
로 설정할 수 있습니다. Vault 서버가 이미 배포된 경우server.enabled
를false
로 설정할 수 있습니다.
GitOps 리포지토리에서
vault-secret-provider-app.yaml
파일을 클러스터로 적용합니다.oc apply -f vault-secret-provider-app.yaml
$ oc apply -f vault-secret-provider-app.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vault CSI 공급자를 배포한 후
vault-csi-provider
DaemonSet이 실행되지 않을 수 있습니다. 이 문제는 OpenShift Container Platform이 기본적으로 권한 있는 컨테이너를 제한하기 때문에 발생합니다. 또한 Vault CSI 공급자 및 Secrets Store CSI 드라이버는 pod가 privileged로 실행되지 않는 한hostPath
마운트에 액세스해야 합니다.OpenShift Container Platform의 권한 문제를 해결하려면 다음을 수행합니다.
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}}]
$ 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 Copied! Toggle word wrap Toggle overflow 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
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-cluster-csi-drivers:secrets-store-csi-driver-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenShift Container Platform의 권한 있는 SCC(보안 컨텍스트 제약 조건)에 대한 Vault CSI 공급자 서비스 계정 액세스 권한을 부여합니다.
oc adm policy add-scc-to-user privileged \ system:serviceaccount:vault-csi-provider:vault-csi-provider
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:vault-csi-provider:vault-csi-provider
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고Helm 차트에서
server.enabled
가true
로 설정된 경우 Vault 서버 Pod는 OpenShift Container Platform이 기본적으로 차단하는 특정 사용자 ID(UID) 또는 그룹 ID(GID)와 함께 실행됩니다.Vault 서버 서비스 계정에 필요한 SCC(보안 컨텍스트 제약 조건) 권한을 부여합니다.
oc adm policy add-scc-to-user anyuid system:serviceaccount:vault-csi-provider:vault
$ oc adm policy add-scc-to-user anyuid system:serviceaccount:vault-csi-provider:vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.2. 시크릿을 저장하도록 Vault 초기화 및 구성 링크 복사링크가 클립보드에 복사되었습니다!
Argo CD를 사용하여 Vault를 배포하고 필요한 SCC 권한 및 DaemonSet 패치를 적용한 후 Vault를 초기화하고 봉인하고 Kubernetes 인증을 구성하여 보안 보안 스토리지 및 액세스를 활성화합니다.
프로세스
Vault Pod에 액세스합니다.
Vault가 OpenShift Container Platform 클러스터 내에서 실행 중인 경우(예:
vault-csi-provider
네임스페이스의vault-0
Pod) 다음 명령을 실행하여 Pod 내의 Vault CLI에 액세스합니다.oc exec -it vault-0 -n vault-csi-provider -- /bin/sh
$ oc exec -it vault-0 -n vault-csi-provider -- /bin/sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Vault를 초기화합니다.
Vault 인스턴스가 아직 초기화되지 않은 경우 다음 명령을 실행합니다.
vault operator init
$ vault operator init
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 결과적으로 다음 출력이 표시됩니다.
5 Unseal Keys - required to unseal the Vault. Initial Root Token - required to log in and configure Vault.
5 Unseal Keys - required to unseal the Vault. Initial Root Token - required to log in and configure Vault.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 중요이러한 인증 정보를 안전하게 저장합니다. 자격 증명 모음을 해제하려면 5개 키 중 3개 이상의 키가 필요합니다. 키가 손실되면 저장된 보안에 대한 액세스가 영구적으로 차단됩니다.
Vault를 봉인하지 않습니다.
Vault는 봉인된 상태에서 시작됩니다. 다음 명령을 실행하여 이전 단계에서 얻은 5개의 Unseal Keys 중 3개를 사용합니다.
vault operator unseal <Unseal Key 1>
$ vault operator unseal <Unseal Key 1> vault operator unseal <Unseal Key 2> vault operator unseal <Unseal Key 3>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 봉인을 해제하면 Vault가 활성화되고 사용할 준비가 됩니다.
Vault에 로그인합니다.
루트 토큰을 사용하여 Vault에 로그인하려면 다음 명령을 실행합니다.
vault login <Initial Root Token>
$ vault login <Initial Root Token>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이를 통해 시크릿 엔진 및 인증 방법을 활성화하고 구성할 수 있는 관리자 액세스 권한이 제공됩니다.
Vault에서 Kubernetes 인증을 활성화합니다.
다음 명령을 실행하여 Vault에서 Kubernetes 인증을 활성화합니다.
vault auth enable kubernetes
$ vault auth enable kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이를 통해 Kubernetes 워크로드(예: pod)는 서비스 계정을 사용하여 Vault로 인증할 수 있습니다.
Vault에서 Kubernetes 인증 방법을 구성합니다.
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
$ 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 Copied! Toggle word wrap Toggle overflow 결과적으로 다음 출력이 표시됩니다.
Success! Data written to: auth/kubernetes/config
Success! Data written to: auth/kubernetes/config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음과 같습니다.
-
<issuer
>는 Kubernetes 토큰 발행자 URL의 이름입니다. -
<
token_reviewer_jwt
>는 Vault에서 KubernetesTokenReview
API를 호출하고 서비스 계정 토큰을 확인하는 데 사용하는 JSON 웹 토큰(JWT)입니다. -
<kubernetes_host
>는 Vault에서 Kubernetes API 서버와 통신하는 데 사용하는 URL입니다. -
<kubernetes_ca_cert
>는 Vault에서 Kubernetes API 서버와의 보안 통신에 사용하는 CA 인증서입니다.
-
2.4.3. Vault에서 시크릿, 정책 및 역할 관리 링크 복사링크가 클립보드에 복사되었습니다!
Vault에서 시크릿을 생성하려면 Vault 정책을 정의하고 Kubernetes 워크로드가 시크릿을 안전하게 검색할 수 있는 Kubernetes 인증 역할을 구성합니다.
프로세스
KV 시크릿 엔진 활성화
KV(Key-Value) 버전 2 시크릿 엔진을 사용하여 버전 관리 지원과 함께 임의의 시크릿을 저장합니다. 다음 명령을 실행하여 경로 secret/에서 KV 시크릿 엔진을 활성화합니다.
vault secrets enable -path=secret/ kv
$ vault secrets enable -path=secret/ kv
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Vault에 시크릿을 저장합니다.
KV 버전 2 시크릿 엔진을 사용하여 시크릿을 저장합니다. 다음 명령을 실행하여 경로
secret/demo/config
: 시크릿 데이터, 사용자 이름 및 암호를 저장합니다.vault kv put secret/demo/config username="demo-user" password="demo-pass"
$ vault kv put secret/demo/config username="demo-user" password="demo-pass"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Vault 정책을 생성합니다.
보안에 대한 읽기 액세스 권한을 부여하는 정책을 생성하려면 다음 명령을 실행합니다.
vault policy write demo-app-policy -<<EOF path "secret/demo/config" { capabilities = ["read"] } EOF
$ vault policy write demo-app-policy -<<EOF path "secret/demo/config" { capabilities = ["read"] } EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이
demo-app-policy
는secret/demo/config
에서 보안에 대한 읽기 액세스 권한을 부여하며 나중에 Kubernetes 역할에 연결됩니다.
Vault에서 Kubernetes 인증 역할을 생성합니다.
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
$ 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 Copied! Toggle word wrap Toggle overflow 이를 통해 서비스 계정을 사용하는 모든 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 오브젝트에 저장하지 않고 데이터에 액세스할 수 있습니다.
프로세스
SecretProviderClass
생성애플리케이션의 매니페스트 디렉터리에
SecretProviderClass
리소스를 생성합니다(예:environments/dev/apps/demo-app/manifest/secretProviderClass.yaml
). 이 리소스는 Secrets Store CSI 드라이버가 Vault에서 시크릿을 검색하는 방법을 정의합니다.vault-secret-provider-app.yaml
파일 예Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<provider: vault
> - HashiCorp Vault의 이름을 지정합니다.- 2
<vaultAddress
> - Vault 서버의 네트워크 주소를 지정합니다. 클러스터 내 서비스 또는 외부 URL과 같은 Vault 설정에 따라 이를 조정합니다.- 3
<roleName
> - 애플리케이션 서비스 계정에서 사용하는 Vault Kubernetes 인증 역할을 지정합니다. 검색할 시크릿과 파일 이름에 매핑하는 방법을 정의하는 배열을 설명합니다.- 4
<objects
> - 검색할 시크릿과 파일 이름에 매핑하는 방법을 정의하는 배열을 지정합니다. KV v2의secretPath
에는/data/
가 포함됩니다.
ServiceAccount
와 같은 애플리케이션을 생성합니다.애플리케이션 워크로드에 대한 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
apiVersion: v1 kind: ServiceAccount metadata: name: demo-app-sa namespace: demo-app
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
애플리케이션 배포를 생성합니다.
지정된
ServiceAccount
를 사용하고 CSI 볼륨을 사용하여 시크릿을 마운트하도록 애플리케이션의 배포를 수정합니다. GitOps 리포지토리에 업데이트된 매니페스트를 저장합니다(예:environments/dev/apps/demo-app/manifest/deployment.yaml
).deployment.yaml
파일의 예Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
serviceAccountName
- 애플리케이션 포드에서 사용하는 KubernetesServiceAccount
이름(예: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
를 참조합니다.
워크로드에 대한 Argo CD 애플리케이션을 정의합니다.
Argo CD 애플리케이션 리소스를 정의하여 GitOps 리포지토리에서
ServiceAccount
,SecretProviderClass
및Deployment
와 같은 애플리케이션 구성 요소를 배포합니다.environments/dev/apps/demo-app/argocd/demo-app.yaml
과 같은 디렉터리 위치에 Argo CD 매니페스트를 저장합니다.demo-app.yaml
파일 예Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.5. 보안 삽입 확인 링크 복사링크가 클립보드에 복사되었습니다!
시크릿 삽입을 확인하여 Vault에 예상 값이 포함되어 있는지 확인합니다.
프로세스
Pod 상태를 확인합니다.
Argo CD 애플리케이션이 동기화되고 모든 리소스가 배포된 후
demo-app
네임스페이스에서 애플리케이션 포드가 성공적으로 실행되고 있는지 확인합니다. 다음 명령을 실행합니다.oc get pods -n demo-app
$ oc get pods -n demo-app
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
쉘 세션을 엽니다.
애플리케이션 포드 이름을 사용하여 쉘 세션을 엽니다. &
lt;your-app-pod-name>
;을 실제 Pod 이름으로 바꿉니다.oc exec -it <your-app-pod-name> -n demo-app -- sh
$ oc exec -it <your-app-pod-name> -n demo-app -- sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
마운트된 보안을 확인합니다.
보안이 예상 경로에 마운트되었는지 확인하려면 다음 명령을 실행합니다.
ls -l /mnt/secrets-store
$ ls -l /mnt/secrets-store cat /mnt/secrets-store/demoAppUsername cat /mnt/secrets-store/demoAppPassword
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 마운트된 시크릿 파일
demoAppUsername
및demoAppPassword
에 Vault의 예상 값이 포함되어 있는지 확인합니다.