HashiCorp Vaultの認証方法を変更しユーザー名とパスワードでログインする

はじめに

Vault Serverの認証方式はデフォルトでToken方式であり、Tokenとして設定された文字列を入力することで、対象の権限でログインすることが出来ます。これは無効にすることは出来ません。しかし、他の認証方法を用いることが出来ます。使える認証方式は以下の通りです。

  • AppRole
  • AWS
  • Google Cloud
  • Kubernetes
  • GitHub
  • LDAP
  • Okta
  • RADIUS
  • TLS Certificates
  • Tokens
  • Username & Password

これらの認証方式によって認証されることで、内部的にはトークンを取得した上でトークンを使ってログインしています。

さて、今回は手始めに、一番簡単なユーザー名とパスワードを使ったログインをしてみます。

やってみた

準備

以前の記事でもやっていたとおりに、サーバ側でVault Serverを起動しておきます。

クライアント側では、Vault Serverのアドレスを環境変数に設定します。

$ export VAULT_ADDR='https://EC2のパブリックIPアドレス:8200'

initializeします。

$ vault operator init -tls-skip-verify

Unsealして使えるようにします。

$ vault operator unseal -tls-skip-verify
$ vault operator unseal -tls-skip-verify
$ vault operator unseal -tls-skip-verify

RootのTokenを使ってloginします。

$ vault login -tls-skip-verify 6bcc76e3-98d8-3d5d-a8e1-a15ad3cc9ac8

認証方式の追加

さて、ユーザー名とパスワードを使った認証方式を追加します。以下の通り、type=userpassでuserpassという名前のPathを追加しました。

$ vault write -tls-skip-verify sys/auth/userpass type=userpass
Success! Data written to: sys/auth/userpass

確認。userpassというPathが追加されています。

$ vault auth list -detailed -tls-skip-verify
Path         Type        Accessor                  Plugin    Default TTL    Max TTL    Replication    Seal Wrap    Description
----         ----        --------                  ------    -----------    -------    -----------    ---------    -----------
token/       token       auth_token_ebbda759       n/a       system         system     replicated     false        token based credentials
userpass/    userpass    auth_userpass_ee9e5e6a    n/a       system         system     replicated     false        n/a

ユーザーの追加

それではユーザーを追加してみます。

$ vault write -tls-skip-verify auth/userpass/users/smokeymonkey password=secret
Success! Data written to: auth/userpass/users/smokeymonkey

Rootのログオフ

ログオフする場合は、作業ユーザーのホームディレクトリに存在する.vault-tokenを削除します。

$ rm .vault-token

ちなみに他のユーザーでログインすると自動的に.vault-tokenが上書きされるので削除する必要は無いのですが、念のためです。

追加したユーザーでログイン

それでは追加したユーザーでログインします。

$ vault login -tls-skip-verify -method=userpass username=smokeymonkey
Password (will be hidden):
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                  99effe89-a6ad-01f0-0dcd-add2b553a2bc
token_accessor         9d7b1428-db20-6c13-14c1-ef53203c0928
token_duration         768h
token_renewable        true
token_policies         [default]
token_meta_username    smokeymonkey

さて、Rootでログインした場合との違いを確認してみましょう。

Key                Value
---                -----
token              1e80aa56-7cfe-cc3a-32d0-2699031f0130
token_accessor     58dc52cd-be1a-54e6-22a6-a4758af28d76
token_duration     ∞
token_renewable    false
token_policies     [root]

Rootの場合はtoken_durationが無限、token_renewableはfalse、token_policiesがrootになっています。引き換え、追加したユーザーの場合はtoken_durationが768h、token_renewableはtrue、token_policiesがdefaultになっています。なので追加ユーザーだとTokenに期限が決まっていますし、Tokenのリニューアルが可能だし、ポリシーとしてRoot並の権限は持っていません。実際システム変更に関わるコマンドを実行してもパーミッションエラーになります。

$ vault auth tune -tls-skip-verify -default-lease-ttl=30m userpass/
Error tuning auth method userpass/: Error making API request.

URL: POST https://54.95.248.153:8200/v1/sys/mounts/auth/userpass/tune
Code: 403. Errors:

* permission denied

認証方式の設定を変更する

さて、認証方式には2つの設定要素があります。

  • -default-lease-ttl ... デフォルトで設定される、TokenのTTL。
  • -max-lease-ttl ... 最大設定可能なTokenのTTL。

試しに-default-lease-ttlを変更してみます。この作業はRootにて行います。

$ vault auth tune -tls-skip-verify -default-lease-ttl=30m userpass/
Success! Tuned the auth method at: userpass/

追加したユーザーでログインしてみます。

$ vault login -tls-skip-verify -method=userpass username=smokeymonkey
Password (will be hidden):
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                  a689ae46-0cec-e160-9830-4260c07aec9d
token_accessor         ad0a403c-94ad-d51b-1964-eabd5a19dd7f
token_duration         30m
token_renewable        true
token_policies         [default]
token_meta_username    smokeymonkey

token_durationが768hから30mに変更されたことが分かります。

ユーザーの削除

ユーザーの削除はvault deleteコマンドでkey自体を削除します。

$ vault delete -tls-skip-verify auth/userpass/users/smokeymonkey
Success! Data deleted (if it existed) at: auth/userpass/users/smokeymonkey

削除するともうログイン出来ません。

$ vault login -tls-skip-verify -method=userpass username=smokeymonkey
Password (will be hidden):
Error authenticating: Error making API request.

URL: PUT https://54.95.248.153:8200/v1/auth/userpass/login/smokeymonkey
Code: 400. Errors:

* invalid username or password

認証の削除

追加した認証(userpass)を削除します。

$ vault auth disable -tls-skip-verify userpass/
Success! Disabled the auth method (if it existed) at: userpass/
[sasakidaisuke@HL00106 ~]$ vault auth list -detailed -tls-skip-verify
Path      Type     Accessor               Plugin    Default TTL    Max TTL    Replication    Seal Wrap    Description
----      ----     --------               ------    -----------    -------    -----------    ---------    -----------
token/    token    auth_token_ebbda759    n/a       system         system     replicated     false        token based credentials

これでユーザー名とパスワードでの認証は使えなくなりました。

さいごに

分かったことは以下の通りです。

  • 認証のベースはTokenである。
  • 他の認証方式が使える。内部的にはTokenがやり取りされている。
  • 認証に対して期限が設定できる。
  • ポリシーによって権限の制限が出来る。

他の認証方式についての確認と、ポリシーによるアクセスコントロールについて、今後調べていきたいと思います。

合わせて読みたい