カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

Vaultを試してみた

最近ブログ書いてないので、リハビリがてら書いてみる。

最近新しいプロジェクトに関わっているのですが、どうせ最初から作るなら暗号化もちゃんと検討しようということで、Vaultに触れてみました。

Vaultの概要については以下の記事などがあります。

要はデータの暗号化・復号をいい感じでやってくれるツールです。保存先にはconsul, file, オンメモリ, zookeeperが選べまして、とりあえずファイルでやってみました。

では、使い方を。

まず、インストールページからzipをダウンロードします。 展開すると、「vault」という実行ファイルだけが展開されるでしょう。

# ./vault -v
Vault v0.1.2

次に Server Configurationに従って、設定ファイルを作ります。

backend "file" {
  path = "/opt/vault/key.txt"
}
listener "tcp" {
  address = "127.0.0.1:8200"
  tls_cert_file = "./ssl/sample.crt"
  tls_key_file = "./ssl/sample.key"
}
disable_mlock = true

んで、起動。

# ./vault server -config=./vault.conf -log-level=debug &
[1] 21402
root@hogehoge:/opt/vault# ==> Vault server configuration:
         Log Level: debug
             Mlock: supported: true, enabled: false
           Backend: file
        Listener 1: tcp (addr: "0.0.0.0:8200", tls: "enabled")
==> Vault server started! Log data will stream in below:

起動できました。

こんな感じでdevモードでも起動できるのですが、わりと勝手が違うので、最初から通常モードに慣れておいたほうがいいかもしれません。

# ./vault server -dev

次に、初期化を行います。オレオレ証明書を使う場合は、「-tls-skip-verify」を指定しましょう。

# ./vault init -tls-skip-verify
2015/06/04 08:08:20 [INFO] core: security barrier initialized
2015/06/04 08:08:20 [INFO] core: post-unseal setup starting
2015/06/04 08:08:20 [INFO] rollback: starting rollback manager
2015/06/04 08:08:20 [INFO] core: post-unseal setup complete
2015/06/04 08:08:20 [INFO] core: root token generated
2015/06/04 08:08:20 [INFO] core: pre-seal teardown starting
2015/06/04 08:08:20 [INFO] rollback: stopping rollback manager
2015/06/04 08:08:20 [INFO] core: pre-seal teardown complete
Key 1: 0000000000000000000000000000000000001111111111111111111
Key 2: 
2222222222222222222222222555555555555555555555555555555
Key 3: 111111111111111111155555555555555555555555555555
Key 4: 44444444444444444444444433333333333333333333333
Key 5: 1111111111111111111111111110000000000000000000
Initial Root Token: aaaaaaa-bbbbb-cccc-ddd-eeeeee
Vault initialized with 5 keys and a key threshold of 3!
Please securely distribute the above keys. Whenever a Vault server
is started, it must be unsealed with 3 (the threshold) of the
keys above (any of the keys, as long as the total number equals
the threshold).
Vault does not store the original master key. If you lose the keys
above such that you no longer have the minimum number (the
threshold), then your Vault will not be able to be unsealed.

keyが5つと、Rootトークンが1つ表示されるので、それをメモっておきます。

statusを叩くとステータスが確認できます。

# ./vault status -tls-skip-verify
Sealed: true
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0
High-Availability Enabled: false

重要なのはSealedというやつ。これがtrueだと機密情報の書き込み・ 読み込みができません。devモードではこれが最初からunsealedになっているわけなので、気軽に試せる状態になっています。

んで、アンシールします。

# ./vault unseal -tls-skip-verify
Key (will be hidden):
Sealed: true
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0

キーを聞かれるので、initのときに表示されたやつを入力します。3回一気に聞かれるわけではなく、unsealを複数回実行する感じです。 Key Thresholdが3になっているので、3回成功させないと、unsealedになりません。選ばれし5人がそれぞれ鍵を持っていたら、3人成功しないとダメという。

3回成功したので、Sealedがfalseになりました。

# ./vault status -tls-skip-verify
Sealed: false
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0
High-Availability Enabled: false

次に、ユーザ認証をします。initのときに聞かれたRootトークンを使います。

# ./vault auth -tls-skip-verify aaaaaaa-bbbbb-cccc-ddd-eeeeee
Successfully authenticated! The policies that are associated
with this token are listed below:
root

そしたら、書き込んでみましょう。

# ./vault write -tls-skip-verify secret/password value=itsasecrfet
Success! Data written to: secret/passwor

