3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JX通信社Advent Calendar 2018

Day 15

GoogleアカウントからVaultにログインしてみた

Last updated at Posted at 2018-12-15

JX通信社 Advent Calendar 2018、15日目担当のkain_jyです。

社内インフラでも利用しているVaultの便利機能について紹介します。

Vaultとは

Vaultとは機密情報を管理するためのソフトウェアです。パスワードを暗号化して保存することができたり、AWS/GCPの一時的認証情報を簡単に取得することができます。

会社ではCIサーバからクラウドプラットフォームの認証情報の取得や、VPNで使うクライアント証明書の発行といった用途で使っています。

やりたいこと

Vaultがどんなにセキャアに機密情報を保つことができても、利用する側がVaultへのログインを甘々にしていたら意味がありません。

Vaultへのログインをどうするか、以前から悩まされていました。

会社にはLDAPやRADIUSといった認証基盤がなく、社内システムへのログインは基本、Googleアカウント(G Suite)を利用しています。

GoogleアカウントからもVaultへログインできればいいなとと思っていたところ、Vault 0.10.4からJWT認証に対応していました。GoogleアカウントはOpenID Connectに対応してるため、JWT認証を利用したVaultへのログインが実現できるというわけです。

やってみた

まず、Googleアカウントの認証を使うために、まずはOAuthクライアントIDを発行します。

1.jpg 2.jpg 3.jpg 4.jpg

クライアントID・クライアントシークレットをメモっておきます。

次に、Vaultの設定を行います。

$ vault server -dev  # vault開発サーバを立ち上げ

# Vault CLIを利用するためにアドレスとRoot Tokenを設定
$ export VAULT_ADDR='http://127.0.0.1:8200'
$ vault auth {{ Root Token }}

# JWT認証を有効化
$ vault auth enable jwt

# OpenID Connect Discovery URLを設定
# Googleアカウントの場合は `https://accounts.google.com` を指定
$ vault write auth/jwt/config \
    oidc_discovery_url="https://accounts.google.com"

# VaultのRoleを設定
$ vault write auth/jwt/role/my-role \
    bound_audiences="{{ GoogleのクライアントID }}" \
    user_claim="email" \
    policies=default \
    ttl=1h

設定は以上です。

それと、Googleアカウントの認証するため、コールバックを受け入れるためにWebサーバを立てておきます。

$ python3 -m http.server 5000                                                         
Serving HTTP on 0.0.0.0 port 5000 (http://0.0.0.0:5000/) ...

では、実際にGooleアカウントから認証してみましょう。認証のために踏んでもらうURLはこちらです。

https://accounts.google.com/o/oauth2/v2/auth?
   client_id={{ GoogleのクライアントID }}&
   response_type=code&
   scope=openid%20email&
   redirect_uri=http://localhost:5000/callback&
   hd=example.com   # G Suiteを利用している場合はドメインを指定
スクリーンショット_2018-12-15_15_46_30.jpg

認証後に、以下のようなコールバックが返ってきます。

http://localhost:5000/callback?code={{ 認証コード、これをメモ  }}&...

受け取った認証コード( code )からJWTを取得します。

$ http -f POST https://www.googleapis.com/oauth2/v4/token \
    code="{{ 認証コード }}" \
    client_id="{{ GoogleのクライアントID }}" \
    client_secret="{{ Googleのクライアントシークレット }}" \
    redirect_uri="http://localhost:5000/callback" \
    grant_type="authorization_code"

すると、以下のようなレスポンスが返ってきます。

{
    "access_token": "...",
    "expires_in": 3600,
    "id_token": "{{ JWT、これをメモ }}",
    "scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.me",
    "token_type": "Bearer"
}

id_token がJWTです。

JWTを使って、Vaultの認証トークンを取得します。

$ http -v POST $VAULT_ADDR/v1/auth/jwt/login \
    role="my-role" jwt="{{ JWT}}"

このレスポンスにある auth.client_token がVaultの認証トークンです。

$ vault login "{{ Vaultの認証トークン }}"
Success! You are now authenticated. The token information displayed below

ログインできたことを確認しました!

まとめ

GoogleアカウントからVaultにログインする方法を紹介しました。Googleアカウント(G Suite)を利用している方は、よりセキュアにVaultを利用できます。

いまのところ、 VaultのJWT認証はUIに対応していないません 。実際に利用する際は、 Googleアカウントの認証コード → JWT → Vaultの認証トークンを取得するフローを自動化 しておく必要があります。会社では簡単なWebアプリを立てて、実際にG SuiteからVaultにログインする仕組みを整えています。

GoogleアカウントとVaultを利用している方は是非お試しください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?