この記事は公開されてから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_)でした!