CLOVER🍀

That was when it all began.

VaultのSeal/Unsealについて見てみる(非開発サーバーで使ってみる)

これは、なにをしたくて書いたもの?

前にVaultを試した時は、開発モードのサーバーでした。

Ubuntu Linux 20.04 LTSにVaultをインストールする - CLOVER🍀

今回は、開発モードにせずに使ってみたいと思います。

なんて呼んだらいいかわかりませんが、このエントリーのタイトルとしては「非開発サーバー」としておきます。

環境

今回の環境は、こちら。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:       focal


$ 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

Vaultをインストールして起動する

Vaultをインストールします。

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

今回は1.9.2がインストールされました。

$ vault version
Vault v1.9.2 (f4c6d873e2767c0d6853b5d9ffc77b0d297bfbdf)

また、aptでインストールしたファイルには設定ファイルや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

有効化して、起動。

$ sudo systemctl enable vault
$ sudo systemctl start vault

ログを見てみます。

$ sudo journalctl -u vault --no-pager

抜粋。

 1月 15 16:24:45 vault systemd[1]: Started "HashiCorp Vault - A tool for managing secrets".
 1月 15 16:24:45 vault vault[1638]: ==> Vault server configuration:
 1月 15 16:24:45 vault vault[1638]:                      Cgo: disabled
 1月 15 16:24:45 vault vault[1638]:               Go Version: go1.17.5
 1月 15 16:24:45 vault vault[1638]:               Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
 1月 15 16:24:45 vault vault[1638]:                Log Level: info
 1月 15 16:24:45 vault vault[1638]:                    Mlock: supported: true, enabled: true
 1月 15 16:24:45 vault vault[1638]:            Recovery Mode: false
 1月 15 16:24:45 vault vault[1638]:                  Storage: file
 1月 15 16:24:45 vault vault[1638]:                  Version: Vault v1.9.2
 1月 15 16:24:45 vault vault[1638]:              Version Sha: f4c6d873e2767c0d6853b5d9ffc77b0d297bfbdf
 1月 15 16:24:45 vault vault[1638]: ==> Vault server started! Log data will stream in below:
 1月 15 16:24:45 vault vault[1638]: 2022-01-15T16:24:45.526+0900 [INFO]  proxy environment: http_proxy="\"\"" https_proxy="\"\"" no_proxy="\"\""
 1月 15 16:24:45 vault vault[1638]: 2022-01-15T16:24:45.526+0900 [WARN]  no `api_addr` value specified in config or in VAULT_API_ADDR; falling back to detection if possible, but this value should be manually set
 1月 15 16:24:45 vault vault[1638]: 2022-01-15T16:24:45.588+0900 [INFO]  core: Initializing VersionTimestamps for core

systemdのユニット定義ファイルを見てみます。

/etc/systemd/system/multi-user.target.wants/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]
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

vault server -configで起動していますね。

$ vault server -config=[設定ファイル]

環境変数は、定義されていませんでした。

/etc/vault.d/vault.env




設定ファイルは、こんな感じでしたね。

/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"
#}

コメントを削除して表示。

$ grep -v '^#' /etc/vault.d/vault.hcl

ui = true


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



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


デフォルトの設定ファイルを読む & SSL/TLSを無効化する

デフォルトの設定ファイルの内容を、少し読んでみましょう。

こちらは、ストレージの設定ですね。

Storage Backends - Configuration | Vault by HashiCorp

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

ローカルファイルシステムにデータを保存するように構成されています。

Filesystem - Storage Backends - Configuration | Vault by HashiCorp

次は、リスナー。8200ポート、0.0.0.0に対してバインドされています。

Listeners - Configuration | Vault by HashiCorp

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

TCPを使うように構成されていますが、現時点でVaultで使えるリスナーには他の選択肢はありません。

TCP - Listeners - Configuration | Vault by HashiCorp

