Vault는 HashiCorp에 의해서 개발된 크로스플랫폼 패스워드 및 인증 관리 시스템으로
공개되면 안되는 비밀번호, API 키, 토큰 등 민감한 데이터를 UI,CLI,HTTP API를 활용할때 안전하게 저장하고 제어할수 있게 해주는 오픈소스 입니다.
1. Vault 다운로드
자신의 작업 환경에 맞춰 Vault를 다운로드 받습니다.
아래는 Windows 기준으로 진행합니다.
https://www.vaultproject.io/downloads
C:드라이브에 “vault” 이름으로 새 폴더를 생성합니다.
다운로드한 파일(vault_1.7.1_windows_amd64)을 새로 생성한 “vault” 폴더에 압축을 풀어줍니다.
CMD 명령프롬프트 또는 PowerShell을 열어 설치된 디렉토리로 이동 후 vault 버전을 확인합니다.
C:\vault> vault -version
Vault v1.7.1 (917142287996a005cb1ed9d96d00d06a0590e44e)
2. DEV 서버 시작
개발 서버는 안전하지는 않지만 로컬에서 Vault를 사용하는 데 유용한 서버입니다.
CMD 명령프롬프트를 이용해 Vault 개발 서버를 시작해 보겠습니다.
C:\vault> vault server -dev
==> Vault server configuration:
Api Address: http://127.0.0.1:8200
Cgo: disabled
Cluster Address: https://127.0.0.1:8201
Go Version: go1.15.11
Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
Log Level: info
Mlock: supported: false, enabled: false
Recovery Mode: false
Storage: inmem
Version: Vault v1.7.1
Version Sha: 917142287996a005cb1ed9d96d00d06a0590e44e
==> Vault server started! Log data will stream in below:
경고! 개발 모드가 활성화되었습니다!
이 모드에서 Vault는 완전히 메모리 내에서 실행되고 단일 개봉 키로 개봉 시작됩니다.
루트 토큰은 이미 CLI에 인증되므로 즉시 Vault 사용을 시작할 수 있습니다.
다음 환경 변수를 설정해야 할 수 있습니다.
PowerShell:
$env:VAULT_ADDR="http://127.0.0.1:8200"
cmd.exe:
set VAULT_ADDR=http://127.0.0.1:8200
Vault를 봉인 / 봉인 해제하거나 재 인증하려는 경우 봉인 해제 키와 루트 토큰이 아래에 표시됩니다.
Unseal Key: rALYthKjJdbrgfYv3X8DnyKBrKFAPR9c0KAuMvWMG/8=
Root Token: s.Fpm4EvxFbJaE6g0tst2IMbri
프로덕션 설치에서는 개발 모드를 사용하면 안됩니다!
위와 유사한 출력이 표시되어야합니다.
개발 서버는 모든 데이터를 메모리에 저장하고(하지만 여전히 암호화 됨) localhost TLS없이 수신 하며 자동으로 봉인 해제 키와 루트 액세스 키를 보여줍니다.
[ Root Token ] : vault web ui 에 로그인하기 위해서 필요하다. vault login 명령을 수행하기 위해서도 필요하다.
[ Unseal Key ] : vault 서버를 unseal 상태로 만들기 위한 key. 밑에서 설명
3. 환경변수 설정
새로운 CMD명령프롬프트를 열어 아래와 같이 환경 변수를 설정 합니다.
위에 서버 실행시 출력된 값을 바탕으로 아래 토큰값을 바꾸어 입력하시면 됩니다.
C:\vault> set VAULT_ADDR=http://127.0.0.1:8200
=> Vault 클라이언트가 dev 서버와 통신하도록 구성
C:\vault> set VAULT_TOKEN="s.Fpm4EvxFbJaE6g0tst2IMbri"
=> Vault와 상호 작용하려면 유효한 토큰을 제공해야합니다.
이 환경 변수 설정은 CLI를 통해 Vault에 토큰을 제공하는 방법입니다
개발서버 상태를 확인합니다.
아래와 동일한 출력이 표시되면 성공적으로 개발서버가 실행된것입니다.
C:\vault> vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.7.1
Storage Type inmem
Cluster Name vault-cluster-6391576b
Cluster ID 19a92265-b0ca-af72-3aa4-308e77e5db11
HA Enabled false
Sealed 가 false 입니다. 이 상태에서는 데이터를 쓰고 읽을 수 있음을 의미합니다.
vault 서버에 로그인
C:\vault> vault login s.Fpm4EvxFbJaE6g0tst2IMbri
Success! 이제 인증되었습니다. 아래에 표시된 토큰 정보는 이미 토큰 도우미에 저장되어 있습니다.
"vault login"을 다시 실행할 필요가 없습니다. 향후 Vault 요청은이 토큰을 자동으로 사용합니다.
Key Value
--- -----
token s.Fpm4EvxFbJaE6g0tst2IMbri
token_accessor 7sY8G3ky2wimQeDebf4u7nVj
token_duration ∞
token_renewable false
token_policies ["root"]
identity_policies []
policies ["root"]
4. First Secret 생성
Vault의 핵심 기능 중 하나는 임의의 비밀을 안전하게 읽고 쓰는 기능입니다.
Vault에 기록 된 비밀은 암호화 된 다음 백엔드 저장소에 기록됩니다.
Vault 서버는 Seal/UnSeal 상태를 가집니다. Seal(봉인)은 봉인된 상태인데, 이 상태에서 Vault는 접근해야 하는 스토리지의 위치와 방법은 알고 있지만,
데이터를 해독 할 수 없습니다. 데이터를 해독하기 위해서는 UnSeal(봉인해제) 상태로 만들어서 마스터키를 구성해야 합니다.
UnSeal을 위해서는 Unseal Key가 필요합니다.
첫번째 비밀을 생성해 보겠습니다.
C:\vault> vault kv put secret/hello foo=world
Key Value
--- -----
created_time 2021-04-26T01:18:11.4444005Z
deletion_time n/a
destroyed false
version 1
C:\vault> vault kv get secret/hello
====== Metadata ======
Key Value
--- -----
created_time 2021-04-26T01:18:11.4444005Z
deletion_time n/a
destroyed false
version 1
===== Data =====
Key Value
--- -----
foo world
첫번째 비밀이 생성되었음을 확인할 수 있습니다.
그럼 vault를 seal(봉인)해 보겠습니다.
C:\vault> vault operator seal
Success! Vault is sealed.
C:\vault> vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 1
Threshold 1
Unseal Progress 0/1
Unseal Nonce n/a
Version 1.7.1
Storage Type inmem
HA Enabled false
C:\vault> vault kv get secret/hello
Error making API request.
URL: GET http://127.0.0.1:8200/v1/sys/internal/ui/mounts/secret/hello
Code: 503. Errors:
* error performing token check: Vault is sealed
Seal 상태에서 값을 가져오면 위에 보이는 것처럼 에러가 발생하며,
unseal 명령을 이용해서 Unseal 상태로 만들 수 있다. 이때 unseal key가 필요하다.
현재 vault 는 dev 상태라서 단지 하나의 키만 입력하면 된다. vault status 를 보면 Total Shares 1, Threshold 1 인 것을 확인 할 수 있다.
C:\vault> vault operator unseal rALYthKjJdbrgfYv3X8DnyKBrKFAPR9c0KAuMvWMG/8=
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.7.1
Storage Type inmem
Cluster Name vault-cluster-088a0ffd
Cluster ID 14c4fa47-10d2-e17c-624b-669638240375
HA Enabled false
정상적으로 unseal 되었습니다.
Vault는 데이터를 암호화해서 저장한다. 암호화한 데이터를 복호화 하기 위해서는 Encryption Key가 필요하다.
이 encryption key는 데이터와 함께 저장이 되는데, 이 키는 마스터키라고 하는 다른 키로 암호화가 된다. 마스터키는 누구에게도 노출되지 않는다.
따라서 데이터를 복호화 하기 위해서는 vault에서 마스터키를 가져와서 encryption key를 복호화해야만 한다.
Unseal이 이 마스터키를 재구성하는 과정이다.
Vault는 마스터키를 단일키로 배포하는 대신에 Shamir’s Secret Sharing 이라는 알고리즘을 사용해서 키를 샤드로 분할 한다.
마스터키를 재구성하기 위해서는 특정 임계값의 샤드가 필요하다. 이렇게 하는 이유는 ? “마스터키를 안전하게 보관”하기 위함이다.
마지막으로, 생성한 Secret은 다음과 같이 삭제 합니다.
C:\vault> vault kv delete secret/hello
Success! Data deleted (if it existed) at: secret/hello
5. Secret Engine 생성
Secret Engine은 데이터를 저장, 생성, 암호화하는 구성요소로 “kv(key/value) secret engine”과 같은 간단한 엔진은 쿼리할 때 단순하게 key&value 형식으로 데이터를 저장하고 읽을 수 있습니다. 다른 시크릿 엔진은 서비스에 연결하고 요청을 하는 시점에서 동적으로 자격증명을 생성 할 수도 있습니다.
C:\vault> vault secrets enable kv
Success! Enabled the kv secrets engine at: kv/
엔진이 잘 생성되었는지 확인합니다.
C:\vault> vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_509188a6 per-token private secret storage
identity/ identity identity_47ffe369 identity store
kv/ kv kv_dd6c244f n/a
secret/ kv kv_fe87c938 key/value secret storage
sys/ system system_5dc32c19 system endpoints used for control, policy and debugging
생성된 엔진에 비밀을 생성해 봅니다.
C:\vault> vault kv put kv/hello target=world
Success! Data written to: kv/hello
C:\vault> vault kv list kv/
Keys
----
hello
C:\vault> vault kv get kv/hello
===== Data =====
Key Value
--- -----
target world
비밀이 잘 생성되었습니다.
이제 비밀 엔진을 비활성화 해 보겠습니다.
C:\vault> vault secrets disable kv/
Success! Disabled the secrets engine (if it existed) at: kv/