Apache APISIXとAuthingを使用した集中認証管理の実装

API7.ai

January 4, 2022

Ecosystem

はじめに

Apache APISIXについて

Apache APISIXは、動的でリアルタイム、高性能なAPIゲートウェイであり、ロードバランシング、動的なアップストリーム、カナリアリリース、サービスメルトダウン、認証、可観測性などの豊富なトラフィック管理機能を提供します。Apache APISIXは、動的なプラグインの変更やホットプラグインをサポートするだけでなく、多くの便利なプラグインを備えています。Apache APISIXのOpenID Connectプラグインは、OpenID Connectプロトコルをサポートしており、このプラグインを使用してApache APISIXをAuthingサービスと連携させ、企業内で集中認証ゲートウェイとして展開することができます。

Authingについて

Authingは、中国初の開発者中心のフルシーンIDクラウド製品であり、すべての主流のIDプロトコルを統合し、企業や開発者に完全で安全なユーザー認証とアクセス管理サービスを提供します。「API First」を製品の基盤とし、ID分野のすべての一般的な機能をモジュール化してカプセル化し、すべての機能をフルシーンのプログラミング言語SDKを通じて開発者にAPI化しています。同時に、ユーザーはAuthingのオープンなRESTful APIを柔軟に使用して機能拡張を行い、異なる企業の異なるビジネスシナリオにおけるID管理ニーズを満たすことができます。

集中認証とは

従来の認証モード

従来の認証モードでは、各バックエンドアプリケーションサービスが認証機能をサポートするために個別の機能を開発する必要がありました。例えば、IDプロバイダーとのやり取りやユーザーのID情報の取得などです。

従来の認証ワークフロー

集中ID認証モード

従来の認証モードとは異なり、集中認証モードではユーザー認証をアプリケーションサービスから切り離します。Apache APISIXを例にとると、集中認証のプロセスは上図のようになります。まず、ユーザーがリクエストを開始し、次にフロントゲートウェイがユーザー認証プロセスを担当し、IDプロバイダーと連携してIDプロバイダーに認可リクエストを送信します。IDプロバイダーはユーザー情報を返します。ゲートウェイがユーザー識別を完了した後、ユーザーID情報をリクエストヘッダーの形式でバックエンドアプリケーションに転送します。

集中認証モードのワークフロー

集中ID認証モードの利点

従来の認証モードと比較して、集中認証モードには以下の利点があります。

  1. アプリケーション開発プロセスを簡素化し、アプリケーションの開発負荷とメンテナンスコストを削減し、各アプリケーションで認証ロジックを繰り返し開発することを回避します。
  2. ビジネスのセキュリティを向上させ、ゲートウェイレベルでの集中認証モードは、未認証のリクエストをタイムリーにインターセプトしてバックエンドアプリケーションを保護します。

同時に、Authingの強力な認証管理機能と組み合わせることで、以下の機能を実現できます。

  1. コンソールを通じて認証サービスのライフサイクル管理(作成、有効化、無効化など)を行います。
  2. リアルタイムで視覚的なアプリケーションモニタリング(インターフェースリクエスト数、インターフェース呼び出し遅延、インターフェースエラー情報、リアルタイムアラーム通知など)を行います。
  3. 集中ロギングにより、ユーザーのログイン、ログアウト、アプリケーションの調整や変更に関する情報を簡単に確認できます。

詳細はAuthing Access Gatewayをご覧ください。

Apache APISIXとAuthingを使用した集中ID認証の実装方法

ステップ1: Authingの設定

  1. Authingアカウントにログインし、「Build your own app」を選択してアプリ名と認証アドレスを入力します。Authingアカウントをお持ちでない場合は、Authingにアクセスし、右上の「ログイン/登録」をクリックしてAuthingアカウントを登録してください。 Authingの設定
  2. 「Create」をクリックしてAuthingアプリケーションを作成します。 Authingアプリケーションの作成
  3. 認証プロセス中、Authingは設定されたもの以外のコールバックURLを拒否します。これはローカルテストであるため、ログインコールバックURLとログアウトコールバックURLの両方をAPISIXのアクセスアドレスhttp://127.0.0.1:9080/に設定します。 ログインとログアウトのURL設定
  4. ユーザーを作成(オプション)。ユーザーリストページで、アカウントパスワードuser1/user1のユーザーを作成し、「ユーザー情報 - 認可管理」ページでアプリケーションへのアクセスを許可するかどうかを設定できます(デフォルトで許可)。 ユーザーの作成
  5. アプリケーションページにアクセスして以下の設定を行います。これはApache APISIX OpenID Connectの設定時に必要です。
    1. App ID: OAuthクライアントID、つまりアプリケーションのIDで、client_id{YOUR_CLIENT_ID}に対応します。
    2. App secret: OAuthクライアントシークレット、つまりアプリケーションキーです。client_secret{YOUR_CLIENT_SECRET}に対応します。
    3. Service_discovery_address: アプリケーションサービスのディスカバリーアドレスです。{YOUR_DISCOVERY}に対応します。 設定

ステップ2: Apache APISIXのインストール