最初からSSL/TLSが有効になっているようです。インストール時の様子をよくよく見ると、証明書と秘密鍵を作成していました。

Generating Vault TLS key and self-signed certificate...                                                                                                                                 
Generating a RSA private key                                                                                                                                                            
.........++++                                                                                                                                                                           
...........++++                                                                                                                                                                         
writing new private key to 'tls.key'                                                                                                                                                    
-----                                                                                                                                                                                   
Vault TLS key and self-signed certificate have been generated in '/opt/vault/tls'.

また、Web UIも有効になっています。

UI - Configuration | Vault by HashiCorp

ui = true

ところで、VaultはデフォルトでSSL/TLSが有効な状態、という話でした。

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

このため、アクセスする際にはHTTPSになります。

$ export VAULT_ADDR=https://localhost:8200

なのですが、そのままだと証明書でエラーになります。

$ vault status
Error checking seal status: Get "https://localhost:8200/v1/sys/seal-status": x509: certificate is not valid for any names, but wanted to match localhost

証明書のチェックもスキップできるのですが

$ vault status -tls-skip-verify
Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.9.2
Storage Type       file
HA Enabled         false

証明書のCNを見ると、これに合わせるのはちょっと困難な気がしたので…。

$ sudo openssl x509 -text -noout -in /opt/vault/tls/tls.crt                                                                                                       
Certificate:                                                                                                                                                                            
    Data:                                                                                                                                                                               
        Version: 3 (0x2)                                                                                                                                                                
        Serial Number:                                                                                                                                                                  
            04:b7:cf:54:d5:cd:11:86:a4:53:e7:71:d9:11:8b:86:46:2e:ec:bc                                                                                                                 
        Signature Algorithm: sha256WithRSAEncryption                                                                                                                                    
        Issuer: O = HashiCorp, CN = Vault                                                                                                                                               
        Validity                                                                                                                                                                        
            Not Before: Jan  3 13:17:19 2022 GMT                                                                                                                                        
            Not After : Jan  2 13:17:19 2025 GMT                                                                                                                                        
        Subject: O = HashiCorp, CN = Vault

〜省略〜

サーバー名をvaultにすればいいんですけどね。

$ sudo curl --cacert /opt/vault/tls/tls.crt https://vault:8200/v1/sys/seal-status
{"type":"shamir","initialized":false,"sealed":true,"t":0,"n":0,"progress":0,"nonce":"","version":"1.9.2","migration":false,"recovery_seal":false,"storage_type":"file"}

ただ、ローカルで名前解決できる状態だとvaultコマンドではちょっと難しいので

$ sudo vault status -ca-cert=/opt/vault/tls/tls.crt -tls-server-name=vault

今回はtls_disableをtrueにしてSSL/TLSを無効にすることにしました。

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

これでVaultを再起動すると

$ sudo systemctl restart vault

HTTPでアクセスできるようになります。

$ export VAULT_ADDR=http://localhost:8200

確認。

$ vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.9.2
Storage Type       file
HA Enabled         false

Seal/Unseal

では、Vaultを使っていきたいのですが、開発モードの時はそのままでもアクセスできました。

今回はどうなのでしょう?アクセスしてみると、「Vault is sealed」と言われ拒否されます。

$ vault secrets list
Error listing secrets engines: Error making API request.

URL: GET http://localhost:8200/v1/sys/mounts
Code: 503. Errors:

* Vault is sealed

あらためてvault statusを見ると、Initializedがfalse、Sealedがtrueになっています。

$ vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.9.2
Storage Type       file
HA Enabled         false

前のエントリー(Vault 1.9.1ですが)では、だいぶ表示が違いました。「Unseal〜」という項目もありませんね。

$ 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

ここで、「Seal」という言葉について調べてみます。こちらに記載がありました。

Seal/Unseal | Vault by HashiCorp

Sealという言葉は「封印」、対になるUnsealは「開封」などと訳せますが、今回はそのまま「Seal」、「Unseal」と記載することにします。

