OpenAPI 仕様などの API スキーマをアップロードすると、ESA は自動的にマネージド API と照合します。その後、ESA は受信リクエストをスキーマに対して検証し、設定されたアクションを非準拠リクエストに適用して、ビジネス API を保護します。
仕組み
スキーマ検証は、ESA の API 管理内で管理されているすべての API で使用できます。
-
リクエストが ESA ノードに到着すると、ESA はそのリクエストがマネージド API 向けであるかどうかをチェックします。
-
そうでない場合、ESA はリクエストが他のセキュリティ機能に渡されるのを許可します。
-
そうである場合、ESA はリクエストを対応する API スキーマと照合します。
-
-
ESA はリクエストをスキーマに対して検証します。
-
リクエストが非準拠の場合、ESA は設定されたアクションを適用し、イベントをログに記録します。
-
リクエストが準拠している場合、ESA はその通過を許可します。
-
スキーマ検証の設定
スキーマ検証を使用する前に、スキーマをアップロードして機能を有効にする必要があります。
-
ESA コンソールで [Web サイト] を選択し、サイト 列で対象の Web サイトをクリックします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
API セキュリティ ページで、スキーマ検証 タブを選択し、スキーマ検証設定 をクリックします。

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

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

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

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

非準拠リクエストの分析
スキーマ検証を設定すると、ESA は API リクエストを継続的に監視します。スキーマ検証 タブで、API リストのツールバーにあるフィルターアイコン
をクリックし、スキーマを選択してリストをフィルターします。ESA は一致する API を表示し、[非準拠リクエスト] 列には過去 24 時間の非準拠リクエストの数が表示されます。
非準拠リクエストは、次の問題によって引き起こされる可能性があります。
-
クライアント側のエラー:正当なクライアントが、不正な形式のリクエストを送信することがあります。例えば、パラメーター形式の誤り (JSON が必要なのにフォームデータを送信するなど)、必須パラメーターの欠落、型の不一致 (ブール値フィールドに文字列を送信するなど) があります。このような場合、フロントエンド設計を見直し、エラー検出、送信プロンプトなどの保護手段を追加してください。
-
悪意のある攻撃:攻撃者は、インジェクションやブルートフォース攻撃などの脆弱性を探索するために、不正な形式のリクエストを送信することがよくあります。非準拠リクエストの急増は、攻撃が進行中であることを示している可能性があります。攻撃が疑われる場合は、アクションをブロックに変更し、より厳格な WAF ルールを設定してください。
リクエスト詳細の分析
非準拠リクエストの根本原因を特定するには、[イベント] または [セキュリティ分析] でサンプリングされたログを調査します。
-
まず、非準拠リクエストの数が異常に多い API を特定します。

-
設定されたアクションに基づいて、適切なログ機能を選択します。
-
アクションが [なし] の場合:これらのリクエストはセキュリティアクションをトリガーしないため、[セキュリティ分析] で分析します。
-
アクションが [モニター] または [ブロック] の場合:これらのリクエストはセキュリティアクションをトリガーするため、関連するログは [イベント] でより簡単に見つけることができます。
-
-
このセクションでは、イベントを例として使用します。左側のナビゲーションウィンドウで、 を選択します。
[セキュリティ分析] を使用するには、左側のナビゲーションウィンドウで を選択します。
-
イベント分析 ページで、サンプリングログ エリアまでスクロールします。API セキュリティルールに一致するログをフィルターします。ログエントリの横にある展開アイコン
をクリックして詳細を表示し、リクエストを分析します。アクセスログをより詳細に分析するために、リアルタイムログ を使用することもできます。
アクションの変更
すべての API に対してデフォルトアクションを設定するか、個々の API に特定のアクションを設定することができます。
-
グローバルデフォルトアクションの変更:スキーマ検証 タブの デフォルトアクション 列で 変更 をクリックし、アクションを選択します。
-
ブロック:非準拠リクエストをブロックし、イベントを記録します。
-
モニター:非準拠リクエストの通過を許可し、イベントを記録します。
-
なし:アクションを実行しません。

-
-
特定の API のアクションを設定:スキーマ検証 タブの API リストで、目的の API の アクションの変更 をクリックし、アクションを選択します。
-
デフォルト:グローバルデフォルトアクションを使用します。
-
ブロック:非準拠リクエストをブロックし、イベントを記録します。
-
モニター: 非準拠のリクエストを通過させ、イベントを記録します。
-
なし:アクションを実行しません。

-
スキーマのない API の分析
スキーマファイルを正常にアップロードすると、スキーマに準拠する API は自動的にバインドされます。スキーマ検証 タブの スキーマなし API 数 列で、フィルター ボタンをクリックすると、スキーマのない API のリストが表示されます。
スキーマのない 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。 -
variables:ESA はサーバー変数をサポートしていません。変数プレースホルダーは解析中に無視されます。
-
オプションフィールド
-
schema:データ構造の定義。次のタイプがサポートされています。-
int32
-
uint32
-
int64
-
uint64
-
float
-
double
-
boolean
-
email
-
-
reference:$refを使用して事前定義されたオブジェクトを参照します。外部参照または相対参照はサポートされていません。 -
requestBody:リクエストボディを定義します。content-typeがapplication/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"
}
}
]
}
}
}
}