Docker로 Vault 로컬 구성

HashiCorp 에서 만든 Vault는 애플리케이션 외부 비밀 시크릿 속성을 외부에서 중앙으로 관리할 수 있는 서비스

Spring Boot 환경에서 Vault로 시크릿 정보를 읽고 쓰는 것이 가능. 이러한 중요한 정보는 코드에서 분리하여 보안의 안정성을 높이는 것이 주 목적임

Vault가 제공하는 기능으로는 동적 시크릿키, 중앙 집중 관리, 액세스 제어, 감사 기능이 있음

Vault 이미지 가져오기

docker pull hashicorp/vault:latest

Vault 이미지 실행

docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 hashicorp/vault:latest server

독특하게 끝부분에 CLI 명령어 전달로 server 를 입력하여 서버 모드로 실행시키는 명령어이다.

  • --cap-add 컨테이너 보안 capability 옵션으로 디스크 스왑하지 않고 메모리로 관리하도록 IPC_LOCK 옵션을 주었다.
  • -e 환경 변수로 VAULT_LOCAL_CONFIG 이름으로 전달하면 환경 변수 따라서 vault 주어진 옵션으로 실행된다.

Dockerfile 신규 작성으로 Vault 실행하기

본인은 윈도우 wsl 에서 실행하였는데 capability 허용을 해주지 않으므로 hashicorp의 이미지로 실행할 수 없었다.

unable to set CAP_SETFCAP effective capability: Operation not permitted

도커를 Dockerfile 과 vault.hcl 작성하여 빌드에 대해 알아보자.
먼저 파일을 작성해야한다.

Dockerfile

FROM alpine:3.20

# 필요한 패키지
RUN apk add --no-cache \
    ca-certificates \
    curl \
    unzip

# Vault 버전 (원하는 버전으로 변경 가능)
ENV VAULT_VERSION=2.0.0

# Vault 다운로드 및 설치
RUN curl -fsSL https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip -o vault.zip \
    && unzip vault.zip \
    && mv vault /usr/local/bin/ \
    && chmod +x /usr/local/bin/vault \
    && rm vault.zip

# Vault 데이터/설정 디렉토리
RUN mkdir -p /vault/data /vault/config

# 설정 파일 복사
COPY vault.hcl /vault/config/vault.hcl

# 환경 변수
ENV VAULT_DISABLE_MLOCK=true

# 포트
EXPOSE 8200

# 실행
ENTRYPOINT ["vault"]
CMD ["server", "-config=/vault/config/vault.hcl"]

vault.hcl

ui = true
default_lease_ttl = "876000h"
max_lease_ttl = "876000h"
log_level = "info"
api_addr = "http://vault.kiioio.org:8200"

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = 1
}

storage "file" {
  path = "/vault/data"
}

disable_mlock = true

이후 두 파일이 있는 디렉토리에서 터미널을 열고 빌드한다.

Dockerfile 빌드

docker build -t vault-alpine .
docker images -a

Docker - Vault 실행

docker volume create vault_home
docker run -d -it --name vault-server -p 8200:8200 -v vault_home:/vault/data vault-alpine