이 문서는 HashiCorp사의 Vault 를 서비스에 적용하면서 정리한 Vault Tutorial 및 개인의견을 담고 있습니다.
Vault는 인증정보나 비밀정보 즉, 비밀번호, API 키, 토큰 등을 저장하고 관리하는 도구입니다.
회사 규모를 막론하고 개발을 하게되면 다양한 종류의 비밀 정보를 사용하게 됩니다. 이 때의 비밀정보는 서비스, 애플리케이션에서 사용해야하지만 외부에 노출되면 안되는 정보들을 의미합니다. 데이터베이스 계정이나 API 토큰, SSH 키 등이 있겠지요.
과거 경험상 클라우드 환경의 경우에는 AWS와 GCP를 사용해보았지만 대부분의 토큰은 개발자 로컬 PC에 보관되고, 개발자 이메일계정이나 마케팅 이메일계정 등은 구글 스프레드시트에서 관리되곤 했습니다.
이러한 비밀정보의 경우, 누군가 퇴사를 하게되거나, 접근 제어를 하지 않는다면 외부로 유출되기 쉽습니다. 마케팅이나 경영지원 외에 개발에 관련한 이슈만 논의해본다고 하더라도, 사실 이렇게 관리하는 것이 큰 문제가 되지는 않습니다. 하드코딩되어 있다면 변경할때 업데이트하면 되긴 하지만 소스코드는 관리가 참 어렵죠. 실수로 소스저장소에 업로드하는 경우를 제외하고서라도, 개개인의 PC 까지 제어할 수는 없기때문에, 비밀정보에 대한 관리 필요성이 점점 더 대두되고 있습니다.
프로젝트가 간단하다면 상관없겠지만 프로젝트의 수, 그리고 참여하는 사람들의 수가 많아진다면 이를 잘 관리할 방법이 필요합니다.
Vault의 아이디어는 Vault에 이 정보를 저장해 놓고 애플리케이션이나 서버에서는 가져다가 사용하겠다는 것입니다. 현재 프로젝트를 진행하고 있는 상황에서도 다양한 사람들과 다양한 외부인터페이스, 그리고 수많은 인스턴스와 접속정보가 산재되어있는 것을 보면서...특히 개발자들이 root 계정으로 클라우드에 접근하여 작업을 하는 것을 보면서 더더욱 비밀정보 관리서비스가 필요함을 느끼게 되었습니다.
다운로드 사이트에서 OS에 맞는 파일을 다운로드받고 압축을 풀어서 경로에 넣어주면 설치가 끝! 2020년 8월 현재 최신 버전은 Vault v1.5.0입니다.
# Use yum-config-manager to add the official HashiCorp Linux repository.
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
$ sudo yum -y install vault
Installed:
vault-1.5.0-2.x86_64
Complete!
[root@vault# vault --version
Vault v1.5.0
Commands
$ vault
Usage: vault <command> [args]
Common commands:
read Read data and retrieves secrets
write Write data, configuration, and secrets
delete Delete secrets and configuration
list List data or secrets
login Authenticate locally
server Start a Vault server
status Print seal and HA status
unwrap Unwrap a wrapped secret
Other commands:
audit Interact with audit devices
auth Interact with auth methods
lease Interact with leases
operator Perform operator-specific tasks
path-help Retrieve API help for paths
policy Interact with policies
secrets Interact with secrets engines
ssh Initiate an SSH session
token Interact with tokens
Vault가 설치되었으니 서버를 시작해봅시다.
먼저 Dev 서버를 만들텐데요, dev 서버는 빌트인형식이고, 설치와 함께 구성이 되어있습니다. 엄중한 보안을 필요로 하진 않지만 로컬에서 매우 유용하게 활용할 수 있는 정보를 제공합니다. Deploy Vault guide에서 dev 서버가 아닌 환경에서의 서버 구성에 대해서 알아보도록 합시다 .
Vault Dev 서버를 시작하려면 다음의 명령어를 입력합니다.
$ vault server -dev
==> Vault server configuration:
Api Address: http://127.0.0.1:8200
Cgo: disabled
Cluster Address: https://127.0.0.1:8201
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.4.1
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.
You may need to set the following environment variable:
$ export VAULT_ADDR='http://127.0.0.1:8200'
The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.
Unseal Key: 1+yv+v5mz+aSCK67X6slL3ECxb4UDL8ujWZU/ONBpn0=
Root Token: s.XmpNPoi9sRhYtdKHaQhkHP6x
Development mode should NOT be used in production installations!
==> Vault server started! Log data will stream in below:
여기서 중요한 부분은 Unseal Key, Root Token 입니다. dev 서버의 경우에는 모든 데이터를 인메모리 형식으로 저장합니다(암호화는 되어있습니다!) localhost 에서 리슨하고 있으며, TLS 통신을 사용하지 않습니다.
dev 서버가 시작되면 다음을 실행해봅니다
$ export VAULT_TOKEN="s.XmpNPoi9sRhYtdKHaQhkHP6x"
Vault 와 통신하기위해서는 정상적인 토큰을 제공해야합니다. 환경변수를 설정하는 것은 CLI를 통해 Vault 에게 적절한 토큰을 제공하는 것입니다. 추후, 인증 튜토리얼에서 vault login <token_value> 커맨드를 이용해서 Vault를 통한 인증이 진행되는 것을 알 수 있습니다.
서버가 돌아가고 있는지는 다음 명령어를 통해 확인할 수 있습니다 .
$ vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.5.0
Cluster Name vault-cluster-4d862b44
Cluster ID 92143a5a-0566-be89-f229-5a9f9c47fb1a
HA Enabled false
서버가 올라갔으니, 이제 비밀스러운 정보들을 입력하고 읽어봅시다.
Vault 의 중요한 기능 중 하나는 임의의 비밀들을 안전하게 읽고, 쓸 수 있다는 것입니다. Vault에 적힌 기밀들은 암호화되고, backend storage에 쓰여집니다. 따라서 backend storage mechanism은 암호화되지 않은 정보를 볼 수 없고, Vault 없이는 이를 복호화할 수도 없습니다 .
그러면 시작해봅시다.
우리는 여기서 vault를 이용한 CRUD를 해볼것입니다.
vault kv 커맨드를 입력해봅시다.
$ vault kv put secret/hello foo=world
Key Value
--- -----
created_time 2019-02-04T19:53:22.730733Z
deletion_time n/a
destroyed false
version 1
vault kv get 커맨드로 데이터를 받을 수 있습니다. Vault는 스토리지로부터 데이터를 받아 이를 복호화합니다. 아웃풋은 적절히 분리되며, awk 명령어를 이용할 수도 있습니다.
$ vault kv get secret/hello
====== Metadata ======
Key Value
--- -----
created_time 2019-02-04T19:54:03.250328Z
deletion_time n/a
destroyed false
version 2
===== Data =====
Key Value
--- -----
excited yes
foo world
더 구체적인 정보를 원한다면 -field=<key_name>
를 사용할 수도 있습니다.
$ vault kv get -field=excited secret/hello
yes
vaultproject
hashicorp Vault 시작 (tutorial)
aws-vault로 AWS의 인증 정보 안전하게 사용하기