ドキュメントによると、Seal/Unsealはこういうものみたいです。

  • Vaultの起動時はSealedな状態で、そのままではほとんど操作できない
    • ステータスの確認は可能
  • Unsealingとは、データの復号するための暗号化キーを読み取るために必要なマスターキーを取得し、Vaultへのアクセス許可を得るプロセスのことを指す
    • Unsealはvault operator unsealコマンド、またはAPIで行う
  • 再びSealな状態にするには、次のいずれかを行う(または次の状況にする)
    • APIを使って再度Sealedな状態にする
    • Vaultを再起動する
    • Vaultのストレージに回復不能なエラーが発生する

ドキュメントとしては、このあたりの内容です。

ちょっと鍵まわりがよくわからないですね。

どうしてSeal/Unsealが必要なのか?

Vaultに保存されるデータは暗号化されますが、データの復号には暗号化キーが必要になります。暗号化キーも(キーリングに)データとともに
保存されますが、この時に「マスターキー」と呼ばれる別の暗号化キーで暗号化されます。

つまり、データを復号するには暗号化キーが必要になるのですが、暗号化キーを使うにはマスターキーで復号する必要があります。

Seal/Unseal / Why?

この部分を読み進めると…

  • Vaultのデータは、(キーリングの)暗号化キーで暗号化されて保存される
  • キーリングはマスターキーによって暗号化される
  • Unsealとは、マスターキーにアクセスするプロセスのこと

という話のようです。さらに、マスターキーはUnsealキーという別のキーで暗号化されるとか。

つまり、データを復号するにはキーが3つ関わることになります。

Unsealキー

Unsealキーという言葉が出てきました。

Vaultはデフォルトでは「Shamir seal」というものを使うそうです。

Seal/Unseal / Shamir seals

そういえば、vault statusの表示項目のひとつである「Seal Type」には、shamirと表示されていました。

$ vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true

〜省略〜

Shamir sealでは、ひとつのUnsealキーを「Shamir's Secret Sharing」というアルゴリズムで分割し、キーをシャードに分割します。

Shamir's Secret Sharing - Wikipedia

このアルゴリズムでは、Unsealキーを再構築するためにはしきい値以上のシャードを揃えることでマスターキーを復号できます。
これがUnsealプロセスになりますね。

Vaultサーバーを初期化、Unsealしてみる

文章だけだと、よくわからなくなってきますね。
具体的なコマンドでいくと、vault operator initというコマンドを実行すると、5つのUnsealキーが表示されます。

~$ vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.9.2
Storage Type       file
HA Enabled         false
vagrant@vault:~$ vault operator init
Unseal Key 1: QfLh5avL2PQsN7GhqL/6n95Cwd1i+t3bdn1tHIYVSv/4
Unseal Key 2: CbVDQTJqz7oG9Y666TPPlO13tZ+agG3zT/6IONoTQ4FP
Unseal Key 3: fPhXaJ4JSe0iwiRNiJP6OT9GiMyjEC2LV+Y+H44ofCTt
Unseal Key 4: 1UojewNxJ+Wvkc2j9wmLYwwfMSuEatsyyBAEESRzvzNW
Unseal Key 5: O8KMjcyY7zgbsSyfAaYSuv/dkVer3ffw+EyChGHRD0CD

Initial Root Token: s.S2VOE3cCpoQHS4HCFwhF2r2M

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 master key. Without at least 3 keys to
reconstruct the master 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.

vault operator initは、Vaultを初期化するコマンドで、Vaultサーバー(クラスター構成であっても)に対して1度だけ実行できます。

operator init - Command | Vault by HashiCorp

ここで、vault statusを見てみます。Initializedがtrueになりました。

$ vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    0/3
Unseal Nonce       n/a
Version            1.9.2
Storage Type       file
HA Enabled         false

