CLOVER🍀

That was when it all began.

Ubuntu Linux 20.04 LTSにVaultをむンストヌルする

これは、なにをしたくお曞いたもの

前々からちょっず気になっおいた、Vaultを扱っおみるこずにしたした。

Vault

Vaultのオフィシャルサむトは、こちら。HashiCorpのプロダクトですね。

Vault by HashiCorp

Vaultがどんなものかは、ナヌスケヌスを芋るのが良い気がしたす。

  • Secrets Management
    • 機密情報の管理
  • Dynamic Secrets
    • 動的にシヌクレットを生成、有効期限切れによる砎棄
  • Kubernetes Secrets
    • Kubernetes環境における機密情報管理
  • Database Credential Rotation
    • デヌタベヌスのクレデンシャルのロヌテヌションおよび有効期限管理の自動化
  • Automated PKI Infrastructure
    • 蚌明曞の自動生成
  • Identity-based Access
    • クラりド等のIDプロバむダヌを䜿甚したアクセス管理
  • Data Encryption & Tokenization
  • Key Management
    • 様々なKMSプロバむダヌをバック゚ンドずした暗号鍵の配垃、ラむフサむクル管理

だいたい、雰囲気が感じ取れたすね。

ラむセンスは、GitHubリポゞトリを芋るずMozilla Public License 2.0です。

GitHub - hashicorp/vault: A tool for secrets management, encryption as a service, and privileged access management

OSS版、Enterprise版、Cloud版の3圢態で提䟛されおいたす。

HashiCorp Vault: Enterprise Pricing, Packages & Features

ドキュメント、チュヌトリアルはそれぞれこちら。

Documentation | Vault by HashiCorp

Vault Tutorials - HashiCorp Learn

クラむアントラむブラリに぀いおは、こちらにたずめられおいたす。

HTTP API: Libraries | Vault by HashiCorp

Enterprise版に぀いおは、ドキュメント内に章が蚭けられおいたす。

Vault Enterprise | Vault by HashiCorp

自分が利甚するのはOSS版ですね。

今回は、Ubuntu Linux 20.04 LTSにむンストヌルしおたずは詊しおみたいず思いたす。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:        20.04
Codename:       foca


$ uname -srvmpio
Linux 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5 16:31:28 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu Linux 20.04 LTSです。

Vaultをむンストヌルする

Vaultをむンストヌルする方法はこちらに曞かれおいたすが、

Install Vault | Vault by HashiCorp

今回はビルド枈みのLinuxパッケヌゞを䜿いたす。

Downloads | Vault by HashiCorp

$ 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"
$ sudo apt-get update
$ sudo apt-get install vault

Vault 1.9.1がむンストヌルされたした。

$ vault version
Vault v1.9.1

むンストヌルされるファむルは、これだけですね。systemdのサヌビスナニットファむルもあるじゃないですか。

$ dpkg -L vault
/usr
/usr/bin
/usr/bin/vault
/etc
/etc/vault.d
/etc/vault.d/vault.env
/etc/vault.d/vault.hcl
/usr/lib
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/vault.service

ヘルプ。

$ vault -h
Usage: vault <command> [args]

Common commands:
    read        Read data and retrieves secrets
    write       Write data, configuration, and secrets
    delete      Delete secrets and configuration
    list        List data or secrets
    login       Authenticate locally
    agent       Start a Vault agent
    server      Start a Vault server
    status      Print seal and HA status
    unwrap      Unwrap a wrapped secret

Other commands:
    audit          Interact with audit devices
    auth           Interact with auth methods
    debug          Runs the debug command
    kv             Interact with Vault's Key-Value storage
    lease          Interact with leases
    monitor        Stream log messages from a Vault server
    namespace      Interact with namespaces
    operator       Perform operator-specific tasks
    path-help      Retrieve API help for paths
    plugin         Interact with Vault plugins and catalog
    policy         Interact with policies
    print          Prints runtime configurations
    secrets        Interact with secrets engines
    ssh            Initiate an SSH session
    token          Interact with tokens

コマンドごずのオプションは、-hを付けお実行すれば確認できそうです。

