API スキーマ (OpenAPI 仕様など) をアップロードすると、システムはそれを管理対象の API に自動的にマッピングします。次に、このスキーマに対して受信リクエストを検証し、設定されたセキュリティポリシーを非準拠のトラフィックに適用します。
仕組み
API が検出および管理されると、API サーフェス全体でスキーマ検証を有効にできます。
リクエストが POP (Point of Presence) に到達すると、ESA はまず、そのリクエストが関連付けられたスキーマを持つ管理対象 API をターゲットにしているかどうかをチェックします。
そうでない場合、リクエストは他のセキュリティチェックに進みます。
そうである場合、ESA は次のステップに進みます。
ESA はリクエストがスキーマに準拠しているかどうかをチェックします。
非準拠の場合、システムは設定されたアクション (例: ブロック) を適用し、イベントを記録します。
準拠している場合、リクエストは通過を許可されます。
スキーマ検証の設定
開始するには、API スキーマをアップロードして検証を有効にします。
ESA コンソールで、サイト管理 を選択し、サイト 列でターゲットサイトをクリックします。
左側のナビゲーションウィンドウで、 を選択します。
[API Security] ページで、[Schema Validation] タブを選択し、[Schema Validation Settings] をクリックします。

設定ページで、[Upload Schema] をクリックしてスキーマファイルをアップロードします。

ESA は、スキーマファイルで定義された API を管理対象の API に自動的に照合します。照合結果を確認し、[OK] をクリックします。

スキーマがアップロードされたら、非準拠リクエストに対して [Actions] を設定します。正当なトラフィックに影響を与えることなく誤検知を監視および記録するために、[Monitor] アクションから始めることを強く推奨します。[Status] スイッチをオンにして検証を有効にします。

[Schema Validation] タブに戻り、設定された API とその検証ステータスを表示します。

非準拠リクエストの分析
有効にすると、API Security はスキーマコンプライアンスについてリクエストを継続的に監視します。[Schema Validation] タブでは、スキーマでフィルターして、過去 24 時間の各 API の非準拠リクエストの数を確認できます。
非準拠リクエストの増加は、主に 2 つの問題を示している可能性があります。
クライアント側のエラー: 正当なクライアントが不正な形式のリクエストを送信している可能性があります。これは、フロントエンドコードのバグ、不正なパラメーターフォーマット (例: JSON の代わりにフォームデータ)、必須パラメーターの欠落、またはデータ型の不一致 (例: boolean の代わりに文字列) が原因である可能性があります。クライアント側の実装を確認し、より厳密な入力検証を追加することを検討してください。
攻撃の動作: 攻撃者は、SQL インジェクション、クロスサイトスクリプティング (XSS)、または壊れたアクセスの制御などの脆弱性を探るために、不正な形式のリクエストを送信することがよくあります。非準拠リクエストの急増は、攻撃の兆候である可能性があります。攻撃が疑われる場合は、アクションを変更してブロックし、より厳格な WAF ルールを設定してください。
リクエスト詳細の分析
非準拠リクエストの根本原因を診断するには、[Events] または [Security Analytics] でサンプリングされたログを検査できます。
[Schema Validation] タブで、非準拠リクエストの数が異常な API を特定します。

設定されたアクションに基づいて適切なツールを選択します。
アクションが [None] の場合: セキュリティアクションがトリガーされないため、これらのリクエストは [Security Analytics] で利用可能なより広範なログで表示するのが最適です。
アクションが[Monitor/Block] の場合: セキュリティイベントがトリガーされるため、ログは [Events] で簡単にアクセスして関連付けることができます。
このセクションでは Events を例として使用します。左側のナビゲーションウィンドウで、 を選択します。
Security Analytics を使用するには、左側のナビゲーションウィンドウで を選択します。
イベント分析 ページで、サンプリングログ エリアまで下にスクロールします。API Security によってトリガーされたイベントをフィルターします。ログエントリの
展開アイコンをクリックして詳細を表示します。詳細の機能に基づいてリクエストを分析します。詳細については、[Real-time Log] にピボットすることもできます。
アクションの変更
すべての API のグローバルデフォルトアクションを設定するか、特定の API に対してオーバーライドすることができます。
グローバルデフォルトアクションの変更: [Schema Validation] タブで、[Default Action] 列の [Change] をクリックし、アクションを選択します。
ブロック: 非準拠のリクエストをブロックし、ブロックログを記録します。
モニター: 非準拠のリクエストの通過を許可し、ログを記録します。
なし: アクションを実行せず、ログも記録しません。

特定の API のアクションを設定する: [Schema Validation] の API リストで、API の右側にある [Change Action] をクリックし、アクションを選択します。
デフォルト: グローバルデフォルトアクションを使用します。
ブロック: 非準拠のリクエストをブロックし、ブロックログを記録します。
モニター: 非準拠のリクエストの通過を許可し、ログを記録します。
なし: アクションを実行せず、ログも記録しません。

スキーマのない API の処理
スキーマをアップロードした後、一部の API は関連付けられないままになることがあります。[Schema Validation] タブで、[APIs Without A Schema] 列の数字をクリックして、これらのエンドポイントのリストを表示します。
スキーマのないエンドポイントは検証されないため、潜在的なセキュリティギャップが生じます。API が一致しない主な理由は 2 つあります。
スキーマからの省略: API が誤ってスキーマファイルから除外されました。リストで API のパス、ホスト、および HTTP メソッドを確認し、スキーマファイルを更新して再度アップロードしてください。
非標準の API 設計: 検出された API は標準の RESTful プラクティスに従っていないため、スキーマの定義と一致しません。API をリファクタリングする必要がある場合があります。一般的な問題は次のとおりです。
非標準のパス: たとえば、定義された
/usersの代わりに/userを使用するなど。不正な HTTP メソッド: たとえば、
DELETEの代わりに/users/delete/123のような破壊的なアクションにGETを使用するなど。ステータスコードの乱用: たとえば、エラーの場合でも常に
200 OKステータスを返し、実際のステータスコードをレスポンス本文に配置するなど (例:{ "status": "error", "code": 500 })。紛らわしいデータ構造: たとえば、リクエスト本文にあるべき
emailフィールドをレスポンススキーマで定義するなど、リクエストまたはレスポンスの誤った部分にフィールドを配置する。
スキーマの仕様
ファイル形式とサイズ
フォーマット: スキーマファイルは
.yml、.yaml、または.json形式である必要があります。サイズ: 最大ファイルサイズは 58 KB です。より大きなスキーマの場合は、
.json形式を使用し、アップロードする前に圧縮してください。
スキーマの内容
バージョン
ESA API セキュリティアーキテクcha検証は、現在 OpenAPI Specification (OAS) v3.0.x のみをサポートしています。
フィールド
必須フィールド
openapi: OAS バージョン文字列 (例:3.0.0)。info: API に関するメタデータ。version(例:1.0.0) を含みます。paths: API が提供されるホスト情報。servers: API が提供されるホスト情報:url:https://api.example.comなどの絶対 URL のみサポートされます。variables: サーバー変数はサポートされておらず、解析中に無視されます。
オプションフィールド
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"
}
}
]
}
}
}
}