書込みできました。 このとき、以下のように、「-tls-skip-verify」の位置を間違えるとエラるので気をつけましょう。かなりハマりました。

./vault write secret/password value=itsasecrfet -tls-skip-verify

データはこんな感じ。

# tree key.txt/
key.txt/
|-- barrier
|   `-- _init
|-- core
|   |-- _audit
|   |-- _auth
|   |-- _mounts
|   `-- _seal-config
|-- logical
|   `-- bfafa5e6-3517-0155-2ae2-9bd909d4d24e
|       `-- _password
`-- sys
    `-- token
        |-- _salt
        `-- id
            `-- _38e970adbe4f3760ff5be8c73fb0eca903b9f5fc

読み込んでみます。読み込めました。

# ./vault read -tls-skip-verify -format=json secret/password | jq .data.value
"itsasecrfet"

では、シールはってみましょう。

# ./vault seal -tls-skip-verify
2015/06/04 08:41:59 [INFO] core: pre-seal teardown starting
2015/06/04 08:41:59 [INFO] rollback: stopping rollback manager
2015/06/04 08:41:59 [INFO] core: pre-seal teardown complete
2015/06/04 08:42:00 [INFO] core: vault is sealed
Vault is now sealed.

はれました。

# ./vault status -tls-skip-verify
Sealed: true
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0

もう読み込むことはできません。

#  ./vault read -tls-skip-verify -format=json secret/password | jq .data.value
Error reading secret/password: Error making API request.
URL: GET https://127.0.0.1:8200/v1/secret/password
Code: 500. Errors:
* Vault is sealed

ちなみに、違うデータを書き込んだときは、以下のようになってました。

# tree key.txt/
key.txt/
|-- barrier
|   `-- _init
|-- core
|   |-- _audit
|   |-- _auth
|   |-- _mounts
|   `-- _seal-config
|-- logical
|   `-- bfafa5e6-3517-0155-2ae2-9bd909d4d24e
|       |-- _password
|       `-- _password2
`-- sys
    |-- expire
    |   |-- id
    |   |   `-- secret
    |   |       `-- password
    |   |           |-- _051ba602-cc04-3074-e0a8-401600381d2d
    |   |           |-- _72db7543-08d4-9e17-3bbd-dacac95f6506
    |   |           |-- _7faa1454-4a54-de40-952a-b5e3f9547e97
    |   |           |-- _caf9e39f-a948-5176-d322-195782bb743c
    |   |           `-- _ccec0504-9a11-af64-83ca-8ef07d7405f1
    |   `-- token
    |       `-- 38e970adbe4f3760ff5be8c73fb0eca903b9f5fc
    |           |-- _03db253e2a55f3ac46ab8e85fd38d454357aea1f
    |           |-- _5844abda2569b0b272c2eb98ad4021d03a55479c
    |           |-- _6e23083f079c01381deb25a6f03b61748fd1539a
    |           |-- _a5702a5f6dd8eb7c734aee4c10d4679a62255e7a
    |           `-- _de9da50379db584993555d2cf7cdb78587520b0c
    `-- token
        |-- _salt
        `-- id
            `-- _38e970adbe4f3760ff5be8c73fb0eca903b9f5fc

バックアップを取るとするなら、このディレクトリすべて取らないとダメかもですね。まだ試してないので、是非試してみて教えて下さい。

終わりに

試しに動かしてみましたが、以下のような印象を受けました。

  • 当然ですが、ドキュメントがほとんどない。人柱感満載。
  • consulなどのクラスタに保存とかできるので、冗長化とか考えず、思ったよりは簡単に暗号化・復号できた
  • オンメモリとかだとサーバ落ちたときつらそうなので、おそらくHAの機能を使うことになりそう(使ったことない
  • ファイルだと、複数人で編集するときちょっと想定したほうが良さそう
  • ドキュメント見ると動的AWSユーザ作成とか色々できるようだけど、運用ではシンプルに使ったほうが楽かもという印象を受けた
  • マスターパスワードが必要ないので、多少セキュリティ劣るものの、自動化には組み込みやすそう
  • そういう意味でプロビジョニングツールと連携させて、復号してファイルを配置とかできそう

という感じで、社内レポジトリに生データを置かず、うまく運用できたらいいかなという気もしています。使うか使わないかの検討は当然必要ですが、セキュリティ対策の一環として、検討してみるのもいいかなと思った次第です。

間違い等あれば、コメント頂ければと思います。ではでは!