AWS EC2에서 Docker를 통한 HashiCorp Vault 구축 가이드

AWS EC2에서 Docker를 통한 HashiCorp Vault 구축 가이드

개요

이 가이드는 AWS EC2 인스턴스에서 Docker를 사용하여 HashiCorp Vault를 설치하고 구성하는 방법을 단계별로 안내합니다. Vault는 민감한 정보(비밀번호, API 키, 토큰 등)를 안전하게 저장하고 관리할 수 있는 보안 도구입니다.

예상 소요 시간: 약 1-2시간
대상 독자: 인프라 엔지니어, DevOps 엔지니어, 보안 담당자
필요 기술 수준: 중급 (AWS, Linux, Docker 기본 지식 필요)

사전 요구사항

  • AWS 계정 및 EC2 인스턴스 생성 권한

  • SSH 클라이언트 (AWS EC2 인스턴스 접속용)

  • 기본 Linux 명령어 및 Docker 명령어 이해

  • AWS 보안 그룹에 대한 기본 지식

설치 과정 요약

  1. AWS EC2 인스턴스 준비

  2. Docker 및 Docker Compose 설치

  3. Vault 컨테이너 구성 및 실행

  4. Vault 초기화 및 언씰(Unseal)

  5. Vault 기본 설정 구성

  6. 기본 보안 정책 설정

  7. 시스템 상태 확인


1. AWS EC2 인스턴스 준비

인스턴스 생성 및 설정

  1. AWS 관리 콘솔에 로그인하고 EC2 서비스로 이동합니다.

  2. "인스턴스 시작" 버튼을 클릭하고 다음 설정으로 인스턴스를 구성합니다:

    • Amazon Machine Image (AMI): Amazon Linux 2023

    • 인스턴스 유형: t3.small 이상 권장 (최소 2GB RAM)

    • 스토리지: 최소 20GB (프로덕션 환경의 경우 더 큰 용량 필요)

  3. 보안 그룹 설정에서 다음 포트를 허용합니다:

    • SSH (22번 포트): 관리 접속용

    • Vault UI 및 API (8200번 포트): Vault 접속용

  4. 키 페어를 생성하거나 기존 키 페어를 선택하고 인스턴스를 시작합니다.

EC2 인스턴스 접속

SSH를 사용하여 생성한 EC2 인스턴스에 접속합니다:

ssh -i /path/to/your-key.pem ec2-user@your-instance-public-ip

시스템 업데이트

인스턴스에 접속한 후 시스템을 업데이트합니다:

sudo dnf update -y

2. Docker 및 Docker Compose 설치

Docker 설치

  1. Docker 패키지를 설치합니다:

sudo dnf install docker -y
  1. Docker 서비스를 시작하고 부팅 시 자동 시작되도록 설정합니다:

sudo systemctl start docker sudo systemctl enable docker
  1. 현재 사용자를 docker 그룹에 추가하여 sudo 없이 Docker 명령어를 실행할 수 있도록 합니다:

sudo usermod -aG docker $USER
  1. 변경사항을 적용하기 위해 로그아웃한 후 다시 로그인합니다:

exit # 다시 SSH로 접속 ssh -i /path/to/your-key.pem ec2-user@your-instance-public-ip

Docker Compose 설치

  1. Docker Compose를 설치합니다:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 실행 권한을 부여합니다:

sudo chmod +x /usr/local/bin/docker-compose
  1. 설치를 확인합니다:

docker-compose --version

3. Vault 컨테이너 구성 및 실행

작업 디렉토리 생성 및 설정

  1. Vault 설정을 위한 디렉토리를 생성합니다:

mkdir -p ~/vault/{config,data,logs} cd ~/vault
  1. Vault 구성 파일 생성:

