Vault 자습서

이 글은 https://www.vaultproject.io/intro/getting-started/install.html 페이지를 보며 쭉 따라한 흔적입니다.

우리말로 볼트라고 읽습니다.

1. Vault 소개

보안 쪽에서 늘 하는 이야기 가운데 빠지지 않는 항목은
  • 암호화 복호화 하는 열쇠(키)는 반드시 외부에 있어야 한다.
    (이 글에서는 비대칭 공개키/개인키 부분은 생략합니다)
  • 사용자가 입력한 암호를 뭉겔(digest) 때 사용하는 소금(salt)도 외부에 있어야 한다.
입니다.

이 때, 그 '외부'의 의미로 사용할 수 있는 꽤 괜찮은 서버가 https://www.vaultproject.io 홈페이지에서 제공하는 Vault 입니다.  이 소프트웨어의 사용권은 MPL입니다. 소스를 수정하지 않는다면, 편하게 쓸 수 있습니다. 

2. 서버 실행

2.1. Consul

Vault 서버에서 다루는 자료는 특별하게 지정하지 않는다면, 메모리 안에서만 처리됩니다. 즉 서버를 다시 시작하면, 기존 작업했던 모든 자료는 초기화됩니다.
그래서, 실행 중일때, 사용한 자료를 영구 보관하기 위해서 Vault에서는 또 다른 서버인 Consul 서버 쪽으로 보냅니다.

Consul 서버 이야기도 꽤 복잡한데, 이 글 범위에서 벗어나기에, 생략합니다.

그냥, 실행 파일 내려 받고(https://www.consul.io/downloads.html), 압축 풀고,

./consul agent -dev

현재 디렉터리에 있는 consul 프로그램은 에이전트 모드로 실행하는데, 그 환경은 개발환경으로 한다.

2.2. Vault 내려 받고, 압축 풀기

https://www.vaultproject.io/downloads.html

2.3. Vault 서버 환경 설정

환경 설정 파일인 config.hcl 파일을 편집합니다.

vi config.hcl

내용은
storage "consul" {
  address = "127.0.0.1:8500"
  path    = "vault/"
}

listener "tcp" {
 address     = "127.0.0.1:8200"
 tls_disable = 1
}

2.4. 서버 실행

./vault server -config=vault_config.hcl

제 작업 환경에서는 메모리 할당 문제가 있어, 반드시 root 권한으로 실행해야 하더군요.

2.5. 서버 초기화

vault 명령어는 서버로도 쓸 수 있고, 클라이언트로도 쓸 수 있습니다.
서버 초기화 작업은 클라이언트 작업으로
클라이언트 작업을 할 때는 그 서버가 어딘지를 환경 변수로 지정해야 합니다.

export VAULT_ADDR='http://127.0.0.1:8200'

위 서버 실행 방법으로 처음 실행하게 되면, 이 서버는 누구도 사용하지 못하도록 봉인(sealed) 되어있습니다.

이 봉인을 푸는 작업이 바로 서버 초기화입니다.

vault operator init

이렇게 명령을 실행하면,

Unseal Key 1: ljP5XPLv4j6A48SEwyf+xrg5m3F29AXpyXiK8YfYals7
Unseal Key 2: 3mI1uQbkWZ2KbSaTZNKjO6KasATqNG4jnLqCNDN73Led
Unseal Key 3: 3TQlxhVB2erY3EIrHYlq0IwBZazSii1i+oXwfb+nEFe1
Unseal Key 4: vuxxQiW5M0aeB2qgurp1vBScxdewlKjcyyxiFgoiNauv
Unseal Key 5: /Cp1Utrfs/iduukW8YlNj6wASrB8F/9CA7HJaPvWW/uM

Initial Root Token: 7b668cd1-600e-3440-b648-440d95a146d4
.....

이렇게 결과가 나옵니다.

봉인을 풀려면, 여기서 보여준 봉인을 푸는 열쇠 세 개(기본값)로 각각 작업을 해야 합니다. 다음 명령입니다.

vault operator unseal

이 명령이 실행되면, 봉인을 풀 열쇠를 입력하라고 나옵니다.  그럼 위에 있는 것 가운데 하나를 입력합니다.

그럼, 봉인 푸는 과정이 1/3, 2/3 이런식으로 보입니다.

세 번 작업을 반복하면, 드디어 봉인이 풀려 서버 역할을 합니다.

아주 재미난 발상이지요? (마치 옛날 putty 개인키 만들 때, 마우스를 마구 움직였던 것 처럼)

2.5. 서버 로그인

이제 이 서버를 사용하기 위해서는 로그인을 제일 먼저 해야 합니다.
로그인 작업 없이, 그냥 사용하면, '접근 권한 없음' 오류 메시지를 보입니다.
로그인 하는 방법은

vault login 7b668cd1-600e-3440-b648-440d95a146d4

login 뒤에 있는 값은 초기화 할때 보여준 root 토큰입니다.

2.6. 사용하기

아주 많은 이야기가 있는데, 여기서는 간단하게,
암/복호화에서 사용할 키를 구하는 것만 하겠습니다.

vault 서버에 어떤 키를 등록하는 명령은

vault kv put secret/hello foo=world

그 키값을 구하는 명령은

vault kv get -format=json secret/hello

이러면, foo=world 라는 자료가 보일 것입니다.

3. 마무리

아주 간략하게 정리했습니다.
위에서 소개한 문서를 차근하게 읽어가면서 개념과 사용법을 익히면 잘 쓸 수 있겠죠.

각 프로그래밍 언어별 Vault API들은 대부분 있습니다.

아직까지 Vault 서버를 이용해서 PostgreSQL 서버 측에서 Vault와 통신하는 확장 모듈은 없더군요.

이것을 만들면, 열쇠 관리(key managing)를 외부에서 하고, 그 열쇠를 PostgreSQL 서버 내부에서 사용할 수 있을 것 같습니다.