2024. 12. 10. 19:51ㆍSpring Microservice
🏗 HashiCorp Vault + Docker Compose 완벽 가이드 🔐💾
📌 1. HashiCorp Vault란?
Vault는 기업 및 개발자가 데이터를 안전하게 보호할 수 있도록 설계된 보안 솔루션입니다.
주요 기능:
✅ 비밀 관리: API 키, 비밀번호, 인증 정보를 안전하게 저장
✅ 동적 인증 정보: 사용자의 접근 시점에 따라 임시 크리덴셜 발급 (AWS, DB 등)
✅ 데이터 암호화: 내부적으로 데이터를 암호화하여 저장
✅ ACL 기반 접근 제어: 정책(Policy)을 통해 특정 키에 대한 접근을 제한
Vault는 일반적인 환경 변수(.env 파일) 기반의 보안보다 훨씬 강력한 방식을 제공합니다.
그럼, Vault를 Docker Compose로 실행하고 자동 설정하는 방법을 살펴보겠습니다.
📁 2. 프로젝트 파일 구조
먼저 Vault 실행을 위한 기본적인 파일 구조를 정의하겠습니다.
vault-project/
│── docker-compose.yml # ✅ Vault 실행을 위한 Docker Compose 설정
│── vault/
│ │── config.hcl # ✅ Vault 설정 파일
│ │── file/ # ✅ Vault Raft 스토리지 저장소
│ │── vault-init.sh # ✅ 초기화 및 데이터 입력 스크립트
│ └── data/
│ ├── default.json # ✅ 기본 환경 데이터 (Key-Value 저장소)
│ ├── dev.json # ✅ 개발 환경 데이터
│ ├── db-credentials.json # ✅ 데이터베이스 접근 인증 정보
│ ├── aws-keys.json # ✅ AWS 크리덴셜 저장
│ └── policy.hcl # ✅ Vault 접근 정책 파일
📜 3. Docker Compose 설정 (docker-compose.yml
)
version: '3.8'
services:
vault:
image: hashicorp/vault:1.13.11 # ✅ 공식 Vault Docker 이미지 사용
container_name: vault # ✅ 컨테이너 이름 지정
restart: always # ✅ 컨테이너가 종료되면 자동 재시작
ports:
- "8200:8200" # ✅ Vault UI 및 API 접근 포트
environment:
VAULT_DEV_ROOT_TOKEN_ID: "myroot" # 🚨 개발 환경용 루트 토큰 (프로덕션에서는 사용 금지!)
networks:
backend:
aliases:
- "vault"
volumes:
- ./vault/config:/vault/config
- ./vault/file:/vault/data
- ./vault/vault-init.sh:/vault/vault-init.sh
cap_add:
- IPC_LOCK # 🔒 메모리 잠금 (스왑 방지, 보안 강화)
command: ["sh", "/vault/vault-init.sh"] # 🚀 컨테이너 시작 시 초기화 스크립트 실행
🔎 Docker Compose 주요 설정
설정 | 설명 |
---|---|
hashicorp/vault:1.13.11 |
최신 공식 Vault Docker 이미지 사용 |
ports: 8200:8200 |
Vault API 및 UI 접근 (http://localhost:8200) |
VAULT_DEV_ROOT_TOKEN_ID |
루트 토큰 설정 (프로덕션 환경에서는 별도 관리 필요) |
volumes |
Vault 설정, 데이터 저장, 초기화 스크립트 마운트 |
command |
컨테이너 실행 시 초기화 스크립트 실행 |
📁 4. Vault 설정 파일 (config.hcl
)
# 🚀 Vault 데이터 저장 (Raft 사용)
storage "raft" {
path = "/vault/file" # ✅ Raft 스토리지 저장 경로
node_id = "node1" # ✅ 클러스터 노드 ID
}
# 🌐 Vault 리스너 설정 (TLS 비활성화)
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "true" # 🚨 TLS 비활성화 (프로덕션에서는 활성화 필요)
}
# 🔗 Vault API 및 UI 설정
api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
ui = true
📌 설정 분석
✔️ Raft 스토리지 사용 → Vault 내부적으로 데이터를 관리 (클러스터 지원)
✔️ TLS 비활성화 (tls_disable = true
) → 개발 환경에서는 가능하지만, 운영에서는 필수로 TLS 활성화 필요
✔️ UI 활성화 (ui = true
) → http://localhost:8200 에서 UI 접근 가능
🔄 5. Vault 초기화 스크립트 (vault-init.sh
)
#!/bin/sh
# 🚀 Vault 서버 개발 모드 실행
vault server -dev -dev-root-token-id="myroot" -dev-listen-address="0.0.0.0:8200" &
# ⏳ Vault가 실행될 때까지 대기
sleep 5
# 🌍 환경 변수 설정
export VAULT_ADDR='http://0.0.0.0:8200'
export VAULT_TOKEN='myroot'
# 🗄️ Key-Value 데이터 저장
VAULT_TOKEN=myroot vault kv put secret/licensing-service/default @/vault/data/default.json
VAULT_TOKEN=myroot vault kv put secret/licensing-service/dev @/vault/data/dev.json
# 🔑 AWS 및 데이터베이스 크리덴셜 저장
VAULT_TOKEN=myroot vault kv put secret/aws @/vault/data/aws-keys.json
VAULT_TOKEN=myroot vault kv put secret/database @/vault/data/db-credentials.json
echo "✅ Vault 초기화 및 데이터 저장 완료!"
🔎 스크립트 분석
✔️ Vault 실행 후 초기화 및 데이터 저장
✔️ AWS 크리덴셜, DB 인증 정보 자동 저장
✔️ Key-Value 저장소를 활용하여 API 키 저장 가능
🔐 6. 보안 고려 사항 (프로덕션 필수 적용)
⚠️ 운영 환경에서는 다음 사항을 필수로 적용하세요!
✅ TLS 활성화 (tls_disable = false
)
✅ 루트 토큰을 환경 변수 또는 별도 저장소에서 관리
✅ Vault 접근 정책 설정 (RBAC 적용)
✅ 클러스터링 활성화 및 고가용성(HA) 설정
✅ 백업 및 재해 복구 전략 수립
🚀 7. 실행 방법 (Step-by-Step)
1️⃣ Docker Compose 실행
docker-compose up -d
2️⃣ Vault UI 접속
📌 URL: http://localhost:8200
📌 Root Token: myroot
3️⃣ Vault CLI 테스트
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='myroot'
# 🗄️ 저장된 데이터 조회
vault kv get secret/licensing-service/default
vault kv get secret/aws
🎯 8. Summary
✅ Vault를 Docker Compose로 실행하여 자동 설정 가능
✅ 초기화 스크립트를 통한 데이터 저장 및 자동화 가능
✅ 보안 강화를 위한 TLS, 정책 설정 필수
🔥 이제 Vault를 안전하게 운영할 준비가 되었습니다! 🔐🚀
'Spring Microservice' 카테고리의 다른 글
유레카 클라이언트 설정 (0) | 2024.12.11 |
---|---|
Spring boot의 서비스 디스커버리 개념 (0) | 2024.12.11 |
클라우드 기반 서비스 디스커버리 에이전트 (0) | 2024.12.11 |
Vault와 Spring Cloud Vault 통합 (0) | 2024.12.11 |
Raft in Vault (0) | 2024.12.10 |