すべてのプロダクト
Search
ドキュメントセンター

Edge Security Acceleration:API schema compliance validation

最終更新日:Jun 09, 2026

OpenAPI 仕様などの API スキーマをアップロードすると、ESA は自動的にマネージド API と照合します。その後、ESA は受信リクエストをスキーマに対して検証し、設定されたアクションを非準拠リクエストに適用して、ビジネス API を保護します

仕組み

スキーマ検証は、ESA の API 管理内で管理されているすべての API で使用できます。

  1. リクエストが ESA ノードに到着すると、ESA はそのリクエストがマネージド API 向けであるかどうかをチェックします。

    • そうでない場合、ESA はリクエストが他のセキュリティ機能に渡されるのを許可します。

    • そうである場合、ESA はリクエストを対応する API スキーマと照合します。

  2. ESA はリクエストをスキーマに対して検証します。

    • リクエストが非準拠の場合、ESA は設定されたアクションを適用し、イベントをログに記録します。

    • リクエストが準拠している場合、ESA はその通過を許可します。

スキーマ検証の設定

スキーマ検証を使用する前に、スキーマをアップロードして機能を有効にする必要があります。

  1. ESA コンソールで [Web サイト] を選択し、サイト 列で対象の Web サイトをクリックします。

  2. 左側のナビゲーションウィンドウで、セキュリティ保護 > API セキュリティ を選択します。

  3. API セキュリティ ページで、スキーマ検証 タブを選択し、スキーマ検証設定 をクリックします。image

  4. 設定ページで、スキーマをアップロード をクリックして、カスタムスキーマファイルをアップロードします。image

  5. ESA は、マネージド API をアップロードされたスキーマの定義と自動的に照合します。照合結果を確認した後、確認 をクリックします。image

  6. スキーマをアップロードした後、非準拠リクエストに対するデフォルトアクションを設定します。まず モニター アクションから始めることを推奨します。その後、ステータス スイッチを有効にします。image

  7. スキーマ検証 タブに戻り、スキーマ検証の結果を表示します。image

非準拠リクエストの分析

スキーマ検証を設定すると、ESA は API リクエストを継続的に監視します。スキーマ検証 タブで、API リストのツールバーにあるフィルターアイコン image をクリックし、スキーマを選択してリストをフィルターします。ESA は一致する API を表示し、[非準拠リクエスト] 列には過去 24 時間の非準拠リクエストの数が表示されます。image

非準拠リクエストは、次の問題によって引き起こされる可能性があります。

  • クライアント側のエラー:正当なクライアントが、不正な形式のリクエストを送信することがあります。例えば、パラメーター形式の誤り (JSON が必要なのにフォームデータを送信するなど)、必須パラメーターの欠落、型の不一致 (ブール値フィールドに文字列を送信するなど) があります。このような場合、フロントエンド設計を見直し、エラー検出、送信プロンプトなどの保護手段を追加してください。

  • 悪意のある攻撃:攻撃者は、インジェクションやブルートフォース攻撃などの脆弱性を探索するために、不正な形式のリクエストを送信することがよくあります。非準拠リクエストの急増は、攻撃が進行中であることを示している可能性があります。攻撃が疑われる場合は、アクションをブロックに変更し、より厳格な WAF ルールを設定してください。

リクエスト詳細の分析

非準拠リクエストの根本原因を特定するには、[イベント] または [セキュリティ分析] でサンプリングされたログを調査します。

  1. まず、非準拠リクエストの数が異常に多い API を特定します。image

  2. 設定されたアクションに基づいて、適切なログ機能を選択します。

    • アクションが [なし] の場合:これらのリクエストはセキュリティアクションをトリガーしないため、[セキュリティ分析] で分析します。

    • アクションが [モニター] または [ブロック] の場合:これらのリクエストはセキュリティアクションをトリガーするため、関連するログは [イベント] でより簡単に見つけることができます。

  3. このセクションでは、イベントを例として使用します。左側のナビゲーションウィンドウで、セキュリティ保護 > イベント分析 を選択します。

    [セキュリティ分析] を使用するには、左側のナビゲーションウィンドウで セキュリティ保護 > セキュリティ分析 を選択します。
  4. イベント分析 ページで、サンプリングログ エリアまでスクロールします。API セキュリティルールに一致するログをフィルターします。ログエントリの横にある展開アイコン image をクリックして詳細を表示し、リクエストを分析します。アクセスログをより詳細に分析するために、リアルタイムログ を使用することもできます。

アクションの変更