また「Total Shares」が5になり、「Threshold」は3ですが、これはシャード分割されたUnsealキーの数と、Unsealするために必要なしきい値を
表します。

ところで「Initial Root Token」というものが表示されていましたが、トークンはログインに使います。ですが、これはまだ使えません。

$ vault login
Token (will be hidden): 
Error authenticating: error looking up token: Error making API request.

URL: GET http://localhost:8200/v1/auth/token/lookup-self
Code: 503. Errors:

* Vault is sealed

最初にUnsealすることが必要です。

vault operator unsealというコマンドで、Unsealすることができます。

operator unseal - Command | Vault by HashiCorp

Thresholdが3なので、3回コマンドを実行し、それぞれ異なるUnsealキーを入力する必要があります。

### Unsealキー 1つ目
$ vault operator unseal
Unseal Key (will be hidden): 
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    1/3
Unseal Nonce       76855916-6be6-89b5-ff8c-5d9bbe7dd338
Version            1.9.2
Storage Type       file
HA Enabled         false


### Unsealキー 2つ目
$ vault operator unseal
Unseal Key (will be hidden): 
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    2/3
Unseal Nonce       76855916-6be6-89b5-ff8c-5d9bbe7dd338
Version            1.9.2
Storage Type       file
HA Enabled         false


### Unsealキー 3つ目
$ vault operator unseal
Unseal Key (will be hidden): 
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    5
Threshold       3
Version         1.9.2
Storage Type    file
Cluster Name    vault-cluster-e56ee300
Cluster ID      90e7380d-2ef4-3eb9-f254-f52053fdd042
HA Enabled      false

実行の度にvault statusの結果が表示されるので、Unsealプロセスが進んでいく様子がわかりますね。

3つ目のUnsealキーを入力した後は、「Sealed」がfalseになり、Unsealできたことになります。

Vaultにアクセスしてみると、まだエラーにはなりますが「Vault is sealed」とは言われなくなります。

$ vault secrets list
Error listing secrets engines: Error making API request.

URL: GET http://localhost:8200/v1/sys/mounts
Code: 403. Errors:

* permission denied

この次に必要なのが、「認証(ログイン)」ということになります。

ちなみに、再びSealするにはvault operator sealというコマンドを実行すればよいみたいですが

operator seal - Command | Vault by HashiCorp

これには認証済みでなければ実行できないようです。

$ vault operator seal
Error sealing: Error making API request.

URL: PUT http://localhost:8200/v1/sys/seal
Code: 403. Errors:

* permission denied
Auto Unseal

これでUnsealできることは確認できましたが、このUnsealプロセスは煩雑でもあります。

Seal/Unseal / Auto Unseal

Vaultでは、ユーザーが信頼するデバイスやサービスにUnsealキーを保護する責任を委譲できます。そのようにVaultを構成している場合は、
Vaultは起動時に対象のデバイスまたはサービスにアクセスして、ストレージから読み取ったマスターキーを復号するように動作します。

これをAuto Unsealと呼ぶみたいです。

このプロセスで利用できるデバイスやサービスは、こちらにリストアップされています。AWS KMS、Azure Key Vault、GCP Cloud KMSなどが
利用できるみたいです。

Seals - Configuration | Vault by HashiCorp

この設定が構成されていない場合は、Shamir Sealアルゴリズムが使われることなります。

Shamir SealではVaultを操作するのにUnsealキーが必要になりますが、Auto Unsealを使う場合にはリカバリーキーという、また別のキーが
必要になります。
このリカバリーキーは、Auto Unsealを使うように設定されたVaultの初期化時に生成されます。

Shamir Sealを使用した場合にはVaultの初期化でシャード化されたUnsealキーが生成されましたが、この代わりになるようです。

今回は、Auto Unsealは扱いません。

Vaultの認証について

では、続いては認証の話に進んでみましょう。

Authentication | Vault by HashiCorp