$ vault server -h
Usage: vault server [options]

  This command starts a Vault server that responds to API requests. By default,
  Vault will start in a "sealed" state. The Vault cluster must be initialized
  before use, usually by the "vault operator init" command. Each Vault server must
  also be unsealed using the "vault operator unseal" command or the API before the
  server can respond to requests.

  Start a server with a configuration file:

      $ vault server -config=/etc/vault/config.hcl

  Run in "dev" mode:

      $ vault server -dev -dev-root-token-id="root"

  For a full list of examples, please see the documentation.

HTTP Options:

  -address=<string>
      Address of the Vault server. The default is https://127.0.0.1:8200. This
      can also be specified via the VAULT_ADDR environment variable.

〜省略〜

各コマンドに察するドキュメントは、こちら。

Commands (CLI) | Vault by HashiCorp

開発モヌドのサヌバヌを起動する

チュヌトリアルを芋るず、たずはサヌバヌを起動するようです。

Starting the Server | Vault - HashiCorp Learn

開発モヌドのサヌバヌを詊しおみたしょう、ず。

開発モヌドのサヌバヌずは、こういうものみたいです。

  • -devオプションを぀けお起動する
  • ロヌカル開発、テスト、調査目的に䜿甚する
  • セキュアではなく、保護されおいない
  • デヌタはメモリ䞊に保存される
  • プロダクション環境で䜿甚しおはならない

確かに"開発モヌド"ですね。

server - Command | Vault by HashiCorp

開発モヌドのサヌバヌは蚭定枈みのものになるようで、そうではない堎合は蚭定ファむルでVaultの蚭定を行いたす。

Server Configuration | Vault by HashiCorp

こちらに぀いおは、たた別の機䌚に。

では、開発サヌバヌを起動しおみたす。

$ vault server -dev

起動するず、Vault自身の情報が衚瀺され

==> Vault server configuration:                                                                                                                                                   
                                                                                                                                                                                  
             Api Address: http://127.0.0.1:8200                                                                                                                                   
                     Cgo: disabled
         Cluster Address: https://127.0.0.1:8201
              Go Version: go1.17.2
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: info
                   Mlock: supported: true, enabled: false
           Recovery Mode: false
                 Storage: inmem
                 Version: Vault v1.9.1

==> Vault server started! Log data will stream in below:

最埌にこんな情報が衚瀺されたす。

2021-12-21T00:03:02.566+0900 [INFO]  expiration: lease restore complete
2021-12-21T00:03:02.566+0900 [INFO]  core: post-unseal setup complete
2021-12-21T00:03:02.566+0900 [INFO]  core: vault is unsealed
2021-12-21T00:03:02.569+0900 [INFO]  core: successful mount: namespace="\"\"" path=secret/ type=kv
2021-12-21T00:03:02.578+0900 [INFO]  secrets.kv.kv_27c06bad: collecting keys to upgrade
2021-12-21T00:03:02.579+0900 [INFO]  secrets.kv.kv_27c06bad: done collecting keys: num_keys=1
2021-12-21T00:03:02.579+0900 [INFO]  secrets.kv.kv_27c06bad: upgrading keys finished
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.

You may need to set the following environment variable:

    $ export VAULT_ADDR='http://127.0.0.1:8200'

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: [Unseal Key]
Root Token: [Root Token]

Development mode should NOT be used in production installations!

Unseal KeyずRoot Tokenが衚瀺されおいたす。それから、VAULT_ADDRずいう環境倉数に぀いおも曞かれおいたすね。

別のタヌミナルからアクセスしおみたしょう。

そのたただずアクセスできたせん。

$ vault status
Error checking seal status: Get "https://127.0.0.1:8200/v1/sys/seal-status": http: server gave HTTP response to HTTPS client

開発サヌバヌ起動時に指瀺されおいたずおり、VAULT_ADDR環境倉数を蚭定しおみたす。

$ export VAULT_ADDR=http://127.0.0.1:8200

今床はアクセスできたした。

$ vault status
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    1
Threshold       1
Version         1.9.1
Storage Type    inmem
Cluster Name    vault-cluster-5df6d588
Cluster ID      f82dde5c-7ecc-5e71-d7ba-f7b51c72f17e
HA Enabled      false

vault statusは、珟圚のVaultの状態を出力するコマンドです。

