Apache APISIX Auth と Okta の使用方法

Fei Han

September 7, 2021

Ecosystem

Apache APISIX OpenID Connect プラグインを使用した集中型ID認証の利用
Apache APISIX OpenID Connect プラグインを使用してOkta認証を設定するのは、簡単な3ステップのプロセスです。これにより、従来の認証モードから集中型ID認証モードに切り替えることができます。以下のセクションでは、Apache APISIXのOpenID Connectプラグインを使用してOkta認証を設定する手順を説明します。

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

  1. 集中型ID認証は、アプリケーション開発プロセスを簡素化します。
  2. 集中型ID認証は、ビジネスのセキュリティを向上させます。

前提条件

使用するためのOktaアカウントを準備してください。

ステップ1: Oktaの設定

  1. Oktaアカウントにログインし、「Create App Integration」をクリックしてOktaアプリケーションを作成します。
    Create App Integration

  2. サインインメソッドとして「OIDC - OpenID Connect」を選択し、アプリケーションタイプとして「Web Application」を選択します。
    Create a new App Integration

  3. ログインおよびログアウトのリダイレクトURLを設定します。「Sign-in redirect URIs」はログイン成功後にリダイレクトされる許可されたリンクで、「Sign-out redirect URIs」はログアウト後にリダイレクトされるリンクです。この例では、ログインおよびログアウトのリダイレクトURIを両方とも http://127.0.0.1:9080/ に設定します。
    Set the redirect URL for login and logout

  4. 設定が完了したら、「Save」をクリックして変更を保存します。
    save the changes

  5. アプリケーションのGeneralページにアクセスし、以下の設定を取得します。これらはApache APISIX OpenID Connectを設定するために必要です。

    • Client ID: アプリケーションIDで、以下のclient_idに対応します。
    • Client secret: アプリケーションキーで、以下のclient_secretに対応します。
    • Okta domain: アプリケーションが使用するドメイン名で、以下の{ISSUER}に対応します。

    obtain configuration

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

依存関係のインストール

Apache APISIXの実行環境には、NGINXおよびetcdへの依存関係が必要です。Apache APISIXをインストールする前に、使用しているオペレーティングシステムに応じて依存関係をインストールしてください。CentOS7、Fedora 31 & 32、Ubuntu 16.04 & 18.04、Debian 9 & 10、およびMacOS向けの依存関係インストール手順を提供しています。詳細はInstall Dependenciesを参照してください。

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によるインストール

詳細はInstalling Apache APISIX with Dockerを参照してください。

Helm Chartによるインストール

詳細はInstalling Apache APISIX with Helm Chartを参照してください。

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

  1. apisix-2.7という名前のディレクトリを作成します。

    mkdir apisix-2.7
    
  2. Apache APISIXリリースのソースパッケージをダウンロードします。

    wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz
    

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

  3. Apache APISIXリリースのソースパッケージを解凍します。

    tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
    
  4. 実行に必要な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プラグインを設定します。以下のコード例では、Apache APISIX Admin APIを使用してルートを作成し、アップストリームパスをhttpbin.orgに設定します。httpbin.orgは、リクエストを受信して応答するシンプルなバックエンドサービスです。以下では、httpbin.orgのgetページを使用します。詳細はhttp bin getを参照してください。具体的な設定項目については、Apache APISIX OpenID Connect Pluginを参照してください。

OpenID Connectの設定フィールドは以下の通りです:

フィールドデフォルト値説明
client_id""OAuthクライアントID。
client_secret""OAuthクライアントシークレット。
discovery""アイデンティティプロバイダーのサービスディスカバリーエンドポイント。
scopeopenidアクセスするリソースのスコープ。
relmapisixWWW-Authenticateレスポンスヘッダーの認証情報を指定します。
bearer_onlyfalseリクエストヘッダーのトークンをチェックするかどうか。
logout_path/logoutログアウトURI。
redirect_urirequest_uriアイデンティティプロバイダーがリダイレクトするURIで、デフォルトはリクエストアドレスです。
timeout3リクエストのタイムアウト時間で、単位は秒です。
ssl_verifyfalseアイデンティティプロバイダーのSSL証明書を検証するかどうか。
introspection_endpoint""アイデンティティプロバイダーのトークン認証エンドポイントのURLで、空白の場合はdiscoveryから抽出されます。
introspection_endpoint_auth_methodclient_secret_basicトークンイントロスペクションの認証方法の名前。
public_key""認証トークンの公開鍵。
token_signing_alg_values_expected""認証トークンのアルゴリズム。
set_access_token_headertrueリクエストヘッダーにアクセストークンを含めるかどうか。
access_token_in_authorization_headerfalseアクセストークンをAuthorizationヘッダーに含めるかどうか。この値がtrueに設定されている場合、アクセストークンはAuthorizationヘッダーに含まれ、falseに設定されている場合はX-Access-Tokenヘッダーに含まれます。
set_id_token_headertrueリクエストヘッダーにIDトークンを含めるかどうか。
set_userinfo_headertrueリクエストヘッダーにユーザー情報を含めるかどうか。
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_ISSUER}/.well-known/openid-configuration",
            "scope":"openid profile",
            "bearer_only":false,
            "realm":"master",
            "introspection_endpoint_auth_method":"client_secret_post",
            "redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        "type":"roundrobin",
        "nodes":{
            "httpbin.org:80":1
        }
    }
}'

