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がやり取りされている。
- 認証に対して期限が設定できる。
- ポリシーによって権限の制限が出来る。
他の認証方式についての確認と、ポリシーによるアクセスコントロールについて、今後調べていきたいと思います。
合わせて読みたい
- HashiCorp Vaultの基礎知識と導入
- HashiCorp Vault ServerをAmazon EC2に構築する
- HashiCorp VaultのConfigurationについて
- HashiCorp Vault Serverをオレオレ証明書を使ってTLS対応にする
- Amazon S3をHashiCorp Vault Serverのストレージにする
- HashiCorp Vault Serverのストレージにファイルシステムを使う
- Amazon Aurora MySQLをHashiCorp Vault Serverのストレージにする
- Amazon Aurora PostgreSQLをHashiCorp Vault Serverのストレージにする