
HashiCorp Vault는 데이터 암호화와 접근 제어를 통해 비밀 정보 관리를 위한 소프트웨어 도구이다. 비밀 정보(예: API 키, 비밀번호, 인증서)를 안전하게 저장하고, 사용자 인증과 권한 부여를 통해 엄격하게 제어하며, 감사할 수 있다. Vault는 클라우드 환경과 같은 동적 인프라에서 사용하기에 적합하며, 다양한 인증 방법과 통합되어 보안을 강화하는 데 사용된다.
이처럼 보안에 중요한 정보들을 관리할 수 있는 도구라고 할 수 있다.
일단 Terraform으로 eks를 배포하면서 정말 많은 secret이나 api key, app key 등이 생겼고 이를 한 곳에 보안성 좋게 관리하고 싶다는 생각이 들었다.
기존에는 terraform.tfvars나 쿠버네티스 시크릿을 사용하고 있었고, 쿠버네티스 시크릿은 기본 보안성이 Base64 인코딩만 적용되어 상대적으로 낮으므로 외부 시크릿 관리자 연동을 하는게 좋다는 글을 접했기 때문이다.
우선 간단하게 terraform.tfvars에 선언되어있는 변수들에 적용해보고 싶었다. (가장 보안 처리가 안되어있다고 느껴진 1순위,,)

먼저 datadog_api_key와 app_key를 적용해보게 되었다.
먼저 Helm chart에 vault chart를 pull 받아와서 release를 해주고, unseal처리를 해주었다. unseal 과정은 pod이 새로 생성될 때마다 해주어야해서 auto_unseal을 해주는게 좋지만 우선 적용이 되는걸 먼저 확인하고 싶어 수동으로 처리했다.

이렇게 설치시 나오는 key들을 threshold수에 맞게 붙여넣어주면 된다. 그러면 login 창이 나오고 설치시 받은 root 토큰을 사용해 로그인이 가능하다.

그리고
1. Key-Value(KV) Secrets Engine 활성화하기
2. 새로 만든 KV 엔진에 시크릿 생성하기
3. 정책(Policy) 생성하기
4. Kubernetes 인증 역할(Role) 설정하기
를 마쳤다.
provider "vault" {
}
프로바이더 안에는 아무런 변수를 선언해주지 않고, 환경변수를 터미널에 저장 후 terraform apply시 적용될 수 있게 했다.
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN="토큰"
이후
data "vault_generic_secret" "datadog_keys" {
path = "kv/monitoring/datadog"
}
datadog = {
site = "ap1.datadoghq.com"
apiKey = data.vault_generic_secret.datadog_keys.data.datadog_api_key
clusterName = var.eks_cluster_name
위의 코드와 같이 data로 vault key를 받아올 수 있도록 연동했다.
그런데!! terraform apply를 할 때마다
╷ │ Error: failed to lookup token, err=Error making API request. │ │ URL: GET http://127.0.0.1:8200/v1/auth/token/lookup-self │ Code: 403. Errors: │ │ * 2 errors occurred: │ * permission denied │ * invalid token │ │ with module.helm.data.vault_generic_secret.datadog_keys, │ on modules/helm/main.tf line 168, in data "vault_generic_secret" "datadog_keys": │ 168: data "vault_generic_secret" "datadog_keys" {
와 같은 에러가 났다. 계속해서 토큰이 인식이 되지 않았다.
몇 번을 확인해도 토큰은 환경변수로 잘 설정되어있고, 그 토큰으로 GUI에서도 로그인이 가능했는데 똑같은 에러가 났다.
이유는 두 개의 Vault 인스턴스가 같은 포트를 사용하려고 해서 충돌이 발생했기 때문이었다. 내가 테스트하느라 로컬에 실행 중이던 vault server -dev를 중지하지 않고 Kubernetes 클러스터의 Vault에 포트 포워딩으로 접근 중이었기 때문에 이런 문제를 일으켰다. 때문에 Terraform이 어떤 Vault에 접근해야하는지 모호해져서 토큰을 찾지 못했던 것이라고 할 수 있다.
이 문제 덕분에 삽질을 오후 내내..^^ 했지만 결국 원인은 간단한 곳에 있었다는 것을 깨닫고 허탈하기도 하고ㅎㅎ 앞으로는 내가 같은 포트를 연결하고 있어 문제가 되는게 아닐지!! 생각해보아야겠다고 느꼈다.😇😇😇