API Gateway 認証

Yong Qian

November 25, 2022

Technology

APIゲートウェイにおける認証と認可の重要性

APIゲートウェイのコア機能は、APIコンシューマーとAPIプロバイダーを接続することと要約できます。

実際には、匿名アクセスを許可する一部のAPIを除いて、プロバイダーはしばしばコンシューマーを制限します。つまり、適格なコンシューマーのみがAPIにアクセスできます。さらに、プロバイダーは異なるコンシューマーに対して同じアクセスポリシーを持たない場合があります。例えば、コンシューマーAとBはどちらも/send_mail APIにアクセスできますが、1分あたりの呼び出し頻度は異なる方法で計算する必要があります。

上記の2点から、APIゲートウェイレベルでAPIコンシューマーの身元を識別し、検証することが非常に重要であることがわかります。以下では、オープンソースのAPIゲートウェイApache APISIXがコンシューマーの認証をどのように実装しているか、および企業で広く採用されている認証方法を紹介し、さらにAPISIXのユーザー認証システムが他のセキュリティ機能と連携してAPIゲートウェイのセキュリティ保護を強化する方法について説明します。

api gateway authentication

Apache APISIXの認証と認可

従来のHTTPプロキシは、リクエストドメイン名やクライアントIPなどの大まかな手段でリクエスト元を識別するしかありませんでしたが、APIゲートウェイにとってはこれでは不十分です。ますます複雑化するビジネス要件に対応するため、より洗練された認証方法が必要です。APISIXが従来のプロキシよりも優れている点の1つは、柔軟なプラグイン拡張機能であり、ユーザー認証用のプラグインのコレクションも含まれています。これらのプラグインは、実装方法に応じて2つのカテゴリに分類できます。

  1. 外部認証サービスとのインターフェース

external auth service

  1. APISIXが設計したConsumerオブジェクトによる内部ゲートウェイ認証

internal auth

これらの2つの認証方法を順に紹介します。

外部認証サービスとのインターフェース

企業がAPIゲートウェイを採用する前に、システム内に独立した認証サービスが展開されていることがよくあります。では、APISIXを既存の認証サービスとどのように連携させることができるでしょうか?APISIXは、さまざまな外部認証サービスと連携し、それらに認証を委任する一連のプラグインを提供しています。

例えば、openid-connectプラグインを使用して、OIDCプロトコルをサポートする任意の認証サービスと連携できます。以下は、keycloakサービスと連携するためのサンプル設定です。

curl http://127.0.0.1:9180/apisix/admin/routes -H "X-Api-Key: your-API-key" -XPOST -d '
{
    "uri":"/*",
    "plugins":{
        "openid-connect":{
            "client_id":"apisix", // keycloakがクライアントを作成する際に生成
            "client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4",
            "discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", // keycloak OpenIDエンドポイント
            "scope":"openid profile",
            "bearer_only":false,
            "realm":"apisix_test_realm",
            "introspection_endpoint_auth_method":"client_secret_post",
            "redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        ...
    }
}'

内部ゲートウェイ認証

Consumer

consumer

さまざまなソースからのリクエストがAPIゲートウェイに到着すると、ゲートウェイはこれらの呼び出し元を識別する必要があります。Apache APISIXは、特定のタイプのサービスの呼び出し元を表す「Consumer」という概念を提案しています。

Consumerオブジェクトは、使用するために認証プラグインの設定が必要です。最もシンプルなkey-authプラグインを例に取ります。

$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "jack",
    "plugins": {
        "key-auth": {
            "key": "auth-jack"
        }
}'

上記の設定は、リクエストが指定されたキー(auth-jack)を運ぶ場合、現在のリクエストがConsumer - jackに関連付けられることを意味します。ご覧の通り、Consumerに設定された認証プラグインは、実際には指定された認証メカニズムの下での身元証明書です。key-authプラグインでは、キーはコンシューマーを識別するための証明書であり、basic-authプラグインのユーザー名とパスワードに似ています。

ルートに認証プラグインを設定

Consumerを介して特定のコンシューマーに証明書情報を関連付けたら、対応するルートで認証プラグインを有効にする必要もあります。

$ curl http://127.0.0.1:9180/apisix/admin/routes/orders -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "uri": "/orders",
    "plugins": {
        "key-auth": {
            "header": "Authorization"
        }
    }
}'

