VaultのStorage BackendにGCSを使ってみる

目次

  1. 初めに
  2. 動作環境
  3. VaultのStorage Backend
  4. GCSを使ってみる
  5. 終わりに

1. 初めに

VaultにはStorage Backendっというものがあります。今回はそのStorage BackendにGCSを利用してみたいと思います。 下記がVaultのStorage Backendのドキュメントになりますので、より詳しく知りたい方はドキュメントを見てみてください。

www.vaultproject.io

www.vaultproject.io

2. 動作環境

3. VaultのStorage Backend

まずはVaultのStorage Backendについてですが、簡単に説明するとSecretなどの情報を保存しておく場所になります。 仮にdev modeで起動したときのStorage Backendはin memoryとなります。こうしたデータの保存場所をVaultでは指定することができ、例えばファイル、S3、ConsulやEtcdにも保存することができます。

保存されたデータは暗号化してあるので直接データを見に行っても中を見ることができない状態になっています。

4. GCSを使ってみる

早速GCSを使ってみようと思います。GCSを使うにあたって一般的にはGCSを使えるよう権限を与える必要があります。 ですので権限周りについて詳しく見ていきましょう。

GCSバケットの作成

まずは保存先となるGCSのバケットを作成していきます。

$ gsutil mb gs://my-storage-bucket

これだけで作成完了です。

GCSをStorage Backendとして扱うにはVaultからGCSに対してアクセスできる権限がないといけないので専用のService Accountを作成したいと思います。

Service Accountの作成

GCSにアクセスするためService AccountにはGCSへのアクセス権限を割り当てる必要があります。

アクセス権限はVaultのドキュメントに書いてある通り、 roles/storage.objectAdmin のロールを割り当ててあげれば大丈夫でしょう。

今回は vaultstorage っという名前でService Accountを作成します。

$ gcloud iam service-accounts create vaultstorage

ロールの割り当て

$ gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member="serviceAccount:vaultstorage@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" --role="roles/storage.objectAdmin"

作成が終わったら次は作成したService Accountの鍵を作成していきます。

$ gcloud iam service-accounts keys create vaultstorage-key.json --iam-account=vaultstorage@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

次に作成した鍵のパスをGOOGLE_APPLICATION_CREDENTIALS環境変数に保存しましょう。

export GOOGLE_APPLICATION_CREDENTIALS=/home/hogehoge/vaultstorage-key.json

これで準備が完了しました。次にVaultを起動していきます。

Vaultの起動

Vaultの起動する際にGCSをStorage Backendとして使うようconfigに記載していきます。

storage "gcs" {
  bucket = "my-storage-bucket"
}

・・・

storagegcs としていしてあげます。bucketは先ほど作成したバケット名を入れてあげます。 configの設定はこれだけあれば十分ですので実際に起動させてみたいと思います。

$ vault server -config=config/config.hcl
==> Vault server configuration:

                     Cgo: disabled
              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: gcs (HA disabled)
                 Version: Vault v1.3.0
             Version Sha: 4083c36aa0630faafb7c04be62c4940299880bc9+CHANGES

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

Vaultの初期化処理

起動が完了したら別のターミナルを立ち上げてvault CLIで操作していきましょう。 ただ、CLIで操作する前にVAULT_ADDR環境変数にVault Serverのエンドポイントを指定してあげる必要があります。

$ export VAULT_ADDR=http://127.0.0.1:8200

では初期化処理です。ここでVault Serverは起動したばかりでSealed状態になっているのでUnsealにしていきます。

$ vault operator init
Unseal Key 1: UK7ktKGdZldIjiwZtVYVDKIl8GeZaeKS+joCjBc5eaYJ
Unseal Key 2: auZJoO8HRUYYQ553BY8aecyA2UjrO1X/jY3eeF8aiDFx
Unseal Key 3: LvN54zcqTctERCEnKvX7xPbpous9QraLu5453WRE59NH
Unseal Key 4: uAQb//JNOMvwXhrtDAK9Kvxz02+yIbiMBxanPrxdorRG
Unseal Key 5: yjItUqqRvn1wrUmqbFmRdjP8xP6CUGzgf/2YHdkaAvRd

Initial Root Token: s.MAXpmLCdMGUBqWGMyyAU4DSF

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 key 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 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       ea5a56b5-5044-3f6a-d7a2-af25bc0ac7f3
Version            1.3.0
HA Enabled         false

$ 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       ea5a56b5-5044-3f6a-d7a2-af25bc0ac7f3
Version            1.3.0
HA Enabled         false

$ vault operator unseal
Unseal Key (will be hidden):
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    5
Threshold       3
Version         1.3.0
Cluster Name    vault-cluster-4769ee3e
Cluster ID      a5994982-e32d-459e-bf27-d5f4eaec10bc
HA Enabled      false

初期化処理もすべて完了しました。 ここで一度バケットの中を見てみて実際にデータが入っているか見てみましょう。

$ gsutil ls gs://my-storage-bucket/
gs://my-storage-bucket/core/
gs://my-storage-bucket/logical/
gs://my-storage-bucket/sys/

実際に値が入っていますね。 ちなみに中のデータはちゃんと暗号化されていました。

ではここでVault CLIでVault Serverにログインしてみましょう。

# root tokenを指定
$ export VAULT_TOKEN= s.MAXpmLCdMGUBqWGMyyAU4DSF
$ vault login ${VAULT_TOKEN}
WARNING! The VAULT_TOKEN environment variable is set! This takes precedence
over the value set by this command. To use the value set by this command,
unset the VAULT_TOKEN environment variable or set it to the token displayed
below.

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.MAXpmLCdMGUBqWGMyyAU4DSF
token_accessor       EHkhj5RZZyo9qlg6xcKrPV5A
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

ログインまで完了した。 試しにKV Secrets Engineを許可し、値を入れてみてみましょう。

$ vault secrets enable -path=kv kv
Success! Enabled the kv secrets engine at: kv/
$ vault write kv/hello foo=bar
Success! Data written to: kv/hello

$ vault read kv/hello
Key                 Value
---                 -----
refresh_interval    768h
foo                 bar

値も無事に入っているのが確認できました。ではここでVault Serverを停止させ、もう一度保存したデータが取得できるか確認してみましょう。 一度Vault Serverは起動しなおした時はSealed状態で立ち上がっているのでもう一度Unsealにする必要があります。

初期化処理をした時と同様 vault operator unseal コマンドでUnseal処理をした後は今まで通りコマンドからVaultを操作することができます。

停止する前に入れたデータが残っているか確認してみましょう。

$ vault read kv/hello
Key                 Value
---                 -----
refresh_interval    768h
foo                 bar

無事にデータが残っていることが確認でき、閲覧するところまで確認できました。

5. 終わりに

Storage BackendにGCSを使ってみました。実際にデータが保存されるところまで確認でき再起動後もデータが残っていることまで確認でました。GCSの中のデータ自体は暗号化されているので直接Secret情報が見られることがないので安心ですね。

ただ、このままですと中の情報は見られることはないですが、GCSのデータ自体は削除や直接追加などできてしまうので、 実運用するときはVault Serverだけバケットにアクセスできるような制限なども必要かもしれないですね。

S3や別のストレージにも保存するやり方があるので機会があるときにそちらも試してみたいと思います。