Hashicorp Vault 시작하기

By | 2022년 10월 14일
Table of Contents

Hashicorp Vault 시작하기

Vault 란?

Secret(비밀번호, 인증키 등) 을 관리하는 툴이다.

용어정리

Storage Backend

Secret 이 실제로 저장될 저장소를 말한다.
저장소는 File, Consul, 각종DB(MySQL 등), AWS S3 등이 될 수 있다.

Secret Backend

Secret 이 저장될 저장방식을 말한다.
여러가지 방식이 있는 듯 하지만 key-value 방식이 단순하고 편하다.

Auth Backend

Secret 을 받아오기 위한 인증방식을 말한다.

Token 한개를 이용해 인증하는 방식도 있고,

AppRole 같은 경우 roleId/secretId 를 이용해
임시 Token 을 요청하고 임시 Token 으로 Secret 을 받아오기도 한다.

LDAP 을 이용해 Token 을 받아오는 방식도 있다고 하는데 생략한다.

Vault 개발서버 구성하기

바이너리 다운받기

여기 에서 다운받는다.

압축을 풀면 vault.exe 가 나온다.(윈도우 기준)

실행하기

도스창을 열고 아래 명령을 실행하면 서비스가 실행된다.

vault server -dev

Root Token 은 말 그대로 root 권한을 제공하는 토큰이다.
운영서버에서는 Token Policy 와 AppRole, Secret 생성을 제외하고 사용하지 말아야 한다.

Unseal Key 는 운영용 활성화 토큰이다.
개발모드에서는 1개의 Unseal Key 만 생성하지만,
운영모드에서는 디폴트로 5개의 토큰이 생성되고,
그중 3개의 토큰이 모두 입력되어야 Valut 가 활성화 된다.

Unseal Key, Root Token 는 중요한 정보이니 별도로 저장해 두어야 한다.

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 variables:

PowerShell:
    $env:VAULT_ADDR="http://127.0.0.1:8200"
cmd.exe:
    set 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: KyTkxx1p3Uf4GXXXXXXXXXXXXXXXXXXXXXXXXX
Root Token: hvs.xOqwzjjXXXXXXXXXXXXX

Development mode should NOT be used in production installations!

Web UI

브라우저로 접속하는 것을 선호하면 http://localhost:8200/ 로 접속할 수 있다.

Root Token 을 이용해 로그인한다.

환경변수 설정

# windows
set VAULT_ADDR=http://127.0.0.1:8200
set VAULT_TOKEN=hvs.xOqwzjjXXXXXXXXXXXXX

# linux
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN="hvs.xOqwzjjXXXXXXXXXXXXX"

기본 사용법

Secret Engine 생성 및 조회

Secret Engine 은 저장소를 의미한다.
저장소는 Vault 자체를 저장소(file 로 저장됨)로 할수도 있고,
DB(MySQL, SqlServer 등) 또는 Consul, AWS S3 등을 저장소로 할수도 있다.

개발모드일 경우 메모리에 저장된다.
(서버 재시작시 데이타가 모두 사라진다.)

아래 명령으로 Secret Engine 목록을 조회할 수 있다.

vault secrets list

아래 명령으로 team1 이라는 key-value 방식의 Secret Engine 을 생성할 수 있다.

vault secrets enable -path=team1 kv

Secret 생성 및 조회

아래 명령을 실행하면 key-value 방식의 Secret 을 저장/조회하는 기본 설명이 나온다.

vault kv

team1 이라는 Secret Engine 에 foo 라는 key 로 bar=baz 라는 값을 저장한다.

# vault kv put -mount=team1 foo bar=baz
vault kv put team1/foo bar=baz

저장되어 있는 값을 아래 명령으로 조회할 수 있다.

vault kv list team1
vault kv get team1/foo

아래 명령으로 저장된 값을 삭제할 수 있다.

vault kv delete team1/foo

Token 생성 및 조회

아래 명령으로 Token 관련 명령을 조회할 수 있다.

Token 은 Secret 에 대한 권한(조회, 수정 등)을 설정할수 있다.
Token Policy 에 대해서는 아래에 별도로 설명한다.

vault token

아래 명령으로 토큰을 생성한다.

vault token create
Key                  Value
---                  -----
token                hvs.qTo16tGpUBsdXXXXXXXXXXXX
token_accessor       Y6YuNWXU6RHQXXXXXXXXXXXX
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

