HashiCorp Vault の基本操作を INTERACTIV TUTORIAL で学習する

# はじめに
HashiCorpの[Vault](https://www.vaultproject.io/)について興味を持ち、チュートリアル([INTERACTIV TUTORIAL](https://www.vaultproject.io/#/demo/0))を実施ましたので、基本操作についてまとめておきます。

# Hashi Corp Vault とは？
機密情報を管理するツール

# 基本用語

## seal
- 機密情報が読み書き出来ない状態

## unseal
- 機密情報が読み書きできる状態
- `seal`状態から`unseal` 状態にするためには`Key`が必要
- 複数の`key`を払い出しておき、`unseal`に必要な`key`の数を設定することもできる

# INTERACTIV TUTORIALとは
[INTERACTIV TUTORIAL](https://www.vaultproject.io/#/demo/0)はブラウザ上でVaultの基本的な操作を学べるチュートリアルです。
解説は英語ですが、事前にVaultの概要を知っていれば太字になっているコマンドを実行するだけで基本的な操作は理解できると思います。

## INTERACTIV TUTORIALの内容

- Initializing and unsealing your Vault（初期化、seal状態からunseal状態にする）
- Authorizing your requests to Vault（認証する）
- Reading and writing secrets（機密情報を読み書きする）
- Sealing your Vault（unseal状態からseal状態に戻す）

補足：
チュートリアルでは以下のコマンドを実行することで解説を進めたり、戻したりできます

next : 次の解説に進む
previous : 前の解説に戻る


# Initializing and unsealing your Vault

## 初期化

`vault init`コマンドでVaultを初期化すると`key`と`token`が払い出されます。

以下のコマンドで初期化するとkeyが1つ払い出され、unsealに必要なkeyの数も1つになります。

```shell-session
$ vault init -key-shares=1 -key-threshold=1

Key 1: 07f2d4a0a494e771efe9e3a4b9e7c81b13a59dd6aaff4e3fa07cd5e41ea2e147
Initial Root Token: eddc04cc-fc0f-cac2-09b9-d29c64dcb44b
```

オプションで指定する数字を変更することで払い出すkeyの数やunselaに必要なkeyの数を変更できます。
例えば、keyを5つ払い出し、unsealに必要なkeyの数を3つとする場合は、以下のコマンドになります。

```shell-session
$ vault init -key-shares=5 -key-threshold=3
```

## 補足
初期化直後はVaultがseal状態なので認証やデータの読み書きは実施できません。


```shell-session
$ vault auth <root token>

Error validating token: Error making API request.

URL: GET http://127.0.0.1:47143/v1/auth/token/lookup-self
Code: 503. Errors:

* Vault is sealed

```

## unseal

`vault unseal`コマンドでVaultをunseal状態にします。

引数には初期化時に払い出させた`Key`を入力します。
unseal状態(`Sealed: false`)になると機密情報にアクセスできるようになります。

```shell-session
$ vault unseal <key>

Sealed: false
Key Shares: 1
Key Threshold: 1
Unseal Progress: 0
```

## 補足
unsealに必要なkeyの数を複数に指定していた場合、1つのkeyを入力するだけではunseal状態(`Sealed: false`)になりません。

```shell-session
$ vault unseal <key>

Sealed: true
Key Shares: 5
Key Threshold: 3
Unseal Progress: 1
```

必要な数のkeyが入力されるとunseal状態(`Sealed: false`)になります。

```shell-session
$ vault unseal <key>

Sealed: false
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0
```


# Authorizing your requests to Vault

## 認証

`vault auth`コマンドで認証を行います。

Vaultがunseal状態になっても機密情報を読み書きするためにはtokenでの認証が必要になります。
チュートリアルでは初期化時に払い出された`root token`を利用して認証します。

```shell-session
$ vault auth <root token>

Successfully authenticated!
token: eddc04cc-fc0f-cac2-09b9-d29c64dcb44b
token_duration: 0
token_policies: [root]
```

# Reading and writing secrets

## 機密情報の書き込み

`vault write`コマンドで機密情報の書き込みを行います。

```shell-session
$ vault write secret/hello value=world

Success! Data written to: secret/hello
```

## 機密情報の読み込み

`vault read`コマンドで機密情報の読み込みを行います。

```shell-session
$ vault read secret/hello

Key           	Value
lease_duration	2592000
value         	world
```

## 補足

複数の項目を書き込むこともできます。

```shell-session
$ vault write secret/test value1=aaa value2=bbb value3=ccc

Success! Data written to: secret/test

$ vault read secret/test

Key           	Value
lease_duration	2592000
value1        	aaa
value2        	bbb
value3        	ccc
```

# Sealing your Vault

## seal

`vault seal`コマンドでVaultをseal状態にします。
seal状態にすることで認証や機密情報の読み書きが行えなくなります。

```shell-session
$ vault seal

Vault is now sealed.
```

```shell-session
$ vault read secret/hello

Error reading secret/hello: Error making API request.

URL: GET http://127.0.0.1:47143/v1/secret/hello
Code: 503. Errors:

* Vault is sealed
```

## 補足
unsealに必要なkeyの数を複数に指定した場合でも`vault seal`コマンドが1回実行されればseal状態になります。

# 基本コマンド

```shell-session
# 初期化
$ vault init -key-shares=1 -key-threshold=1

# unseal
$ vault unseal <key>

# seal
$ vault seal

# 認証
$ vault auth <token>

# 機密情報の読み込み
$ vault read secret/hello

# 機密情報の書き込み
$ vault write secret/hello value=world
```