検証

  1. "http://127.0.0.1:9080/get"にアクセスすると、OpenID Connectプラグインが有効になっているため、ページはOktaのログインページにリダイレクトされます。
    visit Okta login page

  2. ユーザーのOktaアカウントのユーザー名とパスワードを入力し、「Sign In」をクリックしてOktaアカウントにログインします。

  3. ログインが成功すると、"httpbin.org"のgetページにアクセスできます。"httpbin.org/get"ページは、X-Access-Token、X-Id-Token、およびX-Userinfoを含むリクエストデータを返します。

    "X-Access-Token": "******Y0RPcXRtc0FtWWVuX2JQaFo1ZVBvSlBNdlFHejN1dXY5elV3IiwiYWxnIjoiUlMyNTYifQ.***TVER3QUlPbWZYSVRzWHRxRWh2QUtQMWRzVDVGZHZnZzAiLCJpc3MiOiJodHRwczovL3FxdGVzdG1hbi5va3RhLmNvbSIsImF1ZCI6Imh0dHBzOi8vcXF0ZXN0bWFuLm9rdGEuY29tIiwic3ViIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImlhdCI6MTYyODEyNjIyNSwiZXhwIjoxNjI4MTI5ODI1LCJjaWQiOiIwb2ExMWc4ZDg3TzBGQ0dYZzY5NiIsInVpZCI6IjAwdWEwNWVjZEZmV0tMS3VvNjk1Iiwic2NwIjpbIm9wZW5pZCIsInByb2Zpb***.****iBshIcJhy8QNvzAFD0fV4gh7OAdTXFMu5k0hk0JeIU6Tfg_Mh-josfap38nxRN5hSWAvWSk8VNxokWTf1qlaRbypJrKI4ntadl1PrvG-HgUSFD0JpyqSQcv10TzVeSgBfOVD-czprG2Azhck-SvcjCNDV-qc3P9KoPQz0SRFX0wuAHWUbj1FRBq79YnoJfjkJKUHz3uu7qpTK89mxco8iyuIwB8fAxPMoXjIuU6-6Bw8kfZ4S2FFg3GeFtN-vE9bE5vFbP-JFQuwFLZNgqI0XO2S7l7Moa4mWm51r2fmV7p7rdpoNXYNerXOeZIYysQwe2_L****",
    "X-Id-Token": "******aTdDRDJnczF5RnlXMUtPZUtuSUpQdyIsImFtciI6WyJwd2QiXSwic3ViIjoiMDB1YTA1ZWNkRmZXS0xLdW82OTUiLCJpc3MiOiJodHRwczpcL1wvcXF0ZXN0bWFuLm9rdGEuY29tIiwiYXVkIjoiMG9hMTFnOGQ4N08wRkNHWGc2OTYiLCJuYW1lIjoiUGV0ZXIgWmh1IiwianRpIjoiSUQuNGdvZWo4OGUyX2RuWUI1VmFMeUt2djNTdVJTQWhGNS0tM2l3Z0p5TTcxTSIsInZlciI6MSwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImV4cCI6MTYyODEyOTgyNSwiaWRwIjoiMDBvYTA1OTFndHAzMDhFbm02OTUiLCJub25jZSI6ImY3MjhkZDMxMWRjNGY3MTI4YzlmNjViOGYzYjJkMDgyIiwiaWF0IjoxNjI4MTI2MjI1LCJhdXRoX3RpbWUi*****",
    "X-Userinfo": "*****lfbmFtZSI6IlpodSIsImxvY2FsZSI6ImVuLVVTIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsInVwZGF0ZWRfYXQiOjE2MjgwNzA1ODEsInpvbmVpbmZvIjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJzdWIiOiIwMHVhMDVlY2RGZldLTEt1bzY5NSIsImdpdmVuX25hbWUiOiJQZXRlciIsIm5hbWUiOiJQZXRl****"
    

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-Token、X-Id-Token、およびX-Userinfoリクエストヘッダーをアップストリームに送信します。アップストリームはこれらのヘッダーを解析して、ユーザーID情報やユーザーメタデータを取得できます。

Oktaから直接Apache APISIXゲートウェイに集中型ID認証を構築するプロセスを示しました。無料のOkta Developerアカウントに登録して始めるのは簡単です。このアプローチにより、開発者の負担が軽減され、安全で効率的な体験が実現します。

Oktaについて

Oktaは、アプリケーションに認証と認可サービスを追加するためのカスタマイズ可能で安全なソリューションです。開発の負担やセキュリティリスク、メンテナンスを伴わずに、アプリケーションにスケーラブルな認証を組み込むことができます。どのような言語やスタックのアプリケーションでもOktaに接続し、ユーザーのサインイン方法を定義できます。ユーザーが認証を試みるたびに、OktaはそのIDを確認し、必要な情報をアプリに返します。

Apache APISIXについて

Apache APISIXは、動的でリアルタイム、高性能なAPIゲートウェイです。Apache APISIXは、ロードバランシング、動的アップストリーム、カナリアリリース、サーキットブレーカー、認証、可観測性などの豊富なトラフィック管理機能を提供します。Apache APISIXを使用して、従来の南北トラフィックだけでなく、サービス間の東西トラフィックも処理できます。また、k8s ingressコントローラーとしても使用できます。

世界中の数百社がApache APISIXを使用しており、金融、インターネット、製造、小売、通信事業者など、NASA、欧州連合のデジタルファクトリー、TravelSky、Tencent、Huawei、Weibo、中国移動、Taikang、360などが含まれます。

Github: https://github.com/apache/apisix

Website: https://apisix.apache.org

Tags: