Vaultに対してHTTPアクセスをしてみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

VaultにHTTPでアクセスしましょう

この記事では、Vaultのdevサーバを起動してアクセスしてみました。
ですが、devサーバはあくまでもテスト用なので、本番環境で使用することはできません。
今回は通常のサーバを起動し、外部からHTTPでアクセスしてみましょう。

Vaultセットアップ〜HTTPでアクセスできるまで

1.EC2インスタンスにVaultとConsulをインストール

今回は外部からアクセスするので、EC2を使用します。t1.microでかまわないので、Amazon Linuxで起動しましょう。
セキュリティグループは、sshと後で使用する8200番ポートをあけておきます。
次に、必要なソフトをEC2にダウンロードします。

ここからConsul(分散環境のサービス変更と設定ツール)を、
そして、ここからVaultをダウンロードします。
※64bit Linux用

wgetでConsulとVaultをダウンロードするか、ローカルにダウンロードしてscpでアップロードしてもOKです。

% scp -i <sshキー> <アップロードするファイルパス> ec2-user@<サーバのアドレス>:~

sshでEC2にログインしましょう。

% ssh -i <sshキー> ec2-user@<サーバのアドレス>

EC2にログインしたら、ConsulとVaultのzipを解凍し、パスのとおった場所に移動させます。
vaultコマンドとconsulコマンドが実行できれば準備OKです。

2.サーバの起動

今回はConsulをbackendにするため、consul agentを起動しておきます。

% consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul

3.設定ファイルを作成

次は、Vaultの設定ファイルを「seerver.hcl」という名前で作成します。下記のように記述してください。

backend "consul" {
  advertise_addr = "http://<サーバのIP>:8200" 
}

listener "tcp" {
  address = "0.0.0.0:8200" 
  tls_disable = 1 
}

advertise_addrには、他のVaultからアクセスする際の自分のアドレスを記述し、
listenerのaddressにはVaultの待ち受けアドレスとポートを指定します。 また、tls_disableに値を設定した場合、HTTP接続になります。

4.Vaultサーバ起動

では、Vaultサーバを起動しましょう。vault serverコマンドで、さきほどの設定ファイルを指定します。

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

         Log Level: info
             Mlock: supported: true, enabled: true
           Backend: consul (HA available)
 Advertise Address: http://<ip>:8200
        Listener 1: tcp (addr: "0.0.0.0:8200", tls: "disabled")

なお、vault serverコマンドを実行した際、下記のようなエラーが表示されるかもしれません。

Error initializing core: failed to lock memory: cannot allocate memory
・
・

その際には、次のコマンドを実行し、mlockシステムコールを許可してあげる必要があるようです。

% sudo setcap cap_ipc_lock=+ep $(readlink -f $(which vault))

5.Vaultの初期化

サーバが起動したら、コンソールでアクセスしてみます。
VAULT_ADDRを下記のように設定しましょう。

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

そして、vault initコマンドで初期化を行います。

% vault init
Key 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key 2: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key 3: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key 4: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key 5: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Initial Root Token: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

これを実行すると、5つのKeyとInitial Root Tokenが表示されます。
これは非常に重要なので、なくさないようにしてください。(アクセスできなくなります)

6.unsealeする

では、httpでアクセスしてみましょう。
http://<サーバのip>:8200/v1/secret/foo
とブラウザで入力すると、下記のように表示されます。

{"errors":["Vault is sealed"]}

アクセスに失敗してしまいました。
Vaultサーバは初期状態ではseale状態になっているので、unseale作業をしてあげなければいけません。
vault unsealコマンドを実行し、さきほどのkeyを入力します。この作業を3回行うことで、Vaultにアクセス可能になります。
(この回数はvault init時の-key-thresholdオプションにて変更可能)

% vault unseal
・
・

7.トークン発行

さて、再度httpアクセスしてみます。すると今度は次のようなメッセージが表示されました。

{"errors":["missing client token"]}

どうやらトークンがないといわれているようなので、トークンを発行してあげましょう。
まずはトークン発行時に指定できる、ポリシーファイルを「acl.hcl」という名前で作成します。

path "secret/*" {
  policy = "write"
}

path "secret/foo" {
  policy = "read"
}

これは、「secret以下は保存可能かつsecret/fooは取得のみ」というポリシーになります。
ポリシーファイルをつくったら、vault authでルート化し、テストデータの登録とポリシーの適用を行いましょう。

% vault auth <Root Token> //root化
% vault write secret/foo value=hello //とりあえずテスト値登録
% vault policy-write secret acl.hcl //ポリシー適用
Policy 'secret' written.

では、トークンを発行をしてみましょう。vault token-createでトークンを発行しています。
ここでは、さきほどのポリシーの適用と共に、いくつかオプションを指定しています。

% vault token-create -lease="1h" -use-limit=1 -policy="secret"
Key             Value
token           <発行されたトークン>
token_duration  3600
token_renewable true
token_policies  [secret]

leaseは有効期限で、このトークンは1時間だけ有効になります。
また、use-limitはトークンを使用できる回数で、1回限り有効になっています。

8.HTTPアクセスしてみる

では、先ほど発行されたトークンをつかってhttpアクセスしてみます。
DHCとかのツールを使い、ヘッダーに
X-Vault-Token: <発行されたトークン> を指定して、
http://<サーバのip>:8200/v1/secret/foo
にアクセスしてみてください。
1回目は下記のような感じでデータが返ってくるはずです。

{
"lease_id": "secret/foo/xxxxxxxxxxxxxxxxx",
"renewable": false,
"lease_duration": 2592000,
"data":{
"value": "hello"
},
"auth": null
}

しかし、もう一度リクエストをおくってみると、403エラーになります。
このように、トークンに有効期限や回数を指定できるので、用途に応じて安全にトークンを発行できます。

まとめ

今回はVaultサーバでのポリシー設定やトークン発行を行い、httpアクセスを試してみました。
これ以外にもAWSのIAMを発行したりとかいろいろできるので、試してみたいと思います。

参考サイトなど