上傳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路徑,如/apiservers: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"
}
}
]
}
}
}
}