cat > config/vault.hcl << EOF storage "file" { path = "/vault/data" } listener "tcp" { address = "0.0.0.0:8200" tls_disable = "true" # 프로덕션 환경에서는 TLS 사용 권장 } ui = true disable_mlock = true api_addr = "http://0.0.0.0:8200"

⚠️ 중요: 실제 프로덕션 환경에서는 TLS를 활성화하고 적절한 인증서를 구성해야 합니다.

Docker Compose 파일 생성

cat > docker-compose.yml << EOF version: '3.8' services: vault: image: hashicorp/vault:latest container_name: vault ports: - "8200:8200" restart: unless-stopped volumes: - ./config:/vault/config - ./data:/vault/data - ./logs:/vault/logs cap_add: - IPC_LOCK entrypoint: vault server -config=/vault/config/vault.hcl environment: - VAULT_ADDR=http://0.0.0.0:8200 - VAULT_API_ADDR=http://0.0.0.0:8200 EOF

Vault 컨테이너 실행

  1. Docker Compose를 사용하여 Vault 컨테이너를 시작합니다:

docker-compose up -d
  1. 컨테이너 상태를 확인합니다:

docker ps

예상 출력:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abcd1234ef hashicorp/vault:latest "vault server -conf..." 1 minute ago Up 1 minute 0.0.0.0:8200->8200/tcp vault

4. Vault 초기화 및 언씰(Unseal)

Vault 초기화

  1. 환경 변수 설정:

export VAULT_ADDR=http://127.0.0.1:8200
  1. Vault 초기화:

docker exec vault vault operator init

⚠️ 매우 중요: 이 명령어의 출력에는 Unseal 키와 초기 Root 토큰이 포함됩니다. 이 정보는 반드시 안전하게 보관해야 합니다. 이 키를 분실하면 Vault에 저장된 데이터에 접근할 수 없게 됩니다.

예상 출력:

Unseal Key 1: abcdefg1234567890... Unseal Key 2: hijklmn1234567890... Unseal Key 3: opqrstu1234567890... Unseal Key 4: vwxyzab1234567890... Unseal Key 5: cdefghi1234567890... Initial Root Token: hvs.abcdefghijklmnopqrstuvwxyz
  1. 안전한 장소에 키를 저장합니다 (파일이나 패스워드 매니저 등).

Vault 언씰(Unseal)

Vault는 시작할 때마다 언씰 과정이 필요합니다. 초기화 시 생성된 Unseal 키 중 최소 3개(기본 설정)를 사용해야 합니다:

docker exec -it vault vault operator unseal # Unseal Key 1 입력 docker exec -it vault vault operator unseal # Unseal Key 2 입력 docker exec -it vault vault operator unseal # Unseal Key 3 입력

5. Vault 기본 설정 구성

Vault 로그인

Root 토큰을 사용하여 Vault에 로그인합니다:

docker exec -it vault vault login

프롬프트에서 초기화 시 받은 Root 토큰을 입력합니다.

감사 로깅 활성화

보안 감사를 위한 로깅을 활성화합니다:

docker exec vault vault audit enable file file_path=/vault/logs/audit.log

Secret 엔진 활성화

  1. Key/Value 버전 2 시크릿 엔진 활성화:

docker exec vault vault secrets enable -version=2 kv
  1. AWS 시크릿 엔진 활성화 (선택사항):

docker exec vault vault secrets enable aws
  1. 데이터베이스 시크릿 엔진 활성화 (선택사항):

docker exec vault vault secrets enable database

6. 기본 보안 정책 설정

정책 파일 생성

  1. 로컬에 정책 파일 생성:

cat > readonly-policy.hcl << EOF path "kv/data/*" { capabilities = ["read", "list"] } EOF
  1. 정책 파일을 컨테이너로 복사:

docker cp readonly-policy.hcl vault:/tmp/
  1. 정책 등록:

docker exec vault vault policy write readonly /tmp/readonly-policy.hcl

인증 방법 설정

  1. AppRole 인증 방법 활성화:

docker exec vault vault auth enable approle
  1. 역할 생성:

docker exec vault vault write auth/approle/role/my-role \ token_policies="readonly" \ token_ttl=1h \ token_max_ttl=24h
  1. 역할 ID 및 시크릿 ID 가져오기:

# 역할 ID 가져오기 docker exec vault vault read auth/approle/role/my-role/role-id # 시크릿 ID 가져오기 docker exec vault vault write -force auth/approle/role/my-role/secret-id

7. 시스템 상태 확인

Vault 상태 확인

Vault 시스템 상태를 확인합니다:

docker exec vault vault status

예상 출력:

Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 5 Threshold 3 ...

웹 UI 접속

  1. 웹 브라우저에서 Vault UI에 접속합니다:

    • URL: http://your-instance-public-ip:8200/ui

  2. 로그인 방법으로 "Token"을 선택하고 Root 토큰을 입력합니다.


문제해결

문제: Vault 시작 실패

증상: Docker 로그에서 Vault가 시작되지 않는 오류가 표시됩니다.

해결방법:

# Docker 로그 확인 docker logs vault # 설정 파일 권한 확인 및 수정 sudo chmod 644 ~/vault/config/vault.hcl # 데이터 디렉토리 권한 확인 및 수정 sudo chown -R 100:1000 ~/vault/data

문제: Vault 언씰(Unseal) 후 접속 불가

증상: Vault가 언씰되었지만 API 또는 UI에 접속할 수 없습니다.

해결방법:

  1. 보안 그룹 설정 확인: AWS 콘솔에서 해당 EC2 인스턴스의 보안 그룹에 8200 포트가 열려있는지 확인

  2. 방화벽 확인:

sudo iptables -L # 필요시 8200 포트 허용 sudo iptables -A INPUT -p tcp --dport 8200 -j ACCEPT

문제: 초기화 키 분실

증상: Unseal 키 또는 Root 토큰을 분실했습니다.

해결방법:

  • Unseal 키를 모두 분실한 경우, 저장된 암호화된 데이터에 더 이상 접근할 수 없습니다.

  • Root 토큰만 분실한 경우 다음 단계를 수행합니다:

# Root 토큰 재생성 (Unseal 키 필요) docker exec -it vault vault operator generate-root -init # 이후 표시되는 절차에 따라 Unseal 키를 사용하여 새 Root 토큰 생성

최종 확인 사항

  1. [ ] Vault가 성공적으로 실행 중인지 확인

  2. [ ] Vault 상태가 initialized 및 unsealed인지 확인

  3. [ ] 웹 UI에 접속 가능한지 확인

  4. [ ] 기본 시크릿 엔진이 활성화되어 있는지 확인

  5. [ ] Unseal 키와 Root 토큰이 안전하게 백업되어 있는지 확인

  6. [ ] 감사 로깅이 활성화되어 있는지 확인

보안 강화 권장사항

  1. TLS 활성화: 프로덕션 환경에서는 반드시 TLS를 구성하여 통신을 암호화해야 합니다.

  2. AWS KMS 통합: AWS KMS를 사용하여 자동 언씰 설정을 고려하세요.

  3. IAM 인증: AWS IAM 인증을 활성화하여 AWS 리소스에 대한 접근을 관리하세요.

  4. 자동 백업: Vault 데이터 디렉토리에 대한 정기적인 백업을 구성하세요.

  5. 모니터링: Vault 상태 및 성능 모니터링 시스템을 구축하세요.

참고 자료