Apache APISIXは、ソースパッケージ、Docker、Helm Chartなど、さまざまな方法でインストールできます。

依存関係のインストール

Apache APISIXの実行環境には、NGINXとetcdの依存関係が必要です。

Apache APISIXをインストールする前に、使用しているオペレーティングシステムに応じて依存関係をインストールしてください。CentOS7、Fedora 31および32、Ubuntu 16.04および18.04、Debian 9および10、macOSの依存関係インストール手順を提供しています。詳細は依存関係のインストールをご覧ください。

RPMパッケージによるインストール(CentOS 7)

このインストール方法はCentOS 7に適しています。以下のコマンドを実行してApache APISIXをインストールしてください。

sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm

Dockerによるインストール

Apache APISIXをDockerでインストールをご覧ください。

Helm Chartによるインストール

Apache APISIXをHelm Chartでインストールをご覧ください。

ソースリリースによるインストール

  1. apisix-2.7という名前のディレクトリを作成します。
mkdir apisix-2.7
  1. Apache APISIXリリースソースパッケージをダウンロードします。
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz

Apache APISIXリリースソースパッケージは、Apache APISIXのウェブサイトからもダウンロードできます。Apache APISIX公式ウェブサイト - ダウンロードページでは、Apache APISIX、APISIX Dashboard、APISIX Ingress Controllerのソースパッケージも提供しています。

  1. Apache APISIXリリースソースパッケージを解凍します。
tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
  1. 実行に必要なLuaライブラリをインストールします。
# apisix-2.7ディレクトリに移動
cd apisix-2.7
# 依存関係を作成
make deps

依存関係の初期化

以下のコマンドを実行して、NGINX設定ファイルとetcdを初期化します。

# NGINX設定ファイルとetcdを初期化
make init

ステップ3: Apache APISIXの起動とルートの設定

  1. 以下のコマンドを実行してApache APISIXを起動します。

    apisix start
    
  2. ルートを作成し、OpenID Connectプラグインを設定します。OpenID Connectの設定リストは以下の通りです。

フィールドデフォルト値説明
client_idN/AOAuthクライアントID
client_secretN/AOAuthクライアントシークレットキー
discoveryN/AIDプロバイダーのサービスディスカバリーエンドポイント
scopeopenidアクセスするリソーススコープ
relmapisixWWW-Authenticateレスポンスヘッダーの認証情報を指定
bearer_onlyfalseリクエストヘッダーのトークンをチェックするかどうか
logout_path/logoutログアウトURI
redirect_urirequest_uriIDプロバイダーがリダイレクトするURIで、デフォルトはリクエストアドレス
timeout3リクエストタイムアウト時間(秒)
ssl_verifyfalseIDプロバイダーのSSL証明書を検証するかどうか
introspection_endpointN/AIDプロバイダーのトークン認証エンドポイントのURLで、空白の場合、ディスカバリーレスポンスから抽出されます。
introspection_endpoint_auth_methodclient_secret_basicトークンイントロスペクションの認証方法名
public_keyN/A認証トークンの公開鍵
token_signing_alg_values_expectedN/A認証トークンのアルゴリズム
set_access_token_headertrueリクエストヘッダーにアクセストークンを付与するかどうか
access_token_in_authorization_headerfalseアクセストークンをAuthorizationヘッダーに配置する場合はtrue、X-Access-Tokenヘッダーに配置する場合はfalse。
set_id_token_headerfalseIDトークンをX-ID-Tokenリクエストヘッダーに付与しない
set_userinfo_headerfalseユーザー情報をX-Userinfoリクエストヘッダーに付与するかどうか

以下のコード例は、Apache APISIX Admin APIを使用してルートを作成し、ルートのアップストリームをhttpbin.orgに設定します。httpbin.orgは、リクエストを受信して応答するシンプルなバックエンドサービスで、以下のhttpbin.orggetページを使用します。詳細はhttp bin getを参照してください。

具体的な設定項目については、Apache APISIX OpenID Connectプラグインをご覧ください。

curl  -XPOST 127.0.0.1:9080/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
    "uri":"/*",
    "plugins":{
        "openid-connect":{
            "client_id":"{YOUR_CLIENT_ID}",
            "client_secret":"{YOUR_CLIENT_SECRET}",
            "discovery":"https://{YOUR_DISCOVERY}",
            "scope":"openid profile",
            "bearer_only":false,
            "realm":"apisix",
            "introspection_endpoint_auth_method":"client_secret_post",
            "redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        "type":"roundrobin",
        "nodes":{
            "httpbin.org:80":1
        }
    }
}'