すべての API に対してデフォルトアクションを設定するか、個々の API に特定のアクションを設定することができます。

  • グローバルデフォルトアクションの変更スキーマ検証 タブの デフォルトアクション 列で 変更 をクリックし、アクションを選択します。

    • ブロック:非準拠リクエストをブロックし、イベントを記録します。

    • モニター:非準拠リクエストの通過を許可し、イベントを記録します。

    • なし:アクションを実行しません。

    image

  • 特定の API のアクションを設定スキーマ検証 タブの API リストで、目的の API の アクションの変更 をクリックし、アクションを選択します。

    • デフォルト:グローバルデフォルトアクションを使用します。

    • ブロック:非準拠リクエストをブロックし、イベントを記録します。

    • モニター: 非準拠のリクエストを通過させ、イベントを記録します。

    • なし:アクションを実行しません。

      image

スキーマのない API の分析

スキーマファイルを正常にアップロードすると、スキーマに準拠する API は自動的にバインドされます。スキーマ検証 タブの スキーマなし API 数 列で、フィルター ボタンをクリックすると、スキーマのない API のリストが表示されます。image

スキーマのない API の場合、ESA は非準拠リクエストをカウントできないため、潜在的なセキュリティギャップが生じます。API にスキーマがない理由は次のとおりです。

  • スキーマからの漏れ:アップロードしたスキーマファイルに API が含まれていませんでした。リストで API のパス、ホスト、HTTP メソッドを確認し、スキーマファイルを更新して再度アップロードしてください。

  • 非標準の API 設計:検出された API が標準的な設計プラクティスに従っていないため、スキーマと一致しません。API のリファクタリングが必要になる場合があります。一般的な問題は次のとおりです。

    • 非標準のパス:API パスが正しくありません。例えば、正しい paths エントリが /users であるべきところを、/user と定義されている場合などです。

    • 誤用された HTTP メソッド:メソッドがセマンティック規則に従っていません。例えば、DELETE の代わりに /users/delete/123 のような破壊的なアクションに GET メソッドを使用している場合などです。

    • ステータスコードの乱用:API レスポンスのステータスコードが正しくありません。例えば、すべてのレスポンスが 200 OK を返し、実際のステータスは { "responses": "500" } のようにレスポンスボディで返される場合などです。

    • 紛らわしい I/O 構造:入出力データが正しくありません。例えば、入力にあるべき email フィールドが出力に誤って配置されている場合などです。

スキーマファイルの仕様

タイプとサイズ

スキーマ検証ファイルは、.yml.yaml、または .json 形式である必要があります。最大ファイルサイズは 58 KB です。スキーマファイルが大きすぎる場合は、.json 形式を使用し、アップロードする前にローカルでファイルを圧縮できます。

スキーマの内容

バージョン

ESA のスキーマ検証は、現在 OpenAPI 仕様 (OAS) v3.0.x バージョンのみをサポートしています。

フィールド

必須フィールド

  • openapi:API バージョン。例:3.0.0

  • info:API に関するメタデータ。例:"version": "1.0.0"

  • paths:少なくとも 1 つの API パスを含む必要があります。例:/api

  • servers:ホストに関する情報。次のサブフィールドがサポートされています。

    • url:絶対 URL のみがサポートされています。例:https://api.example.com

    • variablesESA はサーバー変数をサポートしていません。変数プレースホルダーは解析中に無視されます。

オプションフィールド

  • schema:データ構造の定義。次のタイプがサポートされています。

    • int32

    • uint32

    • int64

    • uint64

    • float

    • double

    • boolean

    • email

  • reference$ref を使用して事前定義されたオブジェクトを参照します。外部参照または相対参照はサポートされていません。

  • requestBody:リクエストボディを定義します。content-typeapplication/json のデータのみがサポートされています。

以下は、.json スキーマファイルの例です。
{
    "openapi": "3.0.0",
    "info": {
        "title": "example",
        "description": "example",
        "version": "1.0"
    },
    "servers": [
    {
      "url": "https://example1.aliyun.com",
      "description": "example1 url"
    },
    {
      "url": "https://example2.aliyun.com",
      "description": "example2 url"
    }
    ],
    "components": {
        "schemas": {
            "ParamsObject": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "value": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "value"
                ]
            }
        }
    },
    "paths": {
        "/example/{param1}": {
            "get": {
                "operationId": "getexampleById",
                "parameters": [
                    {
                        "name": "param1",
                        "in": "path",
                        "required": true,
                        "description": "id",
                        "schema": {
                            "type": "integer",
                            "format": "int32"
                        }
                    }
                ]
            }
        },
        "/api1": {
            "post": {
                "operationId": "post_api1",
                "summary": "post api1 request",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ParamsObject"
                            }
                        }
                    }
                }
            },
            "get" :{
                "operationId": "get_api1",
                "summary": "get api1 request",
                "parameters": [
                    {
                        "name": "id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "format": "int32"
                        }
                    },
                    {
                        "name": "name",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    }
                ]
            }
        }
    }
}