これは、なにをしたくて書いたもの?
前に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で行う
- Unsealは
- 再びSealな状態にするには、次のいずれかを行う(または次の状況にする)
ドキュメントとしては、このあたりの内容です。
ちょっと鍵まわりがよくわからないですね。
どうしてSeal/Unsealが必要なのか?
Vaultに保存されるデータは暗号化されますが、データの復号には暗号化キーが必要になります。暗号化キーも(キーリングに)データとともに
保存されますが、この時に「マスターキー」と呼ばれる別の暗号化キーで暗号化されます。
つまり、データを復号するには暗号化キーが必要になるのですが、暗号化キーを使うにはマスターキーで復号する必要があります。
この部分を読み進めると…
- Vaultのデータは、(キーリングの)暗号化キーで暗号化されて保存される
- キーリングはマスターキーによって暗号化される
- Unsealとは、マスターキーにアクセスするプロセスのこと
という話のようです。さらに、マスターキーはUnsealキーという別のキーで暗号化されるとか。
つまり、データを復号するにはキーが3つ関わることになります。
Unsealキー
Unsealキーという言葉が出てきました。
Vaultはデフォルトでは「Shamir seal」というものを使うそうです。
そういえば、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プロセスは煩雑でもあります。
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に
似た概念です。
トークンには、ポリシーが付与されていることもあるようです。
そして、Vaultは複数の認証方法をサポートしています。
Auth Methods | Vault by HashiCorp
認証方法には、ユーザー(人)を対象としているもの、マシンを対象としているものがあるようです。また、認証方法は事前に有効にする
必要があります。
認証方法は、Secrets Engineと同様にパスに対してマッピングするようです。
認証方法の一部を記載します。
- AWS(IAM、EC2)
- Azure AD
- GCP(IAM、GCE)
- GitHub Personal Token
- JWT/OIDC
- LDAP
- トークン
- SSL/TLSクライアント証明書
- ユーザー名/パスワード
- など
トークンは、組み込みの認証方法であり、自動で有効になっています。また、認証時にはトークンが生成されます。
認証にはリースという概念があり、定期的に再認証する必要があるようです。
トークンについて
トークンに関するドキュメントは、こちらです。
Vault 1.0の時点では、トークンはサービストークンとバッチトークンの2種類が存在します。
Tokens / Token Types in Detail
有効期限を持つことに注意してください。
Tokens / Token Time-To-Live, Periodic Tokens, and Explicit Max TTLs
有効期限はデフォルトで32日ですが、マウントAPIを使って設定したり、トークンを発行する認証方法でも設定できます。
有効期限のない、定期的に使う用途でのトークンもあります。
ルートトークン
ルートトークンは、root
ポリシーが付与され、なんでもできる権限を持ったトークンです。また、ルートトークンだけは、更新しなくても
有効期限切れにならない唯一のトークンです。
ルートトークンを作成するのは困難であり、以下がルートトークンを作成する方法です。
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を見ていて「どういうことだろう?」と思っていたので、それなりに時間をかけて見てみて良かったかなと
思います。