Apache APISIXとAuthingを使用した集中認証管理の実装
API7.ai
January 4, 2022
はじめに
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認証モードの利点
従来の認証モードと比較して、集中認証モードには以下の利点があります。
- アプリケーション開発プロセスを簡素化し、アプリケーションの開発負荷とメンテナンスコストを削減し、各アプリケーションで認証ロジックを繰り返し開発することを回避します。
- ビジネスのセキュリティを向上させ、ゲートウェイレベルでの集中認証モードは、未認証のリクエストをタイムリーにインターセプトしてバックエンドアプリケーションを保護します。
同時に、Authingの強力な認証管理機能と組み合わせることで、以下の機能を実現できます。
- コンソールを通じて認証サービスのライフサイクル管理(作成、有効化、無効化など)を行います。
- リアルタイムで視覚的なアプリケーションモニタリング(インターフェースリクエスト数、インターフェース呼び出し遅延、インターフェースエラー情報、リアルタイムアラーム通知など)を行います。
- 集中ロギングにより、ユーザーのログイン、ログアウト、アプリケーションの調整や変更に関する情報を簡単に確認できます。
詳細はAuthing Access Gatewayをご覧ください。
Apache APISIXとAuthingを使用した集中ID認証の実装方法
ステップ1: Authingの設定
- Authingアカウントにログインし、「Build your own app」を選択してアプリ名と認証アドレスを入力します。Authingアカウントをお持ちでない場合は、Authingにアクセスし、右上の「ログイン/登録」をクリックしてAuthingアカウントを登録してください。
- 「Create」をクリックしてAuthingアプリケーションを作成します。
- 認証プロセス中、Authingは設定されたもの以外のコールバックURLを拒否します。これはローカルテストであるため、ログインコールバックURLとログアウトコールバックURLの両方をAPISIXのアクセスアドレスhttp://127.0.0.1:9080/に設定します。
- ユーザーを作成(オプション)。ユーザーリストページで、アカウントパスワードuser1/user1のユーザーを作成し、「ユーザー情報 - 認可管理」ページでアプリケーションへのアクセスを許可するかどうかを設定できます(デフォルトで許可)。
- アプリケーションページにアクセスして以下の設定を行います。これはApache APISIX OpenID Connectの設定時に必要です。
- App ID: OAuthクライアントID、つまりアプリケーションのIDで、
client_id
と{YOUR_CLIENT_ID}
に対応します。 - App secret: OAuthクライアントシークレット、つまりアプリケーションキーです。
client_secret
と{YOUR_CLIENT_SECRET}
に対応します。 - Service_discovery_address: アプリケーションサービスのディスカバリーアドレスです。
{YOUR_DISCOVERY}
に対応します。
- App ID: OAuthクライアントID、つまりアプリケーションのIDで、
ステップ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でインストールをご覧ください。
ソースリリースによるインストール
apisix-2.7
という名前のディレクトリを作成します。
mkdir apisix-2.7
- 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のソースパッケージも提供しています。
- Apache APISIXリリースソースパッケージを解凍します。
tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
- 実行に必要なLuaライブラリをインストールします。
# apisix-2.7ディレクトリに移動
cd apisix-2.7
# 依存関係を作成
make deps
依存関係の初期化
以下のコマンドを実行して、NGINX設定ファイルとetcdを初期化します。
# NGINX設定ファイルとetcdを初期化
make init
ステップ3: Apache APISIXの起動とルートの設定
-
以下のコマンドを実行してApache APISIXを起動します。
apisix start
-
ルートを作成し、OpenID Connectプラグインを設定します。OpenID Connectの設定リストは以下の通りです。
フィールド | デフォルト値 | 説明 |
---|---|---|
client_id | N/A | OAuthクライアントID |
client_secret | N/A | OAuthクライアントシークレットキー |
discovery | N/A | IDプロバイダーのサービスディスカバリーエンドポイント |
scope | openid | アクセスするリソーススコープ |
relm | apisix | WWW-Authenticateレスポンスヘッダーの認証情報を指定 |
bearer_only | false | リクエストヘッダーのトークンをチェックするかどうか |
logout_path | /logout | ログアウトURI |
redirect_uri | request_uri | IDプロバイダーがリダイレクトするURIで、デフォルトはリクエストアドレス |
timeout | 3 | リクエストタイムアウト時間(秒) |
ssl_verify | false | IDプロバイダーのSSL証明書を検証するかどうか |
introspection_endpoint | N/A | IDプロバイダーのトークン認証エンドポイントのURLで、空白の場合、ディスカバリーレスポンスから抽出されます。 |
introspection_endpoint_auth_method | client_secret_basic | トークンイントロスペクションの認証方法名 |
public_key | N/A | 認証トークンの公開鍵 |
token_signing_alg_values_expected | N/A | 認証トークンのアルゴリズム |
set_access_token_header | true | リクエストヘッダーにアクセストークンを付与するかどうか |
access_token_in_authorization_header | false | アクセストークンをAuthorizationヘッダーに配置する場合はtrue、X-Access-Tokenヘッダーに配置する場合はfalse。 |
set_id_token_header | false | IDトークンをX-ID-Tokenリクエストヘッダーに付与しない |
set_userinfo_header | false | ユーザー情報をX-Userinfoリクエストヘッダーに付与するかどうか |
以下のコード例は、Apache APISIX Admin APIを使用してルートを作成し、ルートのアップストリームをhttpbin.orgに設定します。httpbin.org
は、リクエストを受信して応答するシンプルなバックエンドサービスで、以下のhttpbin.org
のget
ページを使用します。詳細は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へのアクセス
-
"http://127.0.0.1:9080/get"にアクセスすると、OpenID Connectプラグインが有効になっているため、ページはAuthingのログインページにリダイレクトされます(このページはAuthingコンソールの「アプリケーション - ブランディング」でカスタマイズできます)。
-
Authingに登録したユーザーのアカウントのパスワード、またはステップ1で作成したユーザーuser1/user1のパスワードを入力し、「ログイン」をクリックしてAuthingアカウントにログインします。
-
ログインに成功すると、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-Id-Token: Apache APISIXは、ユーザープロバイダーから取得したIDトークンをbase64エンコードしてX-Id-Tokenリクエストヘッダーに配置します。これはプラグイン設定の
set_id_token_header
で有効または無効にできます。X-Userinfo: Apache APISIXは、ユーザープロバイダーから取得したユーザー情報をbase64エンコードしてX-Userinfoに配置します。この機能はプラグイン設定の
set_userinfo_header
を使用して有効または無効にできます。ご覧の通り、Apache APISIXは
X-Access-Token
、X-Id-Token
、X-Userinfo
リクエストヘッダーをアップストリームに付与します。アップストリームはこれらのヘッダーを解析してユーザーID情報とユーザーメタデータを取得できます。 -
Authingコンソールの「監査ログ - ユーザー行動ログ」で、user1のログイン情報を確認できます。
まとめ
この記事では、Apache APISIXとAuthingを連携するための詳細な手順を説明しました。
Apache APISIXは、自身の高性能を維持することに加えて、オープンソースエコシステムの構築にも非常に重視しています。現在、Apache APISIXには10以上の認証認可関連のプラグインがあり、業界の主流の認証認可サービスとの連携をサポートしています。
他の認証機関との連携が必要な場合は、Apache APISIXのGitHubにアクセスしてissueを通じて提案を残すか、Apache APISIXのメーリングリストに登録してメールで意見を表明してください。