토큰을 갱신한다.
(위에서 생성한 토큰은 token_renewable false 이므로 아래 명령은 오류를 반환한다.)

vault token renew hvs.qTo16tGpUBsdXXXXXXXXXXXX

토큰 정보를 조회한다.

vault token lookup hvs.qTo16tGpUBsdXXXXXXXXXXXX

토큰을 삭제한다.

vault token revoke hvs.qTo16tGpUBsdXXXXXXXXXXXX

Token Policy

Token Policy 를 이용해 Token 의 Secret 에 대한 권한(조회, 수정 등)을 설정할수 있다.

vault policy list
vault policy read default

정책 파일을 생성한다.

type team1-policy.cfg
......
path "team1/*" {
  capabilities = ["create", "update"]
}

path "team1/foo" {
  capabilities = ["read"]
}
......

저장된 정책을 설정한 토큰을 생성한다.

vault policy write team1-policy team1-policy.cfg
vault policy list
vault token create -policy=team1-policy

위에서 생성한 토큰을 설정해 준다.

# windows
set VAULT_TOKEN=hvs.xOqwzjjXXXXXXXXXXXXX

# linux
export VAULT_TOKEN="hvs.xOqwzjjXXXXXXXXXXXXX"

권한이 부여되지 않은 액션은 오류를 반환한다.

# OK
vault kv get team1/foo
vault kv put team1/foo1 bar=baz
vault kv put team1/foo2 bar=baz

# ERROR
vault kv get team1/foo1

AppRole 생성 및 조회

지금까지는 루트 토큰을 이용해 모든 설정을 진행해 왔지만,
실서버에서는 루트 토큰을 사용해서는 안된다.

루트토큰을 대체하기 위해 사용되는 것이 AppRole 이다.

작동방식

  • (Vault 관리자는) Token Policy 와 AppRole 을 만듭니다.
  • (Vault 관리자는) RoleID 와 SecretID 를 발급하고 App 에 전달합니다.
  • (Vault 관리자는) Secret 을 만듭니다.
  • (App 은) 전달받은 RoleID 와 SecretID 를 이용해 Token 을 생성합니다.
  • (App 은) AppRole Token 으로 로그인하고 비밀정보를 가져와 사용합니다. (Token은 1분 후 만료)

AppRole 생성

AppRole 을 생성하기 위해 다시 루트 토큰으로 변경한다.

# windows
set VAULT_TOKEN=hvs.xOqwzjjXXXXXXXXXXXXX

# linux
export VAULT_TOKEN="hvs.xOqwzjjXXXXXXXXXXXXX"
vault auth list

approle/ 이라는 토큰이 없으면 생성해 준다.

vault auth enable approle
vault auth list
# windows
vault write auth/approle/role/team1-role ^
secret_id_ttl=10m ^
token_num_uses=10 ^
token_ttl=20m ^
token_max_ttl=30m ^
secret_id_num_uses=40 ^
token_policies=team1-policy

# linux
vault write auth/approle/role/team1-role \
secret_id_ttl=10m \
token_num_uses=10 \
token_ttl=20m \
token_max_ttl=30m \
secret_id_num_uses=40 \
token_policies=team1-policy
vault list auth/approle/role
vault read auth/approle/role/team1-role

# get id(role-id)
vault read auth/approle/role/team1-role/role-id
vault read -field=role_id auth/approle/role/team1-role/role-id

# get password(secret-id)
vault write -f -field=secret_id auth/approle/role/team1-role/secret-id
# windows
set ROLE_ID=7e4e506e-6790-eb79-eXXXXXXXXXXXXX
set SECRET_ID=4c77fb5c-7c11-d0e8-ff7XXXXXXXXXXX

# linux
export ROLE_ID="7e4e506e-6790-eb79-eXXXXXXXXXXXXX"
export SECRET_ID="4c77fb5c-7c11-d0e8-ff7XXXXXXXXXXX"

아래 명령으로 토큰이 생성되는 것을 확인할 수 있다.

# windows
vault write auth/approle/login role_id=%ROLE_ID% secret_id=%SECRET_ID%

# linux
vault write auth/approle/login role_id="$ROLE_ID" secret_id="$SECRET_ID"

답글 남기기