Vault 자습서

우리말로 볼트라고 읽습니다.
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
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 서버 내부에서 사용할 수 있을 것 같습니다.