Vault by HashiCorp

eeeclipse·2020년 8월 6일
1

Vault-by-HashiCorp

목록 보기
1/1
post-thumbnail

이 문서는 HashiCorp사의 Vault 를 서비스에 적용하면서 정리한 Vault Tutorial 및 개인의견을 담고 있습니다.

Introduction

Vault는 인증정보나 비밀정보 즉, 비밀번호, API 키, 토큰 등을 저장하고 관리하는 도구입니다.

회사 규모를 막론하고 개발을 하게되면 다양한 종류의 비밀 정보를 사용하게 됩니다. 이 때의 비밀정보는 서비스, 애플리케이션에서 사용해야하지만 외부에 노출되면 안되는 정보들을 의미합니다. 데이터베이스 계정이나 API 토큰, SSH 키 등이 있겠지요.

과거 경험상 클라우드 환경의 경우에는 AWS와 GCP를 사용해보았지만 대부분의 토큰은 개발자 로컬 PC에 보관되고, 개발자 이메일계정이나 마케팅 이메일계정 등은 구글 스프레드시트에서 관리되곤 했습니다.

이러한 비밀정보의 경우, 누군가 퇴사를 하게되거나, 접근 제어를 하지 않는다면 외부로 유출되기 쉽습니다. 마케팅이나 경영지원 외에 개발에 관련한 이슈만 논의해본다고 하더라도, 사실 이렇게 관리하는 것이 큰 문제가 되지는 않습니다. 하드코딩되어 있다면 변경할때 업데이트하면 되긴 하지만 소스코드는 관리가 참 어렵죠. 실수로 소스저장소에 업로드하는 경우를 제외하고서라도, 개개인의 PC 까지 제어할 수는 없기때문에, 비밀정보에 대한 관리 필요성이 점점 더 대두되고 있습니다.

프로젝트가 간단하다면 상관없겠지만 프로젝트의 수, 그리고 참여하는 사람들의 수가 많아진다면 이를 잘 관리할 방법이 필요합니다.

Vault의 아이디어는 Vault에 이 정보를 저장해 놓고 애플리케이션이나 서버에서는 가져다가 사용하겠다는 것입니다. 현재 프로젝트를 진행하고 있는 상황에서도 다양한 사람들과 다양한 외부인터페이스, 그리고 수많은 인스턴스와 접속정보가 산재되어있는 것을 보면서...특히 개발자들이 root 계정으로 클라우드에 접근하여 작업을 하는 것을 보면서 더더욱 비밀정보 관리서비스가 필요함을 느끼게 되었습니다.

Installation

다운로드 사이트에서 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

Server Config

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 서버가 시작되면 다음을 실행해봅니다

  1. 새로운 터미널을 엽니다
  2. export VAULT_ADDR ... 부분을 복사하여 실행합니다. 이 과정을 통해 Vault 클라이언트는 dev 서버와 통신을 할 수 있는 환경이 구성됩니다. Vault CLI는 어떤 Vault 서버에 리퀘스트를 보낼지 VAULT_ADDR 환경변수를 통해서 결정합니다.
  3. unseal key를 어딘가에 저장해둡니다.
  4. VAULT_TOKEN 환경변수를 설정합니다. 이 변수는 Root Token을 생성하고, 터미널 아웃풋으로 보여줍니다.
    $ 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

Your First Secret : 데이터 입력과 출력

서버가 올라갔으니, 이제 비밀스러운 정보들을 입력하고 읽어봅시다.

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

Reference

vaultproject
hashicorp Vault 시작 (tutorial)
aws-vault로 AWS의 인증 정보 안전하게 사용하기

profile
mathematician, researcher, Data Scientist ⊗ Engineer ⊗ Architect, DBA

0개의 댓글