1. はじめに
近年、企業が新規事業や更なるサービス展開のため、独自のAPIをWeb上に公開してユーザーに様々な情報を提供することが増えています。以下のように企業(API提供者)がAPIにより自社が持つデータを社外に公開することで、他の企業(サービス提供者)がそのデータを利用してユーザーに様々なサービスを提供することで可能となり、新しい形のサイトやビジネスが生まれるきっかけとなっています。
ただしAPI実行時はユーザーに代わりサービス提供者がユーザーの個人情報へアクセスするため、ユーザーの同意の取得やAPIにおけるアクセス認可をどう設定するかなど、APIサービス導入時にはセキュリティに関する課題があります。
そこでMicrosoft Azure が提供するAzure API ManagementとIceWall Federation OIDC/OAuth OP ASとを連携すると、セキュリティを考慮したAPIサービスの提供が可能となります。本技術レポートでは、その設定と動作検証についてご紹介します。
2.APIのアクセス認可
APIに直接アクセスするのはユーザーではなくサービス提供者ですが、ユーザーの認証はユーザーとAPI提供者の間で行います。ここで、ユーザーの認証はユーザーとAPI提供者の間で行った上でAPIへのアクセスをサービス提供者に許可するため、標準規格であるOAuthもしくはOpenID Connectを利用します。
APIのアクセス認可の処理の流れを以下に示します。ユーザーはサービスアプリにアクセスすると認証を求められ、「オーソライゼーション・サーバー」にてログインします。認証が完了すると、「オーソライゼーション・サーバー」は 「アクセストークン」を発行します。サービス提供者は「アクセストークン」を入手することで、APIへのアクセス権限を得ることができます。そしてサービスアプリが「アクセストークン」を利用してAPIへアクセスすると、「リソース・サーバー」が「オーソライゼーション・サーバー」に問い合わせて「アクセストークン」の正当性を検証し、結果が正当であればAPIが実行されます。
3. Azure API Managementとは
Azure API ManagementとはMicrosoft Azureが提供するAPIゲートウェイサービスであり、既存のAPIサービスをバックエンドとするAPIゲートウェイを迅速に作成することが可能です。API保護のためのセキュリティ設定や、APIの一元管理、API開発時のテスト環境など、API公開を全般的にサポートするサービスとなっています。
Azure API Managementは、エンドポイントとなる「APIゲートウェイ」、管理インターフェースとなる「Azure Portal」、API開発者のための「開発者ポータル」の3つの要素から構成されます。それぞれの役割を以下で説明します。
要素 | 概要 | 役割 |
---|---|---|
APIゲートウェイ | エンドポイント |
|
Azure Portal
| API プログラムをセットアップする管理インターフェイス |
|
開発者ポータル | 開発者用のメイン Web |
|
※ 詳細は公式ドキュメントをご参照ください。
Azure API Managementのドキュメント - API Management について
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-key-concepts
Azure API Managementを使用した場合のAPIのアクセス認可の処理の流れを以下に示します。
Azure API Management を使用すると、APIのアクセス認可におけるアクセストークンの検証をAPIゲートウェイ上で行うことが可能なため、各APIでアクセストークン検証のための実装は必要ありません。
4. Azure API ManagementとIceWall Federation OIDC/OAuth OP ASの連携
4.1 システム構成
Azure API ManagementとIceWall Federation OIDC/OAuth OP ASとが連携したシステムの概要は以下です。
API提供者のうち、リソース・サーバーにはAzure API ManagementのサンプルAPI ”Echo API”を使用し、オーソライゼーション・サーバーはIceWall Federation OIDC/OAuth OP AS(以降IceWall OP サーバー)が担います。IceWall OP サーバーの前段にはIceWall SSO(ユーザー認証用フォワーダー、ユーザー認証用認証サーバー)を用意し、ユーザーの認証はIceWall SSOが行います。
サービス提供者のサービスアプリには、Azure API Management開発者ポータルにおいてAPI開発者が動作確認に使用可能なOIDC/OAuthクライアントツールを使用します。開発者ポータルではこの動作確認用OIDC/OAuthクライアントツール(以降OIDC/OAuthクライアント)を使用することで、クライアントアプリケーションを用意せずに(※)APIのテストを行うことができます。
※本番運用では別途クライアントアプリケーションが必要です。
①ユーザーがOIDC/OAuthクライアントにアクセスします。
②OIDC/OAuthクライアントがIceWall OP サーバーへアクセスします。
③ユーザー認証(ログイン)が未実施の場合、IceWall OP サーバー前段のユーザー認証用フォワーダーが認証を要求します。
④ユーザーがログインします。
⑤ログインが完了すると、OIDC/OAuthクライアントはOAuthプロトコルを使用して、IceWall OP サーバーからアクセストークンを取得します。
⑥OIDC/OAuthクライアントがアクセストークンを付加して、APIへのアクセス要求をAPIゲートウェイに送信します。
⑦APIゲートウェイがIceWall OP サーバーのToken Introspection Endpointへアクセストークンの検証を依頼します。
⑧検証結果が正当であれば、APIゲートウェイはAPIへリクエストを転送します。
4.2 Azure API Managementの設定
Microsoft Azure PortalにおいてAPI Managementサービスの設定を行います。
4.2.1 API Managementサービスの作成
まずAPI Managementサービスを作成します。「リソースの作成」から「API Management」を検索し、API Managementサービスを新規作成します。
必要事項を記入し「作成」をクリックすると、リソースグループへのデプロイメントが開始されます。デプロイメントが完了しオンライン(使用可能)状態となると、設定を開始することができます。
4.2.2 OPの登録
OIDC/OAuthクライアントに割り当てるOP (OpenID Provider)を登録します。
登録可能なプロトコルにはOpenID ConnectとOAuth 2.0が用意されており、クライアントは取得したIDトークンもしくはアクセストークンをAPIに送信します。ここではAPIゲートウェイがIceWall OP サーバーのToken Introspection Endpointを使用したアクセストークンの検証を行うため、OAuth 2.0 を選択してIceWall OP サーバーを登録します。
作成したAPI Managementサービス内メニューの「開発者ポータル – OAuth2.0」にて、「追加」をクリックします。
以下の必要事項を記入の上「保存」をクリックし、OPの設定を登録します。
項目名 | 設定値 |
---|---|
表示名 | 任意の名前 |
ID | 任意の名前 |
説明 | 任意の内容 |
承認許可の種類 | 承認コード |
承認エンドポイントのURL | https://< FQDN >/fw/dfw/OP/op/auth ※ fw :前段フォワーダーのスクリプトエイリアス OP : IceWall OP サーバーのエイリアス名 |
承認要求方法 | GET |
トークンエンドポイントのURL | https://< FQDN >/fw/dfw/OP/op/token |
クライアント認証方法 | 本文内 |
アクセストークンの送信方法 | Authorizationヘッダー |
規定のスコープ | sample_scope (ダミーの値) |
クライアントID/クライアントシークレット | 任意の値 |
「既定のスコープ」「クライアントID/クライアントシークレット」「Redirect URI」はIceWall OP サーバーにも同じ値を設定します(4.3.1節)。「Redirect URI」はコピーしておくことができます。
4.2.3 APIへのOPの割り当て
テストに使用する”Echo API”のユーザー認証設定に、先ほど登録したOPを割り当てます。
API Managementサービス内メニューの「APIs – API」にて ”Echo API”をクリックします。
「Settings」タブ内の 「Security」 項目にて先ほど登録したOPを選択し、「Save」をクリックして保存します。
4.2.4トークン検証ポリシーの設定
Azure API ManagementにおけるAPIの動作を制御可能な「ポリシー」機能を使用して、APIゲートウェイがAPIへのリクエストを受信した際にアクセストークンを検証するよう設定します。アクセストークンの検証にはIceWall OP サーバーに用意されているToken Introspection Endpointを使用します。設定内容は公式ドキュメントのポリシー設定例(※)を参考にします。
※Azure API Managementのドキュメント - Azure API Management サービスからの外部サービスの使用
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-sample-send-request
API Managementサービス内メニューの「APIs – API」にて、”Echo API”をクリックします。「Design」タブ内の「Inbound processing」をクリックして、インバウンドのポリシーを編集します。
IceWall OPサーバーではToken Introspection Endpointへアクセス可能なリクエストをAPI ゲートウェイからのリクエストに制限するため、Token Introspection Endpointへのリクエストにはベーシック認証を求めるよう設定します(4.3.2節)。そこでAuthorizationヘッダーのvalueには、そのベーシック認証で許可する「ユーザー名:パスワード」をBase64化した文字列を設定します。
4.3 IceWallの設定
IceWallはOPサーバーのセット(OIDC/OAuth OP AS、トークン用認証サーバー)と、IceWall SSOのセット(ユーザー認証用フォワーダー、ユーザー認証用認証サーバー)から構成されます。
4.3.1 IceWall OPサーバーの設定
クライアント設定ファイルに以下を設定します。「client_id」「client_secret」項目はAzure API Managementで設定したクライアントID、クライアントシークレットを、「redirect_uris」項目にはAzure API Managementで指定された値を設定します。
また今回はOAuthで動作させるため、オブジェクト設定ファイルを新規作成してダミーのスコープを設定し、「scopes_supported」項目に設定します。
■クライアント設定ファイル
client_id=< API Managementで設定したクライアントID> client_secret=< API Managementで設定したクライアントシークレット> redirect_uris=< Azure API Managementで指定された値 > response_types_supported=code grant_types_supported=authorization_code scopes_supported= sample_scope |
■オブジェクト設定ファイル
scope=sample_scope |
4.3.2 ユーザー認証用フォワーダーApacheの設定
IceWall OP サーバーのAuthorization Endpointへのリクエストにはnonceパラメーターの付与が必須(※)ですが、OIDC/OAuthクライアントツールではリクエストにnonceパラメーターが付与されません。
※将来のパッチでnonceパラメーターはオプションとなる予定です。
そこでユーザー認証用フォワーダーのApacheにて、Authorization Endpointへのアクセスにはnonceパラメーターを付与するよう設定します。
RewriteEngine on RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} ^/fw/dfw/OP/op/auth$ RewriteCond %{QUERY_STRING} !(^|&)nonce= RewriteRule ^.*$ %{REQUEST_URI}?nonce=123 [QSA,R=302,NE] |
また、IceWall OP サーバーのToken Introspection Endpointへアクセス可能なリクエストをAPI ゲートウェイからのリクエストに制限するため、Token Introspection Endpointへのリクエストにはベーシック認証を求めるよう設定しておきます。
5.動作確認
Azure API ManagementとIceWall Federation OIDC/OAuth OP ASとが連携したシステムによる、APIのアクセス認可の動作確認を行います。
1.「開発者ポータル - ポータルの概要」から「開発者ポータル(レガシ)」をクリックします。
2.開発者ポータルが起動したら、「APIs」タブから”Echo API”を選択するとAPIドキュメントが表示されます。任意のoperationを選択し「Try IT」ボタンをクリックすると、API実行画面が表示されます。
3.「Authorization」 選択項目にて、IceWall OP サーバーの「Authorization Code」を選択します。
4.別ウィンドウでIceWall OP サーバーの認証画面が表示されます。
5.認証、認可同意が完了すると別ウィンドウが閉じて開発者ポータル画面が読み込まれ、APIへのリクエスト電文中のAuthorizationヘッダーにアクセストークンがセットされます。
6.「Send」をクリックしてAPIにリクエストを送信します。
7.リクエストを受け取ったAPIゲートウェイはポリシーに基づいてIceWall OP サーバーのToken Introspection Endpointへアクセスし、アクセストークンの検証を依頼します。
8.アクセストークンの検証に成功するとAPIが実行され、APIから200 OKが返ります。
6. まとめ
Azure API ManagementとIceWall Federation OIDC/OAuth OP ASを連携することで、セキュアなAPIサービスを提供することが可能です。今回はその手順をご紹介しました。
APIをクラウド環境で公開される際は、今回のシステムをぜひご検討ください。
2020.11.20
執筆者 :日本ヒューレット・パッカード株式会社
Pointnext事業統括 認証コンサルティング部
藤 ひとみ