vault

2024. 12. 10. 19:51Spring 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를 안전하게 운영할 준비가 되었습니다! 🔐🚀