🔑

GCPで有効期限を短くした認証トークンをPythonで発行する

2024/07/11に公開

はじめに

Google Cloud Platform (GCP)を使用する際、APIリクエストの認証に使用するトークンの有効期限は、デフォルトで1時間に設定されています。しかし、セキュリティを強化するために、より短い有効期限のトークンを使用したいケースがあります。

基本的には、公式ドキュメントにやり方が書いてあります。

https://cloud.google.com/iam/docs/create-short-lived-credentials-direct?hl=ja#console

権限借用による解決策

OAuth 2.0のアクセストークンを発行する場合は、権限借用を利用することで有効期限を変更したアクセストークンを発行できます。

権限借用とは

GCPでは、あるサービスアカウントから権限を一時的に「借用」することができます。これを「権限借用」と呼びます。

権限借用の仕組み

  1. ソースアカウント(借用する側)が、ターゲットサービスアカウント(借用される側)の権限を借用するリクエストを行います。
  2. GCPは、ソースアカウントがターゲットアカウントの権限を借用する権限を持っているかを確認します。
  3. 権限が確認されると、GCPは借用された権限を持つ短期的な認証情報を発行します。
  4. この短期的な認証情報を使用して、必要なAPI呼び出しを行います。

実装方法

必要なライブラリ

まず、以下のPythonライブラリをインストールします:

$ poetry install google-auth google-auth-oauthlib python-doten

実装

以下のPythonコードでは、権限借用を利用して3分間だけ有効な認証トークンを発行しています。

import json
import os
from dotenv import load_dotenv
from google.oauth2 import service_account
from google.auth.transport.requests import Request
from google.auth import impersonated_credentials

load_dotenv()

# トークンの有効時間(秒)
TOKEN_LIFETIME = 180  # 3分

# リクエストするAPIに必要なスコープ
scopes = [
    "https://www.googleapis.com/auth/cloud-platform",
]

# 環境変数からサービスアカウント情報を取得
service_account_info = os.getenv("GOOGLE_APPLICATION_CREDENTIALS")
if service_account_info is None:
    raise Exception("GOOGLE_APPLICATION_CREDENTIALS must be set as env")

## サービスアカウントの情報から認証情報を生成
source_credentials = service_account.Credentials.from_service_account_info(
    json.loads(service_account_info),
    scopes=scopes,
)

# 権限を借用して新しい認証情報を作成
target_credentials = impersonated_credentials.Credentials(
    source_credentials=source_credentials,
    target_principal=source_credentials.service_account_email,
    target_scopes=scopes,
    lifetime=TOKEN_LIFETIME,
)

# アクセストークンを取得
target_credentials.refresh(Request())
token = target_credentials.token
print(f"Generated access token: {token}")
print(f"Token lifetime: {target_credentials.expiry}")

Discussion