ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
OCI API GatewayとOCI Functionsを使用したAPIセキュリティのカスタマイズ
イントロダクション
Oracle Cloud Infrastructure (OCI) FunctionsとOCI API Gatewayの間のシームレスな相乗効果を発見し、API用のカスタム認証メソッドを実装し、ファンクションがAPIゲートウェイから引数を取得する方法をご覧ください。
OCI APIゲートウェイ
OCI APIゲートウェイ・サービスでは、ネットワーク内からアクセス可能なプライベート・エンドポイントとともに、インターネット・トラフィックを受け入れる場合にパブリックIPアドレスで公開できるAPIを公開できます。エンドポイントは、API検証、リクエストとレスポンスの変換、CORS、認証と認可およびリクエスト制限をサポートします。
OCI APIゲートウェイ・サービスを使用して、APIクライアントからのトラフィックを処理し、バックエンド・サービスにルーティングするために、リージョン・サブネットに1つ以上のAPIゲートウェイを作成します。単一のAPIゲートウェイを使用して、複数のバックエンド・サービス(OCIロード・バランサ、OCIコンピュート・インスタンス、OCI Functionsなど)を単一の統合APIエンドポイントにリンクできます。
OCI関数
OCI Functionsは、完全に管理された、マルチテナントでスケーラビリティが高いオンデマンドのFunctions-as-a-Serviceプラットフォームです。エンタープライズグレードのOCI上に構築されており、Fn Projectオープン・ソース・エンジンによって強化されています。OCI Functionsは、ビジネス・ニーズを満たすためのコードの作成に集中したい場合に使用します。
ノート:
このチュートリアルは、教育および研究の目的でのみ設計されています。これは、学習者が制御された設定で実験し、実用的な経験を得るための環境を提供します。この演習で使用するセキュリティ構成および演習は、実際のシナリオには適していない可能性があることに注意してください。
現実世界のアプリケーションのセキュリティに関する考慮事項は、多くの場合、はるかに複雑で動的です。したがって、本番環境でここに示した手法または構成のいずれかを実装する前に、包括的なセキュリティ評価およびレビューを実施することが不可欠です。このレビューでは、アクセス制御、暗号化、監視、コンプライアンスなど、セキュリティのすべての側面を網羅し、システムが組織のセキュリティ・ポリシーおよび標準に準拠していることを確認する必要があります。
演習環境から実際のデプロイメントに移行する場合、セキュリティは常に最優先事項です。
目標
- OCI FunctionsをAuthorizer Functionsとして使用してモック・レスポンスを使用してAPIゲートウェイを作成し、カスタム・セキュリティ検証を実装し、特定のパラメータをAPIゲートウェイに返します。
前提条件
-
管理者権限を持つOracleアカウント。
-
ユーザーに認証トークンを作成します。詳細は、Oracle Cloud Infrastructure Registryへのログインを有効にする認証トークンの生成を参照してください。
-
リソースを作成するためのコンパートメント。
ノート: 「コンパートメント名」および「コンパートメントID」を書き留めます。
-
プライベートおよびパブリック・サブネットを持つVCN。詳細は、Virtual Cloudネットワークの作成を参照してください。
-
VCNのプライベート・サブネットにデプロイされたファンクション・アプリケーション。詳細は、ファンクションのQuickStartガイドを参照してください。
-
VCNのパブリック・サブネットで作成されたAPIゲートウェイ。詳細は、APIゲートウェイのQuickStartガイドを参照してください。
-
APIゲートウェイでストック・レスポンスと呼ばれるダミー・バックエンドを使用します。詳細は、APIゲートウェイ・バックエンドとしての標準レスポンスの追加を参照してください。
-
ブラウザを使用してOCI Cloud Shellにアクセスします。詳細は、OCI Cloud Shellを参照してください。
-
プライベート・サブネットとパブリック・サブネット間のアクセスを許可するようにセキュリティ・リストを構成します。
タスク1: 動的グループの設定
OCIコンソールにログインし、ドメインに移動し、「動的グループ」をクリックして、次の情報を含むグループを作成します。
-
グループ名:
MyFunctions
と入力します。ALL {resource.type = 'fnfunc', resource.compartment.id = 'pasteYourCompartmentOCID'}
-
グループ名:
MyApiGateway
と入力します。ALL {resource.type = 'ApiGateway', resource.compartment.id = 'pasteYourCompartmentOCID'}
タスク2: ポリシーの作成
OCIコンソールに移動し、「ポリシー」に移動して、次の情報を含むポリシーを作成します。
-
ポリシー名:
FunctionsPolicies
と入力します。Allow dynamic-group MyFunctions to read repos in compartment YOUR-COMPARTMENT-NAME
-
ポリシー名:
ApiGatewayPolicies
と入力します。Allow dynamic-group MyApiGateway to use functions-family in compartment YOUR-COMPARTMENT-NAME
タスク3: OCIコンテナ・レジストリの作成
-
OCIコンソールに移動し、「開発者サービス」、「コンテナおよびアーティファクト」に移動し、「コンテナ・レジストリ」を選択して「リポジトリの作成」をクリックし、ファンクション・イメージのプライベート・リポジトリを作成します。
-
リポジトリ名:
functions/authorizationfunctionjava
と入力します。
-
-
リポジトリを確認し、ネームスペースをノートにとります。
-
OCI CLIおよびDockerがインストールされているOCI Cloud Shellを開き、レジストリでログインを続行します。リージョンの正しいURLを確認します。このチュートリアルでは、レジストリURLが
gru.ocir.io
であるブラジル東部(サンパウロ)を使用しています。docker login -u 'yourRepositoryNamespace/oracleidentitycloudservice/yourUserLogin' gru.ocir.io Password: YOUR_AUTH_TOKEN_CREATED_EARLIER
タスク4: 認可プロバイダ・ファンクションとしてのJava OCIファンクションの作成
ノート:プライベート・サブネットを選択してください。
-
OCIコンソールに移動し、「開発者サービス」、「ファンクション」、「アプリケーション」に移動して、「アプリケーションの作成」をクリックします。
-
Docker、OCI CLIおよびFn Project CLIがインストールされているOCI Cloud Shellを起動し、次のコマンドを実行してファンクションを初期化します。
ノート:タスクに従った場合、Dockerログイン・コマンドがすでに実行されていなければ、タスク3のDockerログイン・ステップに進みます。
OCIコンソールに移動し、「開発者サービス」、「ファンクション」、「アプリケーション」に移動し、アプリケーションを選択して「スタート・ガイド」をクリックします。次のコマンドを実行します。
fn list context fn use context sa-saopaulo-1 fn update context oracle.compartment-id PASTE_YOUR_COMPARTMENT_OCID fn update context registry gru.ocir.io/PASTE_YOUR_REGISTRY_NAMESPACE/functions
ノート:このチュートリアルでは、ブラジル東部(サンパウロ)リージョンを使用しています。別のリージョンを使用している場合は、レジストリの場所を変更する必要があります。
-
authorizationfunctionjava.tarからJava関数のサンプル・コードをダウンロードし、OCI Cloud Shellにアップロードしてから、ファイルの解凍に進みます。
# check your file is there ls -lrt # create your directory mkdir authorizationfunctionjava # unzip the file tar -xvf authorizationfunctionjava.tar -C authorizationfunctionjava cd authorizationfunctionjava/
この単純なJavaコードは、
token
とcustomer
の2つのパラメータを受け取ります。また、関数構成で定義されたシステム環境変数から3番目のパラメータも取得します。ノート: handleRequest(入力)メソッドのパラメータ名が、APIゲートウェイ構成で使用される名前と同じであることを確認してください。これにより、APIゲートウェイは認可プロバイダ・ファンクションにパラメータを正しく渡します。
このコード・スニペットは、入力を検証し、特定のレスポンスを返します。
必要なレスポンス・フォーマットおよびパラメータの詳細は、認可プロバイダ・ファンクションの作成を参照してください。
-
次のコマンドを実行してコードを作成し、ファンクションをデプロイします。
cd authorizationfunctionjava/ ls -lart fn deploy --app chafikFunctions
-
ファンクション検証をテストするための顧客資格証明を格納する構成をいくつか作成します。
ノート:これらの構成変数は、このチュートリアルで提供されるJavaサンプル・コード内のシステム環境変数として使用されます。ただし、Fn RuntimeContextなどの代替アプローチを使用するようにファンクション・コードを変更できます。詳細は、「ファンクションでのFn RuntimeContextの使用」を参照してください。
秘密名/キー Value FN_AAA_KEY 123456 FN_BBB_KEY 898989 FN_ORACLE_KEY ABCD1234 -
これらの設定は、「開発者サービス」に移動してOCIコンソールで構成できます。「ファンクション」で、「アプリケーション」をクリックし、アプリケーションを選択してからファンクションを選択します。ファンクションの詳細ページで、「構成」をクリックします。
または
fn
コマンドを実行します。fn config function --help MANAGEMENT COMMAND fn config function - Store a configuration key for this function USAGE fn [global options] config function <app-name> <function-name> <key> <value> DESCRIPTION This command sets the configuration of a specific function for an application. fn config function chafikFunctions authorizationfunctionjava FN_ORACLE_KEY ABCD1234
-
次のコマンドを使用してファンクションを呼び出します。
# Invoke the function to check if it's working as expected echo -n '{"data" : {"customer":"ORACLE", "token": "ABCD1234"}}' | fn invoke chafikFunctions authorizationfunctionjava
ノート:ファンクションのウォームアップには、最初の呼出しに最大1分かかる場合があります。構成で追加の設定を確認します。詳細は、プロビジョニングされた同時実行性を使用した初期レイテンシの削減を参照してください。
有効データと無効データの両方を使用してテストし、ファンクション・レスポンスを検証します。
タスク5: 認可プロバイダ・ファンクションを使用するためのOCI APIゲートウェイおよびモックAPIの作成
ノート:パブリック・サブネットを選択してください。
-
OCIコンソールに移動し、「開発者サービス」、「API管理」、「ゲートウェイ」に移動して、「ゲートウェイの作成」をクリックします。
-
「ゲートウェイの詳細」ページに移動し、「ホスト名」をノートにとります。
-
APIゲートウェイでデプロイメントを作成します。「基本情報」に、次の情報を入力します。
- パス接頭辞:
/authFunction
と入力します。
ノート: APIゲートウェイからのホスト名およびパス接頭辞は、APIエンドポイントを形成するために使用されます。
- パス接頭辞:
-
「認証」に、次の情報を入力します。
-
「単一認証」を選択します。
-
「認可プロバイダ・ファンクション」を選択します。
-
Oracle Functionsアプリケーション:タスク4で作成したアプリケーションを選択します。
-
Oracle Function:タスク4で作成した関数を選択します。
-
「複数引数認可プロバイダ・ファンクション」を選択します。
-
関数の引数:次の情報を入力します。
コンテキスト表 ヘッダー名 引数名 request.headers 顧客 顧客 request.headers トークン トークン
ノート ヘッダー名は、APIエンドポイントの起動時にリクエスト・ヘッダーに含まれる情報を指します。引数名は、認可プロバイダ・ファンクションに送信されるパラメータ名です。タスク4.3のJavaコードを参照してください
-
-
「ルート」で、次の情報を使用してモック・テスト用の単一ルートを作成します。
- パス:
/mock
と入力します。 - メソッド: 「GET」を選択します。
- バックエンド・オプション: 「追加された単一バックエンドの編集」を選択します。
- バックエンド・タイプ: 「Stock response」を選択します。
- パス:
-
「ルート」で、「モック・レスポンス」を定義し、「次へ」をクリックします。
- ステータス・コード: 200と入力します。
- 本文: {"mensagem" : "ok"}と入力します。
- ヘッダー名: 「Content-Type」を選択します。
- ヘッダー値: 「application/json; charset=UTF-8」を選択します。
-
「確認」で、構成を確認し、「変更の保存」をクリックしてデプロイメントの作成を完了します。
-
curl
コマンドを実行してAPIをテストします。# Invoke using <Verb Defined in Route> with the endpoint like: <API Gateway Hostname> + <Deployment Path Prefix> + <Route Path> # Send parameters, such as customer and token, in the Header with values configured in Task 4 - Step 5 curl -i -H "customer: AAA" -H "token: 123456" -X GET https://yourapigatewayhosta.your-region.oci.customer-oci.com/authFunction/mock
無効な情報を指定して起動した場合、レスポンスはHTTP/1.1 401 Unauthorizedになります。
タスク6: OCI APIゲートウェイを使用した認可プロバイダ・ファンクションからのパラメータおよびスコープの取得
ノートタスク4でダウンロードしたJavaコードを参照してください。このタスクでは、APIゲートウェイ内で
result.context
およびresult.scope
を操作する方法について説明します。
-
認可プロバイダ・ファンクションからコンテキスト値を取得します。
認可プロバイダ・ファンクションから情報を取得し、APIゲートウェイ内で使用する必要があるシナリオを考えてみます。たとえば、認可トークンを使用してバックエンド・サービスを呼び出すことができます。
ノート:このラボ・デモンストレーションでは、レスポンス・ヘッダーに情報が返されます。
-
OCIコンソールに移動し、「開発者サービス」、「API管理」、「ゲートウェイ」に移動して、ゲートウェイを選択します。「デプロイメント」をクリックし、タスク5で作成したデプロイメントを選択して、「編集」をクリックします。
-
「ルート」にナビゲートし、「ルート・レスポンス・ポリシーの表示」をクリックします。
-
「レスポンス・ポリシー」の「ヘッダー変換」で、「追加」をクリックして続行します。
-
「レスポンス・ヘッダー変換」ページで、次の図に示すようにAPIゲートウェイを構成し、「変更の適用」をクリックします。
Javaコードからの両方のパラメータがAPIレスポンス・ヘッダーに含まれます。
- ヘッダー名:このフィールドは、APIレスポンスのヘッダー属性の名前を指定します。
- 値:このフィールドは、認可プロバイダ・ファンクションから取得される属性の名前を指定します。
次のフォーマットを使用します:
${request.auth[attributeNameFromAuthorizerFunction]} #examples ${request.auth[valor01]} ${request.auth[valor02]}
-
ヘッダー応答設定をレビューします。「次へ」をクリックして変更を確認し、「変更の保存」をクリックして適用します。
-
APIをテストし、レスポンス・ヘッダーを確認します。
-
認可プロバイダ・ファンクションのスコープ値を使用してセキュリティを強化する方法を明確にします。
ノート:認可のコンテキストでは、スコープとは、ユーザーまたはアプリケーションに付与される特定の権限またはアクセス・レベルを指します。
認可プロバイダ・ファンクションは、このAPIコールで使用可能なすべてのスコープ(この例ではハードコードされています)を返します。
APIゲートウェイ・デプロイメントの一部のルートでは、セキュリティを強化するために特定のスコープのみを許可できます。
OCIコンソールに移動し、「開発者サービス」、「API管理」、「ゲートウェイ」に移動して、ゲートウェイを選択します。「デプロイメント」をクリックし、タスク5で作成したデプロイメントを選択して、「編集」をクリックします。
-
「ルート」にナビゲートし、「ルート・リクエスト・ポリシーの表示」をクリックします。
-
「リクエスト・ポリシー」の「認可」で、「編集」をクリックします。
-
認可ポリシーで、「認可タイプ」として「任意」を選択し、認可プロバイダ・ファンクションによって返されたすべての「許可されたスコープ」を追加して、「変更の適用」をクリックします。
-
「確認」で、変更内容を確認し、「次へ」をクリックし、「変更の保存」をクリックして変更を適用します。
-
APIをテストし、動作していることを確認します。スコープは認可プロバイダ・ファンクションによって返されます。
-
APIゲートウェイを変更して、認可プロバイダ・ファンクションによって返されないスコープを使用します。
変更内容を確認し、「次へ」、「変更の保存」の順にクリックして変更を適用します。
-
APIをテストし、結果を確認します。
レスポンスは、404 Not Found HTTPステータスになります。
両方のヘッダーが返されるため、認可プロバイダの機能が正しく動作することを確認します。ただし、リクエスト・ポリシーのスコープ認可検証のため、ルート・バックエンドが失敗します。
関連リンク
承認
-
著者 - Rodrigo Chafik Choueiri (Oracle LAD Aチーム・ソリューション・エンジニア)
-
貢献者 - Joao Tarla (Oracle LAD Aチーム・ソリューション・エンジニア)、Sillas Lima (Oracle LADソリューション・アーキテクト)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Customize your API Security using OCI API Gateway and OCI Functions
G25983-01
February 2025
Copyright ©2025, Oracle and/or its affiliates.