제공된 아키텍처 다이어그램은 HashiCorp Vault의 구성요소와 쿠버네티스 클러스터와의 상호 작용을 나타내고 있습니다. 여기서, Vault Agent Injector는 쿠버네티스 클러스터 내부에 배치되어 있는 것으로 보입니다. Injector는 쿠버네티스의 Mutating Webhook을 사용하여 파드 스펙에 Vault Agent 컨테이너를 Sidecar로 자동으로 주입합니다.
Vault 서버 자체는 다이어그램에서 별도로 표시되어 있으며, 이는 일반적으로 Vault 서버가 쿠버네티스 클러스터 외부에 배치될 수 있음을 나타냅니다. 외부에 위치한 Vault 서버는 쿠버네티스 인증 방식을 통해 쿠버네티스 클러스터와 통신하며, 애플리케이션 파드는 Vault Agent를 통해 필요한 시크릿을 안전하게 검색할 수 있습니다.
클라우드 제공업체: AWS가 선택되었습니다. 즉, Vault 클러스터는 AWS 내에서 구성됩니다.
Vault Tier: 개발 목적의 단일 노드 클러스터가 선택되었고, 이는 비생산 워크플로우를 위한 것입니다.
클러스터 크기: Extra Small 사이즈가 선택되었으며, 이는 2 vCPU와 1 GiB RAM을 의미합니다. 이는 개발 환경이나 소규모 워크로드에 적합한 구성입니다.
네트워크: HashiCorp Virtual Network (HVN)를 사용하여 구성됩니다. 이 HVN은 AWS의 us-west-2 리전에 위치하며, 172.25.16.0/20 CIDR 블록이 할당되었습니다.
이 설정을 통해 AWS에 Vault 클러스터가 생성되며, 해당 클러스터는 AWS 환경 내의 쿠버네티스 클러스터 또는 다른 서비스와 통신할 수 있습니다. 이를 통해 안전하게 비밀번호, 액세스 키, 기타 중요한 데이터를 저장하고, 필요한 애플리케이션과 서비스에 접근할 수 있는 자격 증명을 제공할 수 있습니다.
AWS에 vault 서버를 위치시킨다.
vault 서버를 외부에 위치시킴
내부에 설치하는 경우
EKS 환경과 VPC 피어링을 설정한다.
수락해주면 된다.
vault kv get secret/my-secret
vault kv put secret/test/web apiKey="ABC0DEFG9876" service="web"
vault kv get secret/test/web
vault policy write test/web - << EOF
# Grant 'create', 'read' and 'update' permission to paths prefixed by 'secret/data/test/'
path "secret/data/test/web" {
capabilities = [ "create", "read" ]
}
EOF
vault policy read test/web
Vault Helm Chart를 이용하여 Agent Injector를 구성합니다.
💡 Hashicorp Vault에서는 Agent Injector를 구성할 때 HELM 차트로 구성하는 것을 권장합니다.
💡 Vault Agent Injector에는 Vault 1.3.1 이상이 필요합니다.
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
values.yaml 파일은 외부 서버를 HCP Vault로 설정 하는 파일을 만듭니다. 이렇게 하면 Vault 에이전트 인젝터가 EKS 클러스터에 배포됩니다.
앞서 VPC Peering을 통해 내부 통신이 가능하여 Cluster Private URL로 설정합니다.
export VAULT_PRIVATE_ADDR=https://vault-cluster-private-vault-0027853c.79d667a9.z1.hashicorp.cloud:8200
cat > values.yaml << EOF
injector:
enabled: true
externalVaultAddr: "${VAULT_PRIVATE_ADDR}"
EOF
위에서 만든 values.yaml 파일을 이용하여 Vault Agent를 설치합니다.
helm install vault -f values.yaml hashicorp/vault
kubectl get pods
Secret 정보를 받아오기 위한 인증방식을 설정합니다.
# examples
vault auth enable kubernetes
# auth 이름을 변경하고 싶으면 path로 설정
vault auth enable -path=test kubernetes
vault에서 인증에 사용할 token를 생성합니다.
cat > vault-auth-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
name: vault-auth-secret
annotations:
kubernetes.io/service-account.name: vault
type: kubernetes.io/service-account-token
EOF
아래 명령어를 참고하여 token이 정상적으로 생성되었는지 확인합니다. Tokens 항목에 위에서 생성한 vault-auth-secret.yaml의 name 정보로 설정되어있는지 확인합니다.
kubectl apply -f vault-auth-secret.yaml
kubectl describe sa/vault
💡 Secret token과 Kubernetes CA Cert, Host 정보를 얻기 위해서는 Kubernetes API Server를 호출할 수 있는 곳에서 진행해야 합니다.
export VAULT_HELM_SECRET_NAME=$(kubectl get secrets --output=json | jq -r '.items[].metadata | select(.name|startswith("vault-auth-")).name')
export TOKEN_REVIEW_JWT=$(kubectl get secret $VAULT_HELM_SECRET_NAME --output='go-template={{ .data.token }}' | base64 --decode)
export KUBE_CA_CERT=$(kubectl config view --raw --minify --flatten \
--output 'jsonpath={.clusters[].cluster.certificate-authority-data}' | base64 --decode)
export KUBE_HOST=$(kubectl config view --raw --minify --flatten \
-o jsonpath='{.clusters[].cluster.server}')
# 변수 확인
echo $TOKEN_REVIEW_JWT
echo $KUBE_HOST
echo $KUBE_CA_CERT
vault write auth/kubernetes/config \
token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
kubernetes_host="$KUBE_HOST" \
kubernetes_ca_cert="$KUBE_CA_CERT"
. 이 명령어는 Vault 내에서 특정 Kubernetes 서비스 어카운트에 대한 역할을 생성하거나 업데이트하는 데 사용됩니다. 이 역할을 통해 해당 서비스 어카운트가 Vault에 인증할 때 어떤 정책(Policies)에 따라 접근 권한을 가지게 될지 정의할 수 있습니다.
vault write auth/kubernetes/role/web \
bound_service_account_names=vault \
bound_service_account_namespaces=default \
policies=test/web \
ttl=1h
확인
vault read auth/kubernetes/role/web