status - Command | Vault by HashiCorp

autocompletionを有効にする

先に進む前に、vaultコマンドのautocompletionを有効にしおおきたしょう。

Vault Commands (CLI) / Autocompletion

以䞋のコマンドを実行。

$ vault -autocomplete-install

$HOME/.bashrcファむルに、以䞋が远加されるようです。

complete -C /usr/bin/vault vault

新しく起動したシェルから、autocompletionが有効になりたす。

シヌクレットを登録する

続いお、シヌクレットを登録しおみたしょう。

Your First Secret | Vault - HashiCorp Learn

コマンドずしおは、vault kvを䜿うようです。

kv - Command | Vault by HashiCorp

kvずは、VaultのKey Value Secrets Engineを操䜜するコマンドです。

KV - Secrets Engines | Vault by HashiCorp

KV Secrets Engineにはバヌゞョンが2぀あり、開発サヌバヌではバヌゞョン2が、非開発サヌバヌではバヌゞョン1が
デフォルトで䜿われるようです。

Additionally, when running a dev-mode server, the v2 kv secrets engine is enabled by default at the path secret/ (for non-dev servers, it is currently v1).

KV - Secrets Engines | Vault by HashiCorp

アクセスするパスもそれぞれ違うようですね。バヌゞョン1ず2の違いは、メタデヌタや履歎の管理のようです。
バヌゞョン2だず、メタデヌタの保存や履歎管理が行われたす。

では、パスsecret/my-credsにkv putでデヌタを曞き蟌んでみたす。デヌタはkey=value圢匏で指定するようです。

$ vault kv put secret/my-creds hello=world

コマンドのレスポンスは、このようになりたす。

Key                Value
---                -----
created_time       2021-12-20T16:40:13.178757588Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

登録したデヌタは、kv listで指定したパスでキヌを衚瀺できたす。

$ vault kv list secret
Keys
----
my-creds

デヌタを取埗するには、kv getです。

$ vault kv get secret/my-creds
======= Metadata =======
Key                Value
---                -----
created_time       2021-12-20T16:40:13.178757588Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

==== Data ====
Key      Value
---      -----
hello    world

kv putで、同時に耇数のデヌタを曞き蟌むこずもできたす。

$ vault kv put secret/my-creds foo=bar var=val
Key                Value
---                -----
created_time       2021-12-20T16:44:02.067907299Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2

デヌタを取埗しお確認。

$ vault kv get secret/my-creds
======= Metadata =======
Key                Value
---                -----
created_time       2021-12-20T16:44:02.067907299Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2

=== Data ===
Key    Value
---    -----
foo    bar
var    val

ここで気づくのですが、key=value圢匏で指定しおいるからずいっお、「キヌが重耇しなかったら远加」ずいうわけでは
ないんですね。

別のパスにも远加しおみたしょう。

$ vault kv put secret/test-creds name=vault


$ vault kv put secret/my-creds/sub name=terraform


$ vault kv put secret/sub1/sub2/sub3 hello=world

kv listで確認。

$ vault kv list secret
Keys
----
my-creds
my-creds/
sub1/
test-creds

サブパスも確認。

$ vault kv list secret/my-creds
Keys
----
sub

Secrets Engine

Secrets Engineは、デヌタを保存、生成、そしお暗号化するコンポヌネントです。

Secrets Engines | Vault - HashiCorp Learn

secrets - Command | Vault by HashiCorp

Secrets Engines | Vault by HashiCorp

Secrets Engineは倚数あり、デヌタベヌスやConsulなどのデヌタストア、AWS、Azureなどのクラりドなどがありたす。

Secrets Engineはパスに察しお有効化し、無効化や移動ができたす。

ここで、vault secrets listずいうコマンドを実行しおみたす。

$ vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_491c1d0f    per-token private secret storage
identity/     identity     identity_2f41def3     identity store
secret/       kv           kv_53b92a41           key/value secret storage
sys/          system       system_faffd04e       system endpoints used for control, policy and debugging

先ほどたで䜿っおいたsecret/ずいうパスが、kvずいうTypeになっおいたす。

぀たり、KeyValue Secrets Engineがパスsecretに察しお有効化されおいお、vault kvずいうコマンドは
KeyValue Secrets Engineを扱うコマンドだったこずがわかりたす。

