Vaultを触ってみる

ZOZOテクノロジーズ #1 Advent Calendar 2020 21日目です。
今回はHashiCorpがリリースしているVaultについて触ってみました。

Vaultについて

Vaultはパスワードやアクセストークン等、機密情報を管理するソフトウェアです。 役割としてはgoogleのSecret MagegerやawsのSecrets Managerに近いです。
またVaultの機能として一時的にサーバーへアクセスできるTokenを発行するOne-Time Tokenの機能や各機密情報に関してユーザーの権限を設定することができるPolicyの機能があります。 Vaultのアーキテクチャについては下記の図になります。

https://www.vaultproject.io/img/layers.png 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が表示されます。 f:id:jon20:20201221050948p:plain 今回はdevモードで起動しているのでコンテナを起動した際のConsoleに表示されているTokenを用いることでVaultにログインできます。 f:id:jon20:20201221051212p:plain 無事ログインできたことが確認できました。

Secrets Enginesの設定

次にSecrets Enginesを用いてKey-Value Store(KVS)を作成してみます。Secrets Enginesの機能はPath形式でVaultにおいて機密情報をどこに保存するか設定できる機能になります。保存する場所はConsulやRabbitMQ等、様々なミドルウェアと連携できます。
今回はkv/hogeのPath名で、sample:sampleのKey-Value(KV)を保存しました。 f:id:jon20:20201221081930p:plain

www.vaultproject.io

policyの設定

次にpolicyの設定を行ってみます。 policyの設定はPoliciesタブで設定することができます。 policyの記述に関してもHCLで記述することができます。 許可されたユーザがkv/のPathを閲覧できるようにしたいので下記の設定を作成します。 f:id:jon20:20201221082521p:plain

付与した権限の詳細に関しては下記にまとまってます。

www.vaultproject.io

Authentication Methodsの設定

次にAuthentication Methodsを設定します。Authentication Methodsは名前の通り、認証方法を設定し、認証を利用するユーザーを管理することができます。認証方法はJwt認証やGithubの認証を使って認証する方法を設定できます。今回はUsername & Passwordで認証する方法を試してみます。 作成したユーザーは下記になります。sampleuserという名前で、先程作成したtest policyをアタッチしています。なのでこのユーザーはkv/のPathのみ閲覧することができます。追加でBOBというユーザを作成してます。こちらのユーザは特に何にもpolicyをアタッチしてないのでkv/のPathは閲覧できないように設定してます。 f:id:jon20:20201221083232p:plain

試しにログインして確認してみます。
sampleuserの画面 f:id:jon20:20201221083722p:plain BOBの画面 f:id:jon20:20201221084103p:plain

sampleuserでkv/のPath以下に配置されているKVを閲覧することができました。また、別途作成したBOBのアカウントではkv/のPath以下は閲覧できないことがわかりました。

ちなみにBOBの画面に表示されているcubbyholeについてはユーザーアカウント毎にデフォルトで用意されているKVSになります。こちらで設定した値はユーザー毎にスコープされます。

https://www.vaultproject.io/docs/secrets/cubbyhole

まとめ

今回はVaultをdevモードで構築してみました。 awsgcpやlocalで保存しているパスワードなどの情報をvaultで一括管理できるので便利だなと思いました。 しかしawsのsecrets magegerやgcpのsecret magegerと違い、Vaultを自前で運用する必要がでてくるので導入にはそれなりのコストが必要と思いました。
まだVaultの機能であるOne-Time Tokenの機能など、試していない機能もいくつか存在するので時間がある際に試してみようと思います。