上記の設定は、ルート/orderskey-authプラグインが有効になっていることを意味し、認証効果は以下のようになります。

$ curl http://127.0.0.1:9080/orders -H 'Authorization: auth-jack' -i
HTTP/1.1 200 OK
...
$ curl http://127.0.0.1:9080/orders -H 'Authorization: wrong-key' -i
HTTP/1.1 401 Unauthorized
...
{"message":"Invalid API key in request"}

ユーザーからのリクエストがこのルートにヒットすると、APISIXはAuthorizationヘッダーを介してユーザーが提供したキーを取得しようとします。取得できない場合、または取得したキーが正当でない場合、リクエストはゲートウェイによって直接拒否され、上流サービスを保護します。

上記の2つの認証方法では、認証プラグインがシステム全体の中心にあり、その豊富さがユーザーがAPIゲートウェイを選択する際の重要な要素となります。以下は、いくつかの主流の認証方法とそれぞれの利点と欠点です。

主流の認証方法

認証と認可は、コンピュータの世界に入って以来存在する基本的なメカニズムであり、長年の進化を経て非常に多様な分野になりました。APISIXのプラグインメカニズムは、さまざまな認証方法を実装するための開発コストを大幅に削減しました。以下は、APISIXがすでにサポートしているいくつかの主流の認証方法です。

Key Auth

Key Authは、すべての認証プラグインの中で最もシンプルですが、実際のシナリオで豊富な応用があります。例えば、有料ソフトウェアのライセンス、オープンAPIプラットフォームでの開発者を識別するためのトークンなど、Key Authで簡単に実装できます。さらに、APISIXの完全な動的設定と割り当て機能に基づいて、キーを迅速に作成および取り消すことができ、リアルタイムで有効になります。

Basic Auth

Basic Authは、ユーザー名とパスワードに基づく認証方法で、Webログインシナリオでよく使用されます。例えば、ウェブサイトの管理バックエンドは、管理者のログイン後に使用できます。ここでは、Basic Authを使用して認証を行うことができます。

LDAP

LDAP(Lightweight Directory Access Protocol)は、X.500標準に基づく軽量なファイルアクセスプロトコルで、IPプロトコルを介して分散情報ディレクトリのアクセス制御とメンテナンスを提供します。LDAPを使用すると、アプリケーションと運用開発者は、リソースへのユーザーアクセスを細かく制御できます。APISIXのldap-authプラグインを使用すると、MicrosoftのActive DirectoryやLinuxプラットフォームのOpenLDAP Serverなど、LDAPプロトコルを実装するプラットフォームと簡単に連携して、特定のルートへのConsumerアクセスを細かく制御できます。

OIDC

OpenIDは、分散型のオンライン認証システムです。OpenIDをサポートするサイトでは、ユーザーはユーザー名やパスワードなどの従来の認証トークンを覚える必要はありません。代わりに、OpenID IDプロバイダー(IdP)として機能するウェブサイトに事前に登録しておけば、そのプロバイダーと連携するすべてのアプリケーションにこのアカウントでログインできます。例えば、GoogleやFacebookサービスのアカウントを使用して、自社システムのユーザーを認証できます。

OIDCについては、APISIXはopenid-connectプラグインを提供しており、OIDCプロトコルをサポートする認証サービスと連携できます。

Forward Auth

