Amazon Linux 2023 で HashiCorp Vault Server を構築する

2023.04.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、 Amazon Linux 2023 に Vault をインストールして Vault サーバー として起動してみようと思います。

既に似たブログもありますが、約 5 年の時を経て、色々変わっていたため、改めて書いていきたいと思います。

HashiCorp Vault の前提知識は以下をご覧いただけますと幸いです。

HashiCorp Vault のインストール

パッケージマネージャーを利用して HashiCorp Vault のダウンロード、インストールを行なっていきます。

2018 年の記事では、バイナリ形式または gopath を利用したインストール方式で提供されていましたが、2023 年の現在ではとても便利になりました。

# HashiCorp レポジトリの追加
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo

# HashiCorp Vault のインストール
sudo dnf install -y vault

# HashiCorp Vault のバージョン確認
vault version
実行結果
sh-5.2$ sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
Adding repo from: https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sh-5.2$ sudo dnf install -y vault
Hashicorp Stable - x86_64                                                                                 6.5 MB/s | 1.0 MB     00:00
Last metadata expiration check: 0:00:01 ago on Sun Apr 16 01:39:04 2023.
Dependencies resolved.
==========================================================================================================================================
 Package                       Architecture                   Version                             Repository                         Size
==========================================================================================================================================
Installing:
 vault                         x86_64                         1.13.1-1                            hashicorp                          50 M

Transaction Summary
==========================================================================================================================================
Install  1 Package

Total download size: 50 M
Installed size: 172 M
Downloading Packages:
vault-1.13.1-1.x86_64.rpm                                                                                  33 MB/s |  50 MB     00:01
------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                      33 MB/s |  50 MB     00:01
Hashicorp Stable - x86_64                                                                                  77 kB/s | 3.9 kB     00:00
Importing GPG key 0xA621E701:
 Userid     : "HashiCorp Security (HashiCorp Package Signing) <security+packaging@hashicorp.com>"
 Fingerprint: 798A EC65 4E5C 1542 8C8E 42EE AA16 FCBC A621 E701
 From       : https://rpm.releases.hashicorp.com/gpg
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                  1/1
  Running scriptlet: vault-1.13.1-1.x86_64                                                                                            1/1
  Installing       : vault-1.13.1-1.x86_64                                                                                            1/1
  Running scriptlet: vault-1.13.1-1.x86_64                                                                                            1/1
Generating Vault TLS key and self-signed certificate...
......+.....+.+........+.+...+...+.........+.....+.+...............+..............+....+..+...+....+.....+.+...........+...+.+.....+......
...+.............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*......+............+.+..+++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++*.+.+.........+...............+.....+........................+.......+..+............+...+...+.......+..
.+...+......+.....+....+............+.........+.....+..............................+...+..........+..+................+.................+.
.....+.......+..+.+..............+......+.+..............+.......+..+...+............+.+............+.....+...+...........................
....+....................+.+..............+.+.......................+.+...+...+..+..........+...+........+.........+...+...+......+...+...
...+.+.....+................+...+..............+.......+...+...........+..........+......+........+......+....+...+............+..+......+
.........+.+...+......+........+...+............+.......+.........+.....+.+.....+...+.......+...+.....+...+.............+.........+..+....
....................+.+...+........+..................+.......+.....+...+............+...+......+....+.........+..+...+............+....+.
........+...+..+.......+....................+.+.........+...+..+.+........+.+...........+...+...................+......+..+..........+....
........+..+...+...............+............+...+..........+..+.............+..+....+..+.......+...........+.......+.....+....+...+......+
......+......+.....+.......+........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.......+..+...................+...+..+...+.+..+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.......+.....+.
+..+.......+..+.+........+.+.....+....+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+................+..
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
Vault TLS key and self-signed certificate have been generated in '/opt/vault/tls'.

  Verifying        : vault-1.13.1-1.x86_64                                                                                            1/1

Installed:
  vault-1.13.1-1.x86_64

Complete!
sh-5.2$ vault version
Vault v1.13.1 (4472e4a3fbcc984b7e3dc48f5a8283f3efe6f282), built 2023-03-23T12:51:35Z

設定ファイルの確認

パッケージマネージャーを利用して HashiCorp Vault をインストールした場合、 systemd の設定ファイルは /usr/lib/systemd/system/vault.service が利用されます。

また、デフォルトでは /etc/vault.d/vault.hcl が、 Vault Server の Config ファイルに利用されます。

sh-5.2$ cat /usr/lib/systemd/system/vault.service
[Unit]
Description="HashiCorp Vault - A tool for managing secrets"
Documentation=https://www.vaultproject.io/docs/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/vault.d/vault.hcl
StartLimitIntervalSec=60
StartLimitBurst=3

[Service]
Type=notify
EnvironmentFile=/etc/vault.d/vault.env
User=vault
Group=vault
ProtectSystem=full
ProtectHome=read-only
PrivateTmp=yes
PrivateDevices=yes
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
NoNewPrivileges=yes
ExecStart=/usr/bin/vault server -config=/etc/vault.d/vault.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
LimitNOFILE=65536
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target
/etc/vault.d/vault.hcl
# Full configuration options can be found at https://www.vaultproject.io/docs/configuration

ui = true

#mlock = true
#disable_mlock = true

storage "file" {
  path = "/opt/vault/data"
}

#storage "consul" {
#  address = "127.0.0.1:8500"
#  path    = "vault"
#}

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