Vaultを使うには、認証しておく必要があります。認証すると、トークンが生成されます。これはWebアプリケーションでいうセッションIDに
似た概念です。

トークンには、ポリシーが付与されていることもあるようです。

Policies | Vault by HashiCorp

そして、Vaultは複数の認証方法をサポートしています。

Auth Methods | Vault by HashiCorp

認証方法には、ユーザー(人)を対象としているもの、マシンを対象としているものがあるようです。また、認証方法は事前に有効にする
必要があります。

認証方法は、Secrets Engineと同様にパスに対してマッピングするようです。

認証方法の一部を記載します。

  • AWS(IAM、EC2)
  • Azure AD
  • GCP(IAM、GCE)
  • GitHub Personal Token
  • JWT/OIDC
  • LDAP
  • トークン
  • SSL/TLSクライアント証明書
  • ユーザー名/パスワード
  • など

トークンは、組み込みの認証方法であり、自動で有効になっています。また、認証時にはトークンが生成されます。

認証にはリースという概念があり、定期的に再認証する必要があるようです。

Authentication / Auth Leases

トークンについて

トークンに関するドキュメントは、こちらです。

Tokens | Vault by HashiCorp

Vault 1.0の時点では、トークンはサービストークンとバッチトークンの2種類が存在します。

Tokens / Token Types in Detail

また、トークンにはトークンアクセッサーや

Tokens / Token Accessors

有効期限を持つことに注意してください。

Tokens / Token Time-To-Live, Periodic Tokens, and Explicit Max TTLs

有効期限はデフォルトで32日ですが、マウントAPIを使って設定したり、トークンを発行する認証方法でも設定できます。
有効期限のない、定期的に使う用途でのトークンもあります。

ルートトークン

ルートトークンは、rootポリシーが付与され、なんでもできる権限を持ったトークンです。また、ルートトークンだけは、更新しなくても
有効期限切れにならない唯一のトークンです。

Tokens / Root Tokens

ルートトークンを作成するのは困難であり、以下がルートトークンを作成する方法です。

  • vault operator initで生成される初期ルートトークン
  • 別のルートトークンを作成する
    • 有効期限のあるルートトークンは、有効起源のないルートトークンを作成することができない
  • Unsealするためのしきい値以上のUnsealキーを入力し、vault operator generate-rootを実行する

operator init - Command | Vault by HashiCorp

operator generate-root - Command | Vault by HashiCorp

最初にvault operator init実行後に表示されたのは、初期ルートトークンということですね。

Initial Root Token: s.S2VOE3cCpoQHS4HCFwhF2r2M

当然ながら、ルートトークンは特に本番環境ではとても注意深く扱う必要があります。

トークンの階層化とOrphanトークン

トークンには階層があり、あるトークンの所有者が別のトークンを作成すると、そのトークンは"子"のトークンとして扱われます。
これらのトークンには関連があり、親トークンが取り消されるとその子トークンも取り消されます。

Tokens / Token Hierarchies and Orphan Tokens

ただ、終了期限のないトークンツリーを作ってしまうと、ユーザーは失効を回避できなくなります。

この動作を避けるために、Orphanトークンというものを作ることができます。これは、独立したトークンであり、独自のトークンツリーの
ルートでもあります。

サービストークンとバッチトークン

サービストークンとバッチトークンの違いは、以下に書かれています。

Tokens / Token Types in Detail

サービストークンが通常のトークンとされていて、バッチトークンはサービストークンと比べて軽量でスケーラブルですが、
サービストークンの機能や柔軟性はサービストークンよりも劣るとされています。

Vaultにログインしてみる

説明を書いていてもよくわからなくなってくるので、実際に認証(ログイン)してみましょう。

Vaultにログインするには、vault loginを使います。

$ vault login

この時、トークンが求められるのでこの時点ではルートトークンを入力しました。

Token (will be hidden):