APISIXの標準認証プラグインが現在のニーズを満たさない場合、またはシステム内に専用の非標準プロトコル認証サービスが展開されている場合、forward-authプラグインの使用を検討できます。このプラグインを使用すると、HTTPを介してユーザーリクエストを認証サービスに転送し、認証サービスが非正常なステータス(20x以外のエラーコード)で応答した場合、カスタムエラーを返すか、ユーザーを認証ページにリダイレクトできます。

forward-authプラグインの力により、認証と認可のロジックを専用の非標準プロトコル外部サービスに非常に巧妙に転送できます。

認証後の他のプラグインとの連携

ユーザー認証は、APISIXでAPIを保護するための最初のステップに過ぎません。認証機能を他のセキュリティプラグインと組み合わせることで、ゲートウェイのセキュリティ能力をさらに強化できます。

ACL(consumer-restriction)

複雑なバックエンドシステムでは、匿名ユーザーをブロックするだけでなく、認証済みユーザーも制限する必要があるAPIが存在する場合があります。例えば、ユーザー管理APIにホワイトリストに登録されたユーザーのみがアクセスできるようにする必要があります。

white list

この場合、APISIXが提供するconsumer-restrictionプラグインを使用して、アクセス制御メカニズムを実装できます。

$ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: your-API-key' -X POST -i -d '
{
    "uri": "/api/v1/users/admin",
    "plugins": {
        "key-auth": {},
        "consumer-restriction": {
            "whitelist": [
                "Rose",
                "Peter
            ]
        }
    },
    "upstream": {
        ...
    },
}'

上記のルートは、/api/v1/users/adminルートに対して、key-authconsumer-restrictionプラグインを使用してキー認証を要求し、RoseとPeterのみがアクセスできるように制限しています。

レートリミット(limit-count

前述のように、Consumerに認証プラグインを設定することでユーザー証明書をコンシューマーに関連付けることができますが、実際にはAPISIXのConsumerオブジェクトは認証プラグインだけでなく、RouteやServiceなどの任意のプラグインをマウントできます。

例えば、実際のアプリケーションでは、レートリミットポリシーはしばしば静的ではなく、個別化されています。異なるサービスレベルの呼び出し元に対して異なるAPIレートリミットポリシーを設定する必要があることがよくあります。しかし、このような要求は、ルートにレートリミットプラグインをマウントすることで解決することはできません。したがって、Consumerにレートリミットプラグインをマウントし、各コンシューマーに対してターゲットを絞ったレートリミットポリシーを指定する必要があります。

$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "jack",
    "plugins": {
        "key-auth": {
            "key": "jack"
        },
        "limit-count": {
            "count": 200,
            "time_window": 60,
            "rejected_code": 503,
            "key": "$consumer_name",
        }
}'
$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "rose",
    "plugins": {
        "key-auth": {
            "key": "rose"
        },
        "limit-count": {
            "count": 1000,
            "time_window": 60,
            "rejected_code": 503,
            "key": "$consumer_name",
        }
}'

上記の設定により、jackとroseに対して異なるレートリミットポリシーを指定し、roseは60秒間に1000回のリクエストカウントクォータを持ち、jackは200回しか持たないようにします。

まとめ

APIゲートウェイの不可欠な機能として、認証と認可は、ユーザーがAPIゲートウェイを選択する際に考慮する重要な要素の1つです。

本稿で紹介したオープンソースゲートウェイApache APISIXは、主要な認証方法をすべてカバーしており、企業ユーザーの認証と認可のニーズを満たすことができます。APISIXには以下の利点もあります。

  • 豊富なすぐに使える認証プラグイン
  • 組み込みと外部認証方法をサポートし、ユーザーが自由に選択可能
  • 二次開発をサポートし、カスタム認証センターと簡単に連携可能

これらの利点により、企業はゲートウェイレベルの認証と認可をより簡単に実現し、APIセキュリティを強化できます。

Apache APISIXについてさらに学びたい方は、https://api7.ai/contactでお問い合わせください。

Tags: