Amazon Linux 2023 で HashiCorp Vault Server を構築する
こんにちは!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_)でした!