上傳API的架構標準後,ESA將自動匹配符合該規範的已管理API,同時針對傳入的請求進行合規驗證並進行處理,保障業務API安全。
功能原理
當您的API已在ESA API管理中時,即可對已管理的API統一進行結構描述驗證。
-
使用者請求到達ESA節點後,會判斷請求調用的是否為已管理API:
-
若不是,則在該階段允許存取,由其他功能設定進行處置;
-
若是,則匹配對應API的架構規範。
-
-
根據架構規範判斷請求是否合規:
-
若不合規,則根據配置的執行動作進行處置,並記錄不合規日誌。
-
若合規,則允許存取。
-
配置結構描述驗證設定
在使用結構描述驗證功能之前,需要完成架構規範上傳,再開啟功能生效開關。
-
在ESA控制台選擇網站管理,在網站列單擊目標網站。
-
在左側導覽列,選擇。
-
在API 安全頁面,選擇結構描述驗證頁簽,單擊結構描述驗證設定。

-
在設定頁面,單擊上傳架構,上傳自訂的架構檔案。

-
ESA會根據架構檔案自動匹配對應的API,檢查後單擊確認。

-
架構上傳後,可以配置針對不合規請求執行的預設動作,建議配置觀察,並開啟狀態開關。

-
返回結構描述驗證頁簽,即可展示結構描述驗證運行效果。

分析不合規請求
配置完成結構描述驗證後,ESA將持續對API請求進行檢測。您可以在結構描述驗證頁簽單擊API列表功能表列的
篩選按鈕,選擇對應的架構篩選出需要分析的架構,即可為您展示相應的API,並在不合規請求列中展示近24小時的不合規請求數。
不合規請求可能由幾個原因導致:
-
用戶端行為問題:用戶端出現傳參格式錯誤(如需JSON卻傳表單資料)、必填參數缺失、類型不符(字串傳布爾值)等問題時,可能導致不合規請求數增加。出現此類問題時,需要檢查業務前端設計,增加錯誤偵測機制、提交提醒等。
-
異常攻擊行為:當攻擊者進行注入攻擊、暴力破解等攻擊行為時,可能導致不合規請求數增加。出現此類問題時,您的業務系統可能正在遭受攻擊,建議您更改執行動作為攔截,並配置更嚴格WAF規則。
請求詳情分析
更改執行動作
您可以為所有API統一配置預設的不合規請求執行動作,也可根據需求為特定API進行設定。
-
修改全域預設執行動作:在結構描述驗證頁簽單擊預設執行動作欄的更改按鈕,選擇合適的動作即可:
-
攔截:阻止不合規的請求,並記錄攔截日誌。
-
觀察:允許存取不合規的請求,並記錄日誌。
-
無:不進行任何操作。

-
-
配置特定API執行動作:在結構描述驗證頁簽的API列表單擊對於API列右側的更改執行動作,選擇合適的動作即可。
-
預設:使用全域預設執行動作。
-
攔截:阻止不合規的請求,並記錄攔截日誌。
-
觀察:允許存取不合規的請求,並記錄日誌。
-
無:不進行任何操作。

-
分析無架構的API
當您成功上傳架構檔案後,符合架構的API將自動綁定對應的架構。您可以在結構描述驗證頁簽單擊無架構的 API 數量欄的篩選按鈕進行篩選查看無架構的API列表。
針對無架構的API,ESA無法進行不合規請求統計,因此針對這類API對業務可能並不安全。無架構的API可能來自:
-
架構中遺漏:在上傳的架構中遺漏了該類API。您可以核對列表中的API路徑、主機記錄、請求方案等資訊特徵,重新調整上傳架構檔案解決。
-
API不合規範:已發現的API不符合規範。在API開發過程中,出現不規範開發,需要重新對不合規API進行修改或重構,通常包含以下幾類:
-
路徑不規範:API的路徑有誤,如正確的
paths應為/users,錯誤時寫為/user。 -
HTTP方法誤用:方法未遵循語義化原則,如用
DELETE對應/users/delete/123的路徑,錯誤時寫為GET方法。 -
狀態代碼濫用:API響應狀態代碼有誤,如所有響應需返回
200 OK,錯誤時在Body中寫{ "responses": “500” }。 -
輸入輸出結構混亂:輸入輸出內容有誤,如輸入應包含
email欄位,但錯寫至輸出中。
-
架構檔案說明
類型和大小
結構描述驗證檔案僅支援 .yml、.yaml 或 .json 格式,最大上傳大小為 58KB。如果上傳架構檔案過大,可以使用.json格式並且在本地進行壓縮。
架構內容
版本
ESA API安全結構描述驗證當前僅支援OAS v3.0.x版本。
欄位
必選欄位
-
openapi:API版本資訊,如3.0.0。 -
info:架構檔案說明,如“version”:“1.0.0”。 -
paths:至少包含一個API路徑,如/api -
servers:Host資訊。支援以下子欄位:-
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"
}
}
]
}
}
}
}
