App Engineで特定のエンドポイントのみ認証をかける方法

 2024.08.17 XIMIX 重永

はじめに

App Engineにデプロイしたサービスで、管理者用エンドポイントに、権限のあるアカウントのみにリクエストを許可する、簡単な認証方法はないか調査した結果を記述します。

App Engineとは

Google App Engineは、Google Cloudの一部として提供される完全マネージドのプラットフォームです。開発者はインフラの設定や管理を気にせずに、コードのデプロイメントとスケーリングが可能です。自動スケーリング機能により、トラフィックの変動に柔軟に対応し、必要なリソースを自動的に調整します。標準環境とフレキシブル環境の2つのランタイムオプションがあり、Python、Java、Node.js、Goなど様々なプログラミング言語に対応しています。また、課金は使用したリソースに応じて行われます。

やりたいこと

  • App Engine Standard環境上にデプロイされている、複数のエンドポイントを持つサービスで、特定のエンドポイントのみ認証したい
  • 管理者用のエンドポイントのため、コストはかけず簡単に設定したい

 構成

  • 環境:App Engine Standard
  • ランタイム:python3.9
  •  エンドポイント構成
    •  /admin
      •  管理者用エンドポイントで、権限のあるアカウントのみアクセス可能としたい
      • 認証あり
    • /user
      • ユーザー用エンドポイントで、誰でもアクセス可能としたい
      • 認証なし
    • /(ルート)
      • 認証なし

ソリューション

app.yamlの login:admin を使用して、以下のロールを持つアカウントのみリクエストできるようにしました。

  • オーナー
  • 編集者
  • 閲覧者
  • App Engine 管理者

上記のロールを持たないアカウントの場合は、リクエストを拒否し、HTTP 401ステータスコードとエラーメッセージを返します。

解説とソースコード

main.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

@app.route("/admin")
def admin():
    return "Hello Admin!"

@app.route("/user")
def user():
    return "Hello User!"

if __name__ == "__main__":
  app.run(host="127.0.0.1", port=8080, debug=True)

パスに応じてレスポンスの値を変える、簡単なコードとなります。

requirements.txt

Flask==3.0.0

app.yaml

runtime: python39
app_engine_apis: true

handlers:
- url: /admin
  login: admin
  auth_fail_action: unauthorized
  script: auto

- url: /.*
  secure: always
  script: auto
本記事のポイントである認証設定の部分のみ解説します。
  • app_engine_apis: true
    •  auth_fail_action を使用するのに必要なため、設定
  •  /admin
    • login: admin
      • 管理者アカウント(オーナー、編集者、閲覧者、App Engine 管理者のいずれかのロールを持つアカウント)のみリクエストを許可します
      • 他の設定値に、Googleアカウントを持つユーザーのみリクエストを許可する required があります
    • auth_fail_action: unauthorized
      • リクエストを拒否し、HTTP 401 ステータス コードとエラー メッセージを返します
      • 他の設定値に、ユーザーを Google ログインページまたは /_ah/login_required(OpenID 認証を使用している場合)にリダイレクトさせてログインを促す、 redirect があります

結果

必要なロールを持つアカウント

まずは、必要なロールを持つアカウントでアクセスします。

/user

スクリーンショット 2024-08-08 19.31.59

期待通り、リクエストに成功しました。

/admin

スクリーンショット 2024-08-08 19.32.10

期待通り、リクエストに成功しました。

必要なロールを持たないアカウント

/user

スクリーンショット 2024-08-08 19.33.51

期待通り、リクエストに成功しました。

/admin

スクリーンショット 2024-08-08 19.32.16

期待通り、リクエストが拒否され、Unauthorizedとなりました。

以上で、適切なロールを持つユーザーのみリクエストができるようになりました。

その他、検討したソリューション

最後に、その他検討したソリューション案と不採用とした理由を簡単に記述します。

  • IAP(Identity-Aware Proxy)
    •  概要
      • IAP(Identity-Aware Proxy)は、Google Cloudのサービスで、アプリケーションやリソースへのアクセスをユーザーの身元に基づいて制御します。このプロキシは認証と承認の層を追加し、特定の条件を満たすユーザーのみがアクセスできるように設定できます。IAPは、Googleアカウントや企業のディレクトリサービスと統合されており、シングルサインオンや多要素認証をサポートします。これにより、企業は内部のアプリケーションやAPIを安全に公開でき、ゼロトラストセキュリティモデルの実現に役立ちます。
    • 不採用理由
      • 特定のエンドポイントのみの認証を設定することはできなかったため
  • API Gateway
    • 概要
      • API Gatewayは、Google Cloudのサービスで、APIの管理、監視、保護を簡単に行うためのエントリーポイントを提供します。一元的なエントリーポイントを設けることで、APIのトラフィック制御、認証、承認、レート制限、監視、ロギングなどを統合的に管理できます。API Gatewayは、OpenAPI仕様をサポートし、APIのライフサイクル全体を効率的に管理できるツールを提供します。これにより、開発者はセキュリティとパフォーマンスを確保しつつ、迅速なアプリケーション開発とデプロイを実現できます。料金は使用量に基づいて計算されます。
    • 不採用理由
      • 特定のエンドポイントのみの認証を設定することはできなかったため
  • Cloud Endpoint Framework
    •  概要
      • Cloud Endpointsは、Google Cloudが提供するAPI管理サービスで、アプリケーションのAPIを簡単にデプロイ、保護、監視、管理することができます。Cloud Endpointsは、OpenAPI(Swagger)やgRPCと互換性があり、API仕様を定義することで、迅速にAPIを公開できます。認証、承認、レート制限、トラフィック管理などの機能を提供し、APIのセキュリティとパフォーマンスを向上させます。さらに、統合されたモニタリングとロギングにより、APIの利用状況をリアルタイムで把握でき、問題発生時の迅速な対応が可能です。
    • 不採用理由
      • python 3.9 をポートしていないため
        • Endpoints Frameworks は、App Engine の標準の Python 2.7 ランタイム環境と Java 8 ランタイム環境でのみサポートされています。
  • Apigee
    • 概要
      • Apigeeは、Google Cloudが提供する包括的なAPI管理プラットフォームで、APIの設計、セキュリティ、分析、運用を一元的に管理します。Apigeeは、APIプロキシの作成、トラフィック管理、セキュリティポリシーの適用、レート制限、キャッシング、トランスフォーメーションなどの高度な機能を提供します。また、詳細な分析ダッシュボードとリアルタイムモニタリングにより、APIの利用状況、パフォーマンス、エラーを可視化し、迅速な問題解決が可能です。エンタープライズ向けの機能が充実しており、企業は内部システムや外部パートナーとのAPI連携を安全かつ効率的に行うことができます。
    • 不採用理由
      • 構築に手間がかかり、ランニングコストも発生するため

Google Cloud、Google Workspace に関するご相談はXIMIXへ!

Google Cloud、Google Workspaceに関する お問い合わせはこちら
XIMIX(サイミクス)は商標登録出願中です


App Engineで特定のエンドポイントのみ認証をかける方法

BACK TO LIST