Vault와 Vault Agent Injector을 사용해서 Secret을 Secret 답게 관리해 보자. (in Kubernetes)

vinca·2024년 3월 2일
0

로그인

제공된 아키텍처 다이어그램은 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 환경 내의 쿠버네티스 클러스터 또는 다른 서비스와 통신할 수 있습니다. 이를 통해 안전하게 비밀번호, 액세스 키, 기타 중요한 데이터를 저장하고, 필요한 애플리케이션과 서비스에 접근할 수 있는 자격 증명을 제공할 수 있습니다.

vault 생성

AWS에 vault 서버를 위치시킨다.

vault 서버를 외부에 위치시킴
내부에 설치하는 경우

VPC 피어링 설정

EKS 환경과 VPC 피어링을 설정한다.

수락해주면 된다.

라우팅 테이블 편집

vault 설치

vault로 그인

시크릿 생성

vault kv get secret/my-secret

Vault와 Valut Agenct Injector

Vault 및 Vault Agent Injector 설치

Vault 로그인 이후 작업✔️⬇️💘

Vault CLI로 Secret 생성

vault kv put secret/test/web apiKey="ABC0DEFG9876" service="web"

생성한 secret 정보를 아래 명령어로 확인할 수 있습니다.

vault kv get secret/test/web

secret에 접근할 수 있는 정책을 생성합니다.

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 Agent Injector 설치

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

HCP Vault에서 Kubernetes auth 구성

Secret 정보를 받아오기 위한 인증방식을 설정합니다.

# examples
vault auth enable kubernetes

# auth 이름을 변경하고 싶으면 path로 설정
vault auth enable -path=test kubernetes

💡 Kubernetes 1.24+ 에서는 vault에서는 auth secret가 자동으로 생성되지 않기 때문에 추가로 생성해야 합니다.

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

Kubernetes vault auth를 생성하기 전에 필요한 정보를 변수로 설정합니다.

💡 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에 kubernetes auth를 등록합니다.

vault write auth/kubernetes/config \
   token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
   kubernetes_host="$KUBE_HOST" \
   kubernetes_ca_cert="$KUBE_CA_CERT"

Kubrnetes service account에서 Vault의 토큰 정보를가져올 수 있게 아래 명령어로 진행합니다.

. 이 명령어는 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

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글

관련 채용 정보