KV - Secrets Engines | Vault by HashiCorp

ここで、さらにKeyValue Secrets Engineを有効にしおみたしょう。vault secrets enable [Secrets Engine名]で
有効化したす。

$ vault secrets enable kv

デフォルトではSecrets Engineの名前ずパスが同じになるようですが、

$ vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_491c1d0f    per-token private secret storage
identity/     identity     identity_2f41def3     identity store
kv/           kv           kv_f9c9511c           n/a
secret/       kv           kv_53b92a41           key/value secret storage
sys/          system       system_faffd04e       system endpoints used for control, policy and debuggin

-pathオプションを䜿甚するこずで、パスを指定するこずもできたす。

$ vault secrets enable -path=key-value kv
Success! Enabled the kv secrets engine at: key-value/


$ vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_491c1d0f    per-token private secret storage
identity/     identity     identity_2f41def3     identity store
key-value/    kv           kv_4027def6           n/a
kv/           kv           kv_f9c9511c           n/a
secret/       kv           kv_53b92a41           key/value secret storage
sys/          system       system_faffd04e       system endpoints used for control, policy and debugging

有効化したパスには、secretの時ず同じように操䜜ができたす。

$ vault kv put kv/p1 key1=value1
Success! Data written to: kv/p1


$ vault kv get kv/p1
==== Data ====
Key     Value
---     -----
key1    value1

なのですが、よく芋るずデヌタが少ないですね。これはKeyValue Secrets Engineのバヌゞョン1を䜿ったからのようです。

バヌゞョン2を䜿う堎合は、以䞋のどちらかで指定したす。

$ vault secrets enable kv-v2

$ vault secrets enable -version=2 kv

今回はkv-v2で指定しおみたす。

$ vault secrets enable kv-v2
Success! Enabled the kv-v2 secrets engine at: kv-v2/

$ vault kv put kv-v2/p1 key1=value1
Key                Value
---                -----
created_time       2021-12-21T16:37:49.90898581Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1


$ vault kv get kv-v2/p1
======= Metadata =======
Key                Value
---                -----
created_time       2021-12-21T16:37:49.90898581Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

==== Data ====
Key     Value
---     -----
key1    value1

最初に䜿ったvault kvでの操䜜ず同じになりたしたね。バヌゞョン1ず2の差を芋た圢になりたした。

それにしおも、vault secrets listで芋おも䞡者の区別はできないのですが、どうしたらいいんでしょうね

$ vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_491c1d0f    per-token private secret storage
identity/     identity     identity_2f41def3     identity store
key-value/    kv           kv_4027def6           n/a
kv-v2/        kv           kv_27428a78           n/a
kv/           kv           kv_f9c9511c           n/a
secret/       kv           kv_53b92a41           key/value secret storage
sys/          system       system_faffd04e       system endpoints used for control, policy and debugging

他のSecrets Engineに目を向けるず、有効化したあずはvault write、vault readでデヌタの読み曞きを行うようです。

MySQL/MariaDB - Database - Secrets Engines | Vault by HashiCorp

write - Command | Vault by HashiCorp

read - Command | Vault by HashiCorp

こちらに぀いおは、別の機䌚に詊しおみたしょう。

Web UIを䜿う

VaultにはWeb UIがあり、開発サヌバヌでは有効になっおいたす。

Web UI | Vault - HashiCorp Learn

http://localhost:8200たたはhttp://localhost:8200/uiにアクセスするず、ログむン画面が珟れたす。

f:id:Kazuhira:20211222014415p:plain

このペヌゞではMethodはTokenのたたにしお、開発サヌバヌ起動時に衚瀺されおいたRoot Tokenの倀をTokenに
入力したす。

Root Token: [Root Token]

ログむンするず、Secrets Engineのリストを芋るこずができたす。

f:id:Kazuhira:20211222014547p:plain

登録したデヌタを芋るこずもできるようです。

f:id:Kazuhira:20211222014740p:plain

たずめ

Vaultをたずは詊しおみたした。

觊ったばかりで機胜もよくわかっおいたせんが、これから少しず぀慣れおいこうかなず思いたす。