+++
title = "VaultをIntegrated Storage (raft)でセットアップ"
date = 2021-06-28T13:49:43+09:00
description = "VaultをIntegrated Storage (raft)でセットアップしてみました。"
tags = ["Vault", "Linux"]
categories = ["インフラ", "HashiCorp"]
author = "kazu634"
images = ["ogp/2021-06-28-vault-with-raft-install-and-setup.webp"]
+++

Vaultをインストール・セットアップしてみたので、そのときのメモになります。

## 想定する環境
想定する環境を説明します。Vaultについては、`Integrated Storage (Raft)`を利用して、クラスターを構成します。

### ダイアグラム
3台のサーバでクラスターを構成してみます。

![Diagram](https://farm66.staticflickr.com/65535/51275717613_7dfe3a9d11_c.jpg)

### サーバのOS・CPUアーキテクチャーとか
`Ubuntu 20.04 LTS`にインストールします。

```bash
% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
```

```bash
% arch
x86_64
```

## インストール
`apt`リポジトリがあるので、そこからインストールします。公式解説ページは[こちら](https://learn.hashicorp.com/tutorials/vault/getting-started-install)。

### HashiCorp GPGキーの追加
以下のコマンドを実行して、GPGキーを追加します。

```bash
% curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

$ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
```

### インストール
各サーバー上で以下のコマンドを実行して、`Vault`のインストールを行います。

```bash
% sudo apt-get update && sudo apt-get install vault
```

### インストールすると導入されるもの
以下のものが導入されるようです:

- `vault`のバイナリー
- `systemd`設定ファイル
- `/opt/vault`ディレクトリが作成される
	- `/opt/vault/data`はデータ格納用を意図していると思われる
	- `/opt/vault/tls`はオレオレ証明書を作成して格納しているようです
- `/etc/vault.d`が作成される
	- `/etc/vault.d/vault.hcl`が標準の設定ファイルとしてデプロイされる

### 注意点
- `systemd`設定ファイルが導入されますが、自動起動はしません。自動起動させるには`sudo systemctl enable vault`を自分で実施する必要があります。

- オレオレ証明書の中身を確認する限り、バーチャルホスト名が「Vault」の時に有効な証明書を作っているようです。

```bash
% openssl x509 -text -noout -in /opt/vault/tls/tls.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 7e:28:fd:b0:56:83:69:a9:d0:08:8c:26:f5:18:60:1e:42:17:16:02
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O = HashiCorp, CN = Vault
        Validity
            Not Before: Jun  7 23:23:17 2021 GMT
            Not After : Jun  6 23:23:17 2024 GMT
        Subject: O = HashiCorp, CN = Vault
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
[…snip…]
```

## セットアップ
セットアップの手順を説明していきます。

### 設定ファイルの置換
各サーバ上の`/etc/vault.d/vault.hcl`を、以下の内容で上書きします。なお、下の例は`vault01`サーバの例です。適宜、IPアドレス・ホスト名など読み替えてください。

```
ui = true
disable_mlock = true

storage "raft" {
  path    = "/opt/vault/data"
  # ノード名はサーバごとに変わりますので置き換えてください
  node_id = "vault01"

 # 再接続先のIPアドレスもサーバごとに変わりますので置き換えてください
 retry_join {
    leader_api_addr = "http://192.168.10.143:8200"
  }

  retry_join {
    leader_api_addr = "http://192.168.10.144:8200"
  }
}

# ここも変わりますので置き換えてください。
api_addr = "http://192.168.10.142:8200"
cluster_addr = "http://192.168.10.142:8201"

# HTTPS listener
listener "tcp" {
  address       = "0.0.0.0:8200"
  cluster_address = "0.0.0.0:8201"

  # SSL通信は今回は使用しない
  tls_disable = true
  # tls_cert_file = "/opt/vault/tls/tls.crt"
  # tls_key_file  = "/opt/vault/tls/tls.key"
}
```

### Vault起動 (1台目)
どこでもいいので、以下のコマンドを実行し、どこかのサーバでVaultを起動します。

```bash
% sudo systemctl start vault
```

`vault`コマンドに接続先サーバを指示するため、`VAULT_ADDR`環境変数を指定します:

```bash
% export VAULT_ADDR=http://192.168.10.142:8200
```

後は通常通り、`vault operator init`コマンドを実行します。すると、リカバリーキーと`Initial Root Token`が発行されます。`vault operator unseal`コマンドでunsealします。

### Vault起動 (2台目以降)
それ以外のサーバーでは、`sudo systemctl start vault`を実行してから、`vault operator unseal`コマンドでunsealします。

### 動作確認
`vault status`コマンドを実行して、`storage Type`が`raft`、`HA Enabled`が`true`であることを確認します。

```bash
% vault status
Key                      Value
---                      -----
Recovery Seal Type       shamir
Initialized              true
Sealed                   false
Total Recovery Shares    5
Threshold                3
Version                  1.7.3
Storage Type             raft
Cluster Name             vault-cluster-e2a49833
Cluster ID               08252ea2-3816-419e-7f67-2d8929c438bb
HA Enabled               true
HA Cluster               https://192.168.10.144:8201
HA Mode                  active
Active Since             2021-06-26T15:14:28.755516837Z
Raft Committed Index     31294
Raft Applied Index       31294
```

`vault operator raft list-peers`コマンドを実行すると、適切にセットアップされていれば、どこかのサーバーが`leader`に、その他が`follower`として表示されます。

```
kazu634@vault01% vault operator raft list-peers
Node       Address                State       Voter
----       -------                -----       -----
vault01    192.168.10.142:8201    follower    true
vault02    192.168.10.143:8201    follower    true
vault03    192.168.10.144:8201    leader      true
```

`Integrated storage (raft)`を利用している際に、ノードの異常などを検知して、クラスターリーダーの変更などをする機能を`autopilot`と呼んでいます。この機能の状態を`vault operator raft autopilot state`コマンドで確認できます。`Healthy`が`true`であることを確認します。

```bash
kazu634@vault01% vault operator raft autopilot state
Healthy:                      true
Failure Tolerance:            1
Leader:                       vault03
Voters:
   vault03
   vault01
   vault02
Servers:
   vault01
      Name:            vault01
      Address:         192.168.10.142:8201
      Status:          voter
      Node Status:     alive
      Healthy:         true
      Last Contact:    3.880838102s
      Last Term:       10
      Last Index:      31293
   vault02
      Name:            vault02
      Address:         192.168.10.143:8201
      Status:          voter
      Node Status:     alive
      Healthy:         true
      Last Contact:    1.404623564s
      Last Term:       10
      Last Index:      31293
   vault03
      Name:            vault03
      Address:         192.168.10.144:8201
      Status:          leader
      Node Status:     alive
      Healthy:         true
      Last Contact:    0s
      Last Term:       10
      Last Index:      31293
```

## その他
その他のセットアップ関連です。

### 自動起動
`sudo systemctl enable vault`コマンドを実行します。