AWS EC2에서 Docker를 통한 HashiCorp Vault 구축 가이드
- 1 개요
- 2 사전 요구사항
- 3 설치 과정 요약
- 4 1. AWS EC2 인스턴스 준비
- 4.1 인스턴스 생성 및 설정
- 4.2 EC2 인스턴스 접속
- 4.3 시스템 업데이트
- 5 2. Docker 및 Docker Compose 설치
- 5.1 Docker 설치
- 5.2 Docker Compose 설치
- 6 3. Vault 컨테이너 구성 및 실행
- 6.1 작업 디렉토리 생성 및 설정
- 6.2 Docker Compose 파일 생성
- 6.3 Vault 컨테이너 실행
- 7 4. Vault 초기화 및 언씰(Unseal)
- 7.1 Vault 초기화
- 7.2 Vault 언씰(Unseal)
- 8 5. Vault 기본 설정 구성
- 8.1 Vault 로그인
- 8.2 감사 로깅 활성화
- 8.3 Secret 엔진 활성화
- 9 6. 기본 보안 정책 설정
- 10 7. 시스템 상태 확인
- 10.1 Vault 상태 확인
- 10.2 웹 UI 접속
- 11 문제해결
- 11.1 문제: Vault 시작 실패
- 11.2 문제: Vault 언씰(Unseal) 후 접속 불가
- 11.3 문제: 초기화 키 분실
- 12 최종 확인 사항
- 13 보안 강화 권장사항
- 14 참고 자료
개요
이 가이드는 AWS EC2 인스턴스에서 Docker를 사용하여 HashiCorp Vault를 설치하고 구성하는 방법을 단계별로 안내합니다. Vault는 민감한 정보(비밀번호, API 키, 토큰 등)를 안전하게 저장하고 관리할 수 있는 보안 도구입니다.
예상 소요 시간: 약 1-2시간
대상 독자: 인프라 엔지니어, DevOps 엔지니어, 보안 담당자
필요 기술 수준: 중급 (AWS, Linux, Docker 기본 지식 필요)
사전 요구사항
AWS 계정 및 EC2 인스턴스 생성 권한
SSH 클라이언트 (AWS EC2 인스턴스 접속용)
기본 Linux 명령어 및 Docker 명령어 이해
AWS 보안 그룹에 대한 기본 지식
설치 과정 요약
AWS EC2 인스턴스 준비
Docker 및 Docker Compose 설치
Vault 컨테이너 구성 및 실행
Vault 초기화 및 언씰(Unseal)
Vault 기본 설정 구성
기본 보안 정책 설정
시스템 상태 확인
1. AWS EC2 인스턴스 준비
인스턴스 생성 및 설정
AWS 관리 콘솔에 로그인하고 EC2 서비스로 이동합니다.
"인스턴스 시작" 버튼을 클릭하고 다음 설정으로 인스턴스를 구성합니다:
Amazon Machine Image (AMI): Amazon Linux 2023
인스턴스 유형: t3.small 이상 권장 (최소 2GB RAM)
스토리지: 최소 20GB (프로덕션 환경의 경우 더 큰 용량 필요)
보안 그룹 설정에서 다음 포트를 허용합니다:
SSH (22번 포트): 관리 접속용
Vault UI 및 API (8200번 포트): Vault 접속용
키 페어를 생성하거나 기존 키 페어를 선택하고 인스턴스를 시작합니다.
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 설치
Docker 패키지를 설치합니다:
sudo dnf install docker -y
Docker 서비스를 시작하고 부팅 시 자동 시작되도록 설정합니다:
sudo systemctl start docker
sudo systemctl enable docker
현재 사용자를 docker 그룹에 추가하여 sudo 없이 Docker 명령어를 실행할 수 있도록 합니다:
sudo usermod -aG docker $USER
변경사항을 적용하기 위해 로그아웃한 후 다시 로그인합니다:
exit
# 다시 SSH로 접속
ssh -i /path/to/your-key.pem ec2-user@your-instance-public-ip
Docker Compose 설치
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
실행 권한을 부여합니다:
sudo chmod +x /usr/local/bin/docker-compose
설치를 확인합니다:
docker-compose --version
3. Vault 컨테이너 구성 및 실행
작업 디렉토리 생성 및 설정
Vault 설정을 위한 디렉토리를 생성합니다:
mkdir -p ~/vault/{config,data,logs}
cd ~/vault
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 컨테이너 실행
Docker Compose를 사용하여 Vault 컨테이너를 시작합니다:
docker-compose up -d
컨테이너 상태를 확인합니다:
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 초기화
환경 변수 설정:
export VAULT_ADDR=http://127.0.0.1:8200
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
안전한 장소에 키를 저장합니다 (파일이나 패스워드 매니저 등).
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 엔진 활성화
Key/Value 버전 2 시크릿 엔진 활성화:
docker exec vault vault secrets enable -version=2 kv
AWS 시크릿 엔진 활성화 (선택사항):
docker exec vault vault secrets enable aws
데이터베이스 시크릿 엔진 활성화 (선택사항):
docker exec vault vault secrets enable database
6. 기본 보안 정책 설정
정책 파일 생성
로컬에 정책 파일 생성:
cat > readonly-policy.hcl << EOF
path "kv/data/*" {
capabilities = ["read", "list"]
}
EOF
정책 파일을 컨테이너로 복사:
docker cp readonly-policy.hcl vault:/tmp/
정책 등록:
docker exec vault vault policy write readonly /tmp/readonly-policy.hcl
인증 방법 설정
AppRole 인증 방법 활성화:
docker exec vault vault auth enable approle
역할 생성:
docker exec vault vault write auth/approle/role/my-role \
token_policies="readonly" \
token_ttl=1h \
token_max_ttl=24h
역할 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 접속
웹 브라우저에서 Vault UI에 접속합니다:
URL:
http://your-instance-public-ip:8200/ui
로그인 방법으로 "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에 접속할 수 없습니다.
해결방법:
보안 그룹 설정 확인: AWS 콘솔에서 해당 EC2 인스턴스의 보안 그룹에 8200 포트가 열려있는지 확인
방화벽 확인:
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 토큰 생성
최종 확인 사항
[ ] Vault가 성공적으로 실행 중인지 확인
[ ] Vault 상태가 initialized 및 unsealed인지 확인
[ ] 웹 UI에 접속 가능한지 확인
[ ] 기본 시크릿 엔진이 활성화되어 있는지 확인
[ ] Unseal 키와 Root 토큰이 안전하게 백업되어 있는지 확인
[ ] 감사 로깅이 활성화되어 있는지 확인
보안 강화 권장사항
TLS 활성화: 프로덕션 환경에서는 반드시 TLS를 구성하여 통신을 암호화해야 합니다.
AWS KMS 통합: AWS KMS를 사용하여 자동 언씰 설정을 고려하세요.
IAM 인증: AWS IAM 인증을 활성화하여 AWS 리소스에 대한 접근을 관리하세요.
자동 백업: Vault 데이터 디렉토리에 대한 정기적인 백업을 구성하세요.
모니터링: Vault 상태 및 성능 모니터링 시스템을 구축하세요.