実行結果。有効期限は無限になっていますね。

Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                  Value
---                  -----
token                s.S2VOE3cCpoQHS4HCFwhF2r2M
token_accessor       DoRDfHwPjGOCttoIV2wMcojl
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

また、vault login自体にトークンを直接指定することもできるみたいです。

$ vault login s.S2VOE3cCpoQHS4HCFwhF2r2M

認証方法を明示的に指定してもOKです。

$ vault login -method=token
Token (will be hidden):

認証に成功すると、Vaultにアクセスできるようになります。

$ vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
cubbyhole/    cubbyhole    cubbyhole_9245d6a2    per-token private secret storage
identity/     identity     identity_07b32f9a     identity store
sys/          system       system_effe65a9       system endpoints used for control, policy and debugging
トークンの情報を確認する

トークンの情報を確認するには、vault token lookupを使えばよさそうです。

token lookup - Command | Vault by HashiCorp

$ vault token lookup s.S2VOE3cCpoQHS4HCFwhF2r2M
Key                 Value
---                 -----
accessor            DoRDfHwPjGOCttoIV2wMcojl
creation_time       1642231861
creation_ttl        0s
display_name        root
entity_id           n/a
expire_time         <nil>
explicit_max_ttl    0s
id                  s.S2VOE3cCpoQHS4HCFwhF2r2M
meta                <nil>
num_uses            0
orphan              true
path                auth/token/root
policies            [root]
ttl                 0s
type                service

トークンについてはまだまだ見るところがあるのですが、これ以上追うと終わらなくなるので、今回はここで止めようと思います。

Vaultを操作する

ログインが済んでいるのと、ルートトークンを使っているのでVaultが操作できるようになっています。少し触ってみましょう。

Key/Value Secrets Engine v1を有効にします。

KV - Secrets Engines | Vault by HashiCorp

$ vault secrets enable -path=kv kv

データの保存。

$ vault kv put kv/key1 hello=world
Success! Data written to: kv/key1

データの取得。

$ vault kv get kv/key1
==== Data ====
Key      Value
---      -----
hello    world

ストレージの設定がしてあるので、Vaultを再起動しても

$ sudo systemctl restart vault

データが残っています。

$ vault kv get kv/key1
==== Data ====
Key      Value
---      -----
hello    world

ただ、再起動するとSealedな状態に戻ってしまうので、Vaultを操作する前に再度Unsealのプロセスとログインが必要になりますが。

$ vault operator unseal
$ vault operator unseal
$ vault operator unseal
$ vault login

VaultをSealedにする

最後、VaultをSealedな状態に戻してみましょう。といっても、先ほど再起動した時に1度Sealedに戻っているのですが。

コマンドでSealedにするには、vault operator sealを使います。

operator seal - Command | Vault by HashiCorp

$ vault operator seal
Success! Vault is sealed

これで、Vaultの機能が使えなくなりました。

$ vault secrets list
Error listing secrets engines: Error making API request.

URL: GET http://localhost:8200/v1/sys/mounts
Code: 503. Errors:

* Vault is sealed

ログインもできなくなります。

$ vault login
Token (will be hidden): 
Error authenticating: error looking up token: Error making API request.

URL: GET http://localhost:8200/v1/auth/token/lookup-self
Code: 503. Errors:

* Vault is sealed

ステータスだけは見えますね。

$ vault status
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    0/3
Unseal Nonce       n/a
Version            1.9.2
Storage Type       file
HA Enabled         false

ここから再度操作できるようにするためには、vault operator unsealでUnsealプロセスを行うことになります。

まとめ

今回は、主にVaultのSeal/Unsealについて確認してみました。

トークンにまで踏み込もうと思ったのですが、情報量が多そうで終わらなくなりそうだったので、今回は区切りました。
こちらについては、また時間を置いてから。

Seal/Unsealについては、Tutorialを見ていて「どういうことだろう?」と思っていたので、それなりに時間をかけて見てみて良かったかなと
思います。