# HTTPS listener
listener "tcp" {
  address       = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/tls.crt"
  tls_key_file  = "/opt/vault/tls/tls.key"
}

# Enterprise license_path
# This will be required for enterprise as of v1.8
#license_path = "/etc/vault.d/vault.hclic"

# Example AWS KMS auto unseal
#seal "awskms" {
#  region = "us-east-1"
#  kms_key_id = "REPLACE-ME"
#}

# Example HSM auto unseal
#seal "pkcs11" {
#  lib            = "/usr/vault/lib/libCryptoki2_64.so"
#  slot           = "0"
#  pin            = "AAAA-BBBB-CCCC-DDDD"
#  key_label      = "vault-hsm-key"
#  hmac_key_label = "vault-hsm-hmac-key"
#}

Vault サーバーの Config ファイルの修正

今回はシンプルに Filesystem をストレージバックエンドとして、 Vault サーバーを立ち上げたいと思います。

/etc/vault.d/vault.hcl を以下のように変更します。※変更には root 権限が必要です。

ui = true
log_level = "INFO"

storage "file" {
  path = "/opt/vault/data"
}

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

Vault サーバーのセットアップ

設定ファイルの作成は完了したため、サーバーのセットアップを行います。

Vault サーバーの起動

systemd を利用して Vault サーバー (vault.service) を立ち上げます。

次回 EC2 インスタンス起動時も、 Vault サーバーが起動するように、自動有効化も設定します。

# EC2 側で設定
## vault.service サービスの起動
sudo systemctl start vault.service

## vault.service の自動有効化
sudo systemctl enable vault.service

## vault.service のステータス確認

sudo systemctl status vault

Vault サーバーの初期化諸々

初回起動時 Vault サーバーは初期化する必要があります。

以下のコマンドを実行します。

## Vault 接続先アドレスの変更
export VAULT_ADDR='http://127.0.0.1:8200'

## Vault サーバーのステータス確認
vault status

## Vault サーバーの初期化
vault operator init

初期化を行うと以下のように、 Unseal Key 1 ~ 5 と Initial Root Token が発行されていると思います。

次の Unseal 作業や Vault サーバーへのログインに利用するため、大切に保管してください。

sh-5.2$ vault operator init
Unseal Key 1: roRigRRbbcXHiVW55w1xQ/Q5HwjaykcdUHZ6ppMqIk/t
Unseal Key 2: tADq6ssl+6ECZT3EwhbnTa7NcbuBDBu2pEYZuP2HqxNp
Unseal Key 3: +08Y8qS3Ppf+JLXDt0PXvtGIN3hfHjRNlSvhgaGpuUE/
Unseal Key 4: MCqr6URNg/LCICrJiOsd4xC4zHOochQ0mcA5/uDjgpnM
Unseal Key 5: uvCEU3YQ/CLYibVkgpCtxxCf1iWhL9pnbbgfVXgo948u

Initial Root Token: hvs.FjIXkI1ETPjTZMKhrdy64VhI

Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.

Unseal 作業

Vault サーバーは初期化した後に、利用可能にするには Unseal (封を開ける) 作業が必要です。

以下のコマンドで 5 つ配布された鍵のうち、3 つの鍵を利用して封を開けていきます。

## Unseal 作業 その 1
vault operator unseal roRigRRbbcXHiVW55w1xQ/Q5HwjaykcdUHZ6ppMqIk/t

## Unseal 作業 その 2
vault operator unseal tADq6ssl+6ECZT3EwhbnTa7NcbuBDBu2pEYZuP2HqxNp

## Unseal 作業 その 3
vault operator unseal +08Y8qS3Ppf+JLXDt0PXvtGIN3hfHjRNlSvhgaGpuUE/

上記のコマンドの場合 history コマンドに残ってしまうため、次のコマンドのように対話式で入力することもできます。

sh-5.2$ vault operator unseal
Unseal Key (will be hidden): # キーを対話形式で入力
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    5
Threshold       3
Version         1.13.1
Build Date      2023-03-23T12:51:35ZStorage 
Type    file
Cluster Name    vault-cluster-a14679b4
Cluster ID      739ac621-6846-0f5f-1d4b-f3aa660c5eb1
HA Enabled      false

また、次のコマンドで vault コマンドを history コマンドに残さない設定も可能です。

export HISTIGNORE="&:vault*"

Vault サーバーへの接続

ここからは、 Vault クライアント側のセットアップです。

Vault がクライアント側にもインストールされている前提で進めていきます。

インストールがまだの方は Install Vault からお使いのクライアントマシンに適した方法で Vault をインストールしてください。

## Vault 接続先アドレスの変更
export VAULT_ADDR='http://{EC2のパブリックIPアドレス}:8200'

## Vault サーバーのステータス確認
vault status

## Vault サーバーへのログイン
vault login hvs.FjIXkI1ETPjTZMKhrdy64VhI

### シークレットの確認
vault secrets list

シークレットが確認できる(クライアントから Vault サーバーへログインできた)場合は以下のようにシークレット一覧が確認できます。

% vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_ce4e0eae    per-token private secret storage
identity/     identity     identity_77089170     identity store
sys/          system       system_b7fe2fc7       system endpoints used for control, policy and debugging

まとめ

以上、「Amazon Linux 2023 で HashiCorp Vault Server を構築する」でした。

Vault で何ができるか、少しづつ勉強しながらアウトプットできればと思います。

AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!