Vaultを触ってみる
ZOZOテクノロジーズ #1 Advent Calendar 2020 21日目です。
今回はHashiCorpがリリースしているVaultについて触ってみました。
Vaultについて
Vaultはパスワードやアクセストークン等、機密情報を管理するソフトウェアです。 役割としてはgoogleのSecret MagegerやawsのSecrets Managerに近いです。
またVaultの機能として一時的にサーバーへアクセスできるTokenを発行するOne-Time Tokenの機能や各機密情報に関してユーザーの権限を設定することができるPolicyの機能があります。
Vaultのアーキテクチャについては下記の図になります。
Architecture | Vault by HashiCorp
アーキテクチャについては下記の特徴があります。
Vault間で通信するデータは全てbarrierを通して暗号化され、通信される。
ストレージに保存される機密情報は暗号化され保存されるようになる。
Vaultの構築
今回はDocker上に構築を行います。 DockerのVersionに関しては下記になります。
- Docker:20.10.0
構築手順に関してはGetting Startedの部分を参考に構築します。
Vaultの起動の前にConfigファイルを設定します。Configファイルを設定しなくてもVaultを起動することができますが。デフォルトではUIが有効になっておらずAPIサーバのみ起動します。今回はUIを有効にして利用したいのでConfigファイルを有効にします。
VaultのConfigファイルの記述はHashiCorpが提供しているHCLになります。
今回は下記のような設定で動かします
storage "file" { path = "./vault/data" } listener "tcp" { address = "0.0.0.0:8201" tls_disable = 1 } api_addr = "http://0.0.0.0:8200" ui = true
vaultのWebUIはデフォルトでは有効になっていないため設定で有効にする必要があります。 最終的に下記のDockerfileでまとまりました
FROM ubuntu:latest RUN apt update RUN apt install -y curl gnupg gnupg2 lsb-release RUN curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add - && \ apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" && \ apt-get update && apt-get install vault COPY ./config.hcl ./config.hcl CMD vault server -dev -config=config.hcl
作成したDockerfileでコンテナを作成し、localhost:8001/ui
にアクセスすると下記のUIが表示されます。
今回はdevモードで起動しているのでコンテナを起動した際のConsoleに表示されているTokenを用いることでVaultにログインできます。
無事ログインできたことが確認できました。
Secrets Enginesの設定
次にSecrets Enginesを用いてKey-Value Store(KVS)を作成してみます。Secrets Enginesの機能はPath形式でVaultにおいて機密情報をどこに保存するか設定できる機能になります。保存する場所はConsulやRabbitMQ等、様々なミドルウェアと連携できます。
今回はkv/hoge
のPath名で、sample:sampleのKey-Value(KV)を保存しました。
policyの設定
次にpolicyの設定を行ってみます。
policyの設定はPoliciesタブで設定することができます。
policyの記述に関してもHCLで記述することができます。
許可されたユーザがkv/
のPathを閲覧できるようにしたいので下記の設定を作成します。
付与した権限の詳細に関しては下記にまとまってます。
Authentication Methodsの設定
次にAuthentication Methodsを設定します。Authentication Methodsは名前の通り、認証方法を設定し、認証を利用するユーザーを管理することができます。認証方法はJwt認証やGithubの認証を使って認証する方法を設定できます。今回はUsername & Passwordで認証する方法を試してみます。
作成したユーザーは下記になります。sampleuserという名前で、先程作成したtest policyをアタッチしています。なのでこのユーザーはkv/
のPathのみ閲覧することができます。追加でBOBというユーザを作成してます。こちらのユーザは特に何にもpolicyをアタッチしてないのでkv/
のPathは閲覧できないように設定してます。
試しにログインして確認してみます。
sampleuserの画面
BOBの画面
sampleuserでkv/
のPath以下に配置されているKVを閲覧することができました。また、別途作成したBOBのアカウントではkv/
のPath以下は閲覧できないことがわかりました。
ちなみにBOBの画面に表示されているcubbyholeについてはユーザーアカウント毎にデフォルトで用意されているKVSになります。こちらで設定した値はユーザー毎にスコープされます。
https://www.vaultproject.io/docs/secrets/cubbyhole
まとめ
今回はVaultをdevモードで構築してみました。
awsやgcpやlocalで保存しているパスワードなどの情報をvaultで一括管理できるので便利だなと思いました。
しかしawsのsecrets magegerやgcpのsecret magegerと違い、Vaultを自前で運用する必要がでてくるので導入にはそれなりのコストが必要と思いました。
まだVaultの機能であるOne-Time Tokenの機能など、試していない機能もいくつか存在するので時間がある際に試してみようと思います。