ステップ4: Apache APISIXへのアクセス

  1. "http://127.0.0.1:9080/get"にアクセスすると、OpenID Connectプラグインが有効になっているため、ページはAuthingのログインページにリダイレクトされます(このページはAuthingコンソールの「アプリケーション - ブランディング」でカスタマイズできます)。 Apache APISIXへのアクセス

  2. Authingに登録したユーザーのアカウントのパスワード、またはステップ1で作成したユーザーuser1/user1のパスワードを入力し、「ログイン」をクリックしてAuthingアカウントにログインします。

  3. ログインに成功すると、httpbin.orgのgetページに正常にアクセスできます。httpbin.org/getページは、以下のようにリクエストデータを返します。

    ...
    "X-Access-Token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InFqeU55aVdVd2NhbUFxdEdVRUNCeFNsTWxQSWtTR2N1NmkyZzhEUk1OSGsifQ.eyJqdGkiOiJjTy16a0pCS0NSRFlHR2kyWkJhY0oiLCJzdWIiOiI2MWM5OGFmOTg0MjI4YWU0OTYyMDU4NTIiLCJpYXQiOjE2NDA1OTg4NTgsImV4cCI6MTY0MTgwODQ1OCwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSIsImlzcyI6Imh0dHBzOi8vYXBpc2l4LmF1dGhpbmcuY24vb2lkYyIsImF1ZCI6IjYxYzk4M2M0YjI4NzdkNDg2OWRkOGFjYiJ9.l2V8vDWcCObB1LjIhKs2ARG4J7WuB-0c-bnYZG2GP2zcpl6PMAPcId2B76CaXCU58ajGcfRmOlWJ67UaHrfWKv8IM4vcYN1gwhKdokSyrhEM31gQE-MzNEsEbPaVIGXdpR1N2JnAJK5-tKIjopDAXSwArfO6fQKTpjLhCi3COIA169WGRR4CKCwNzzpFAYP2ilNc18D_HRTBLS6UjxZSNUtWE5dbx7uBjblhwIwn5e1fxiEQcknVK8Dxf8NUliFECvr02HX2hNvmuCECkvA_mZYlshAeqidK8tSEXirAWsWS5jlXFqLiBJkhSHFrbxRyqeOSfJCJR_YcCwk9AzgZGg",
    "X-Id-Token": "eyJhdF9oYXNoIjoiRl8tRjZaUVgtWVRDNEh0TldmcHJmUSIsImJpcnRoZGF0ZSI6bnVsbCwiZmFtaWx5X25hbWUiOm51bGwsImdlbmRlciI6IlUiLCJnaXZlbl9uYW1lIjpudWxsLCJpc3MiOiJodHRwczpcL1wvYXBpc2l4LmF1dGhpbmcuY25cL29pZGMiLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oiLCJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwiaWF0IjoxNjQwNTk4ODU4LCJuaWNrbmFtZSI6bnVsbCwibm9uY2UiOiJmMTlmZjhjODM5NzdmZjNlMDczMzZmMzg3Y2QxM2EzMSIsIm1pZGRsZV9uYW1lIjpudWxsLCJleHAiOjE2NDE4MDg0NTgsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYXVkIjoiNjFjOTgzYzRiMjg3N2Q0ODY5ZGQ4YWNiIiwicHJvZmlsZSI6bnVsbH0=",
    "X-Userinfo": "eyJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwicHJvZmlsZSI6bnVsbCwibmlja25hbWUiOm51bGwsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYmlydGhkYXRlIjpudWxsLCJmYW1pbHlfbmFtZSI6bnVsbCwiZ2VuZGVyIjoiVSIsImdpdmVuX25hbWUiOm51bGwsIm1pZGRsZV9uYW1lIjpudWxsLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oifQ=="
    ...
    

    X-Access-Token: Apache APISIXは、ユーザープロバイダーから取得したアクセストークンをX-Access-Tokenリクエストヘッダーに配置します。プラグイン設定のaccess_token_in_authorization_headerを使用して、Authorizationリクエストヘッダーに配置することもできます。

    X-Access-Token

    X-Id-Token: Apache APISIXは、ユーザープロバイダーから取得したIDトークンをbase64エンコードしてX-Id-Tokenリクエストヘッダーに配置します。これはプラグイン設定のset_id_token_headerで有効または無効にできます。

    X-Id-Token

    X-Userinfo: Apache APISIXは、ユーザープロバイダーから取得したユーザー情報をbase64エンコードしてX-Userinfoに配置します。この機能はプラグイン設定のset_userinfo_headerを使用して有効または無効にできます。

    X-Userinfo

    ご覧の通り、Apache APISIXはX-Access-TokenX-Id-TokenX-Userinfoリクエストヘッダーをアップストリームに付与します。アップストリームはこれらのヘッダーを解析してユーザーID情報とユーザーメタデータを取得できます。

  4. Authingコンソールの「監査ログ - ユーザー行動ログ」で、user1のログイン情報を確認できます。 ログイン情報

まとめ

この記事では、Apache APISIXとAuthingを連携するための詳細な手順を説明しました。

Apache APISIXは、自身の高性能を維持することに加えて、オープンソースエコシステムの構築にも非常に重視しています。現在、Apache APISIXには10以上の認証認可関連のプラグインがあり、業界の主流の認証認可サービスとの連携をサポートしています。

他の認証機関との連携が必要な場合は、Apache APISIXのGitHubにアクセスしてissueを通じて提案を残すか、Apache APISIXのメーリングリストに登録してメールで意見を表明してください。

Tags: