Credentials를 .env
또는 config.json
과 같은 파일 형태로 관리하다 보니
보안상의 이슈가 생기지 않을까 하여 생각이 들었고
여러 서비스 중 대표적으로 Vault
와 AWS KMS
를 알게되었는데
AWS 서비스의 경우 비용 지출
, AWS에 종속적
인 문제가 생길 수 있다 판단하여
Vault를 선택하였습니다.
Vault의 경우 로컬 환경에 구축가능.
사전 필요 사항
$ 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"
// kv 타입으로 'test' 경로 생성.
vault secrets enable -path="test" -description="test dev vault server" kv
vault secrets list
생성
// '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
위의 dev 모드로 실행하는 경우 vault 서버가 꺼지면 in-memory
로 인해 모두 사라진다.
따라서 docker의 볼륨에 mount하여 재실행 되어도 사라지지 않게 해야합니다.
폴더구조
아래 volumes
디렉토리를 container에 마운트 합니다.
| ___ docker-compose.yaml
| ___ volumes
| ___ config
| |__ vault.json
| ___ file
| ___ logs
{
"backend": {
"file": {
"path": "/vault/file"
}
},
"listener": {
"tcp": {
"address": "0.0.0.0:8200",
"tls_disable":1
}
},
"ui": true
}
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 status -format=json
sealed: true
: 사용하기 위해서는 false로 풀어야합니다.
-dev 모드와는 다르게 prod에서 사용하기 위해서는 초기화가 필요합니다.
$ vault operator init -key-shares=6 -key-threshold=3
unseal key 6개와 root token 1개 생성.
$ vault operator unseal
$ <unseal key 1>
$ <unseal key 2>
$ <unseal key 3>
vault operator unseal
첫 번째 unseal
$ vault login <token>
token
자리에 root token을 넣어주면 됩니다.
위 dev 모드 참고.