vault 사용해보기

00_8_3·2022년 9월 28일
0

vault

목록 보기
1/3

작성

개요

Credentials를 .env 또는 config.json과 같은 파일 형태로 관리하다 보니
보안상의 이슈가 생기지 않을까 하여 생각이 들었고
여러 서비스 중 대표적으로 VaultAWS KMS를 알게되었는데

AWS 서비스의 경우 비용 지출, AWS에 종속적 인 문제가 생길 수 있다 판단하여
Vault를 선택하였습니다.

Vault의 경우 로컬 환경에 구축가능.

설치 (dev)

사전 필요 사항

  • Docker 또는 Docker compose
$ docker pull vault
$ docker run --cap-add=IPC_LOCK -d  -e 'VAULT_DEV_ROOT_TOKEN_ID=qwer1234'  -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200'  -p 8200:8200  --name=dev-vault vault
  • IPC_LOCK : 이 옵션은 vault의 메모리가 디스크로 스왑되는 것을 막습니다. (mlock syscall 사용)
    vault 메모리가 암호화되지 않은 디스크로 교체하는 것을 방지하기 위해 발성화 해야합니다.

  • -dev : vault 테스트 서버로 구동하는 옵션. 모든 데이터는 in-memory에 저장됨.

  • VAULT_DEV_ROOT_TOKEN_ID : 생략가능. root password 설정.

  • VAULT_DEV_LISTEN_ADDRESS : vault server에 접근할 수 있는 ip 대역 설정.

실행

$ docker exec -it vault sh
$ export VAULT_ADDR='http://127.0.0.1:8200'
$ export VAULT_TOKEN="qwer1234"

secrets 생성

// kv 타입으로 'test' 경로 생성.
vault secrets enable -path="test" -description="test dev vault server" kv
vault secrets list

secret key value 생성

생성

// 'test' 경로에 'keypair' 생성 후 id와 password를 저장.
$ vault kv put test/keypair id=dohan password=1234

확인

// 'test/keypair' 전체 목록
vault kv get test/keypair

// 'test/keypair'의 특정 필드.
vault kv get -field=id test/keypair
vault kv get -field=password test/keypair

production 실행.

위의 dev 모드로 실행하는 경우 vault 서버가 꺼지면 in-memory로 인해 모두 사라진다.
따라서 docker의 볼륨에 mount하여 재실행 되어도 사라지지 않게 해야합니다.

폴더구조
아래 volumes 디렉토리를 container에 마운트 합니다.

| ___ docker-compose.yaml
| ___ volumes
        | ___ config
        |	    |__ vault.json
        | ___ file
        | ___ logs

vault.json

{
	"backend": {
    	"file": {
        	"path": "/vault/file"
        }
    },
  "listener": {
  	"tcp": {
    	"address": "0.0.0.0:8200",
      	"tls_disable":1
    }
  },
  "ui": true
}
  • file/path : vault data 저장 경로.
  • listener : vault server 접근 가능 ip 대역 설정.

docker compose 작성

version :"2"
services:
	vault:
    	image: vault
        container_name: vault
        ports:
        	- "8200:8200"
        restart: always
        volumes:
        	- ./volumes/logs:/vault/logs
            - ./volumes/file:/vault/file
            - ./volumes/config:/vault/config
        cap_add:
        	- IPC_LOCK
        entrypoint: vault server -config=/vault/config/vault.json
  • 실행
$ docker-compose up -d
$ docker exec -it vault sh
$ export VAULT_ADDR="http://127.0.0.1:8200"
  • 주의 사항
    PC를 재실행 하거나 Docker-Desktop을 재실행 하는 경우
    VAULT_ADDR 환경변수가 초기화 되어 vault cli에서
    Error initializing: Put "https://127.0.0.1:8200/v1/sys/init": http: server gave HTTP response to HTTPS client
    오류 발생을 하면 다시 환경변수를 설정하시기 바랍니다.

vault 서버 상태확인

$ vault status -format=json

sealed: true : 사용하기 위해서는 false로 풀어야합니다.

vault 초기화

-dev 모드와는 다르게 prod에서 사용하기 위해서는 초기화가 필요합니다.

$ vault operator init -key-shares=6 -key-threshold=3

unseal key 6개와 root token 1개 생성.

  • -key-sahres : 생성 할 unseal key 개수 지정.
  • -key-threshold : unseal을 위한 unseal key 입력 회수 지정.

vault unseal 하기

$ vault operator unseal
$ <unseal key 1>
$ <unseal key 2>
$ <unseal key 3>
  1. vault operator unseal

  2. 첫 번째 unseal

  1. 3개 다 unseal
  1. server status

login

$ vault login <token>

token 자리에 root token을 넣어주면 됩니다.

secrete 생성 및 key value 생성

위 dev 모드 참고.

0개의 댓글