Google 계정에서 Vault에 로그인해 보았습니다.

7334 단어 VaultgoogleOpenID
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를 발급합니다.









클라이언트 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 계정을 인증하기 위해 콜백을 수락하기 위해 웹 서버를 설정합니다.
$ python3 -m http.server 5000                                                         
Serving HTTP on 0.0.0.0 port 5000 (http://0.0.0.0:5000/) ...

그렇다면 실제로 Google 계정에서 인증해 보겠습니다. 인증을 위해 밟는 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を利用している場合はドメインを指定



인증 후에 다음과 같은 콜백이 반환됩니다.
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 인증 토큰을 얻는 흐름을 자동화해야합니다. 회사는 간단한 웹 앱을 설정하고 실제로 G Suite에서 Vault에 로그인하는 메커니즘을 갖추고 있습니다.

Google 계정과 Vault를 사용하는 분은 꼭 사용해 보세요.

좋은 웹페이지 즐겨찾기