背景
客户对安全提出了更高的要求,不允许WebRest接口中的Delete操作存在。需要整改WebRest接口中的DELETE操作。并保证不同版本的兼容性
整体方案
已有WebRest的DELETE接口通过AllowHttpDelete属性控制是否支持;新增与DELETE操作相同功能的POST类型的接口,确保业务功能正常
兼容性分析:当不支持Delete操作类型的uri时,新增的POST类型接口也会实现相应功能。WebRest接口由前端调用,均位于openUBMC,并不涉及openUBMC和BMC SDK的兼容性影响。
后续web的uri接口变更:
(1)新增URI需要从资源维度去描述(参考Redfish),针对资源的描述,不能存在带动作的词汇。
将创建操作视为标准的行为(a);其他操作视为针对该资源的自定义行为(b),需要参考Redfish规范的Action来设计,如:
a. 创建用户:POST:/UI/Rest/AccessMgnt/Accounts
b. 删除用户:POST:/UI/Rest/AccessMgnt/Accounts/Actions/Account.Delete
c. 导入用户公钥:POST:/UI/Rest/AccessMgnt/Accounts/Actions/Account.ImportSSHPublicKey
PS: 行为的请求参数中,需要考虑对多实例和单实例的删除
(2)历史存量URI:
需要补充删除、自定义行为的,按照规则(1)对新增接口进行规范设计,已有接口不再调整
举例:
- 老接口的资源描述不规范,携带动作的。补充删除或者其他自定义行为时,直接使用新的标准资源接口。
- 老接口的资源描述符合规范(1),不携带动作的。直接在相关URI上补充Action
本次整改webrest的delete接口的变更点:
| 业务 | ACTION | 原始URI | 整改类型 | 新URI | 修改描述 |
|---|---|---|---|---|---|
| 删除主机截屏 | DELETE | /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot | 新增操作类型 | /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot | 新增POST的操作,用于删除主机截屏 |
| 创建SP系统擦除配置文件 | POST | /UI/Rest/BMCSettings/SPService/SystemErase | 新增请求体 | /UI/Rest/BMCSettings/SPService/SystemErase | 新增RequestMethod标识用于确认是创建还是删除SP系统擦除配置文件 |
| 删除SP系统擦除配置文件 | DELETE | /UI/Rest/BMCSettings/SPService/SystemErase | 整改原始URI | /UI/Rest/BMCSettings/SPService/SystemErase | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 查询工作记录 | GET | /UI/Rest/Maintenance/WorkRecord | 不调整 | ||
| 修改工作记录 | PATCH | /UI/Rest/Maintenance/WorkRecord | 不调整 | ||
| 创建工作记录 | POST | /UI/Rest/Maintenance/WorkRecord | 新增请求体 | /UI/Rest/Maintenance/WorkRecord | 新增Id属性和RequestMethod标识用于确认是创建工作记录还是删除某一个工作记录; |
| 删除工作记录 | DELETE | /UI/Rest/Maintenance/WorkRecord/:workrecord_id | 整改URI | /UI/Rest/Maintenance/WorkRecord/:workrecord_id | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 查询用户 | GET | /UI/Rest/AccessMgnt/Accounts | 不调整 | ||
| 修改用户 | PATCH | /UI/Rest/AccessMgnt/Accounts/:accountid | 不调整 | ||
| 创建用户 | POST | /UI/Rest/AccessMgnt/Accounts | 新增属性 | /UI/Rest/AccessMgnt/Accounts | 属性名RequestMethod,支持删除操作 |
| 用户管理 | DELETE | /UI/Rest/AccessMgnt/Accounts/:accountid | 整改URI | /UI/Rest/AccessMgnt/Accounts/:accountid | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 删除证书 | POST | /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | 新增接口 | /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | body为证书类型和id |
| 证书管理 | DELETE | /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | 整改URI | /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 删除ssh公钥 | POST | /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | 新增接口 | /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | body为二次认证密钥 |
| ssh公钥管理 | DELETE | /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | 整改URI | /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 删除会话 | POST | /UI/Rest/Sessions | 新增接口 | /UI/Rest/Sessions | body为请求方法和sessionid |
| 删除会话 | DELETE | /UI/Rest/Sessions/:id | 整改URI | /UI/Rest/Sessions/:id | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 创建用户角色 | POST | /UI/Rest/AccessMgnt/RightManagement | 新增属性 | /UI/Rest/AccessMgnt/RightManagement | 属性名RequestMethod ,支持删除操作 |
| 删除用户角色 | DELETE | /UI/Rest/AccessMgnt/RightManagement/:id | 整改URI | /UI/Rest/AccessMgnt/RightManagement/:id | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 下载历史功率数据 | POST | /UI/Rest/System/Power/History | 新增属性 | /UI/Rest/System/Power/History | 属性名RequestMethod,支持删除操作 |
| 清除历史功率数据 | DELETE | /UI/Rest/System/Power/History | 整改URI | /UI/Rest/System/Power/History | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
| 查询逻辑盘信息 | GET | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 不调整 | ||
| 设置逻辑盘信息 | PATCH | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 不调整 | ||
| 创建逻辑盘 | POST | /UI/Rest/System/Storage/:storageid/Volumes | 新增属性 | /UI/Rest/System/Storage/:storageid/Volumes | 属性名RequestMethod,支持删除操作 属性名VolumeIds,当RequestMethod为DELETE时支持设置 |
| 删除逻辑盘 | DELETE | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 整改URI | /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | 增加url使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问 |
评审点1:运维Rest接口整改
1.如下功能的REST接口的DELETE方法新增使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问:
(1)删除手动截屏:/UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot
(2)删除SP系统擦除配置文件:/UI/Rest/BMCSettings/SPService/SystemErase
(3)删除工作记录:/UI/Rest/Maintenance/WorkRecord/:workrecord_id
2.新增rest接口资源和属性
(1)删除手动截屏添加操作类型
变化类型:新增操作类型
变更资源URI:/UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot(已有)
操作类型:POST(新增)
输入参数:
请求体如下:
| 属性名称 | 取值类型 | 变化类型 | 是否为必传参数 | 默认值 | 取值约束 | 描述 |
|---|---|---|---|---|---|---|
| SystemId | 数字 | 新增属性 | 否 | 1 | 枚举值:[1, 2] | 待删除截图所属主机,默认删除主机一的截图 |
(2)新增删除SP系统擦除配置文件的方法
变化类型:新增URI
资源URI:/UI/Rest/BMCSettings/SPService/SystemErase/Actions/SystemErase.Delete(已有)
操作类型:POST
输入参数:
(3)新增删除工作记录的方法
变化类型:新增请求体属性
变更资源URI:/UI/Rest/Maintenance/WorkRecord(已有)
操作类型:(POST)(已有)
输入参数:
请求体如下:
| 属性 | 数据类型 | 属性说明 | 取值范围 | POST约束 | DELETE约束 |
|---|---|---|---|---|---|
| RequestMethod | string | 用于标识创建用户还是删除用户,默认使用POST | 枚举类型:[“POST”,“DELETE”] | 可选 | 必选 |
| Id | string | 工作记录的ID | 取值范围:[1, 20] | 不可选 | 必选 |
| Content | string | 待记录的内容 | 字符串长度:[1, 255] | 必选 | 不可选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"Content": "测试用文本"
}
ReqBody请求体示例(DELETE):
{
"RequestMethod": "DELETE"
"Id": "1"
}
响应体如下:
| 属性名称 | 取值类型 | 描述 |
|---|---|---|
| TotalNumber | 数字 | 工作记录的数量 |
| List | 对象数组 | 所有工作记录的信息 |
| ID | 字符串 | 工作记录的Id |
| UserName | 字符串 | 最后一次编辑工作记录的用户名称 |
| IPAddress | 字符串 | 最后一次编辑工作记录的用户ip |
| Time | 字符串 | 最后一次编辑工作记录的时间 |
| Content | 字符串 | 这个工作记录Id对应的内容 |
响应体示例:
{
"List": [
{
"UserName": "Administrator",
"ID": "1",
"IPAddress": "127.0.0.1",
"Content": "测试用文本",
"Time": "2011-03-07 07:11:28"
}
],
"TotalNumber": 1
}
评审点2:安全管理接口整改
1.如下功能的REST接口的DELETE方法新增使用条件,当AllowHttpDelete为False时无法访问,不存在或者为True则可以访问:
(1)删除用户:/UI/Rest/AccessMgnt/Accounts/:accountid
(2)删除证书:/UI/Rest/AccessMgnt/CertMgnt/DeleteCert
(3)删除ssh公钥:/UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey
(4)删除会话:/UI/Rest/Sessions/:id
(5)删除用户角色:/UI/Rest/AccessMgnt/RightManagement/:id
2.新增rest接口资源和属性
(1)新增用户接口添加属性
变化类型:在原有接口POST下新增属性,支持删除用户,并变更原有一部分属性的可选项。
变更资源URI:/UI/Rest/AccessMgnt/Accounts
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | POST约束 | DELETE约束 |
|---|---|---|---|---|---|
| RequestMethod | string | 用于标识创建用户还是删除用户,默认使用POST | 枚举类型:“POST”,“DELETE” | 可选 | 可选 |
| ID | integer | 用户ID | 取值范围:[2, 17] | 可选 | 必选 |
| UserName | string | 用户名称 | 字符串长度:[1, 16] | 必选 | 不可选 |
| RoleID | string | 用户角色ID | 枚举类型:“NoAccess”,“CommonUser”, “Operator”,“Administrator”,“CustomRole1”,“CustomRole2”,“CustomRole3”,“CustomRole4”,“CustomRole5”,“CustomRole6”,“CustomRole7”,“CustomRole8”,“CustomRole9”,“CustomRole10”,“CustomRole11”,“CustomRole12”,“CustomRole13”,“CustomRole14”,“CustomRole15”,“CustomRole16” | 必选 | 不可选 |
| Password | string | 用户密码 | 字符串长度:[1, 20] | 必选 | 不可选 |
| LoginInterface | string | 用户能够使用的登录接口 | 枚举类型: “Web”,“SNMP”,“IPMI”,“SSH”,“SFTP”,“Local”,“Redfish” | 可选 | 不可选 |
| LoginRule | array | 用户登录规则 | 枚举类型:“Rule1”,“Rule2”, “Rule3” | 可选 | 不可选 |
| ReauthKey | string | 二次鉴权密码 | 字符串长度:[1, 128] | 必选 | 必选 |
| FirstLoginPolicy | number | 首次登录策略 | 枚举类型:1,2 | 必选 | 不可选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"UserName": "test",
"RoleID":"Administrator",
"Password":"XXXXXX",
"ReauthKey":"xxxxx",
"FirstLoginPolicy":1
}
ReqBody请求体示例(DELETE):
{
"RequestMethod":"DELETE"
"ID": 3,
"ReauthKey":"QWR12taWwMDA"
}
(2)新增删除证书接口方法
变化类型:新增POST接口
资源URI:/UI/Rest/AccessMgnt/CertMgnt/DeleteCert
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| CertificateType | int | 删除证书类型 | 取值范围:[0, 4] | 必选 |
| ID | int | 删除的证书的ID | 取值长度:[0, 32] | 必选 |
ReqBody请求体示例:
{
"CertificateType":0,
"ID": 1
}
(3)新增删除ssh公钥接口方法
变化类型:新增POST接口
资源URI:/UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| ReauthKey | string | 二次鉴权密码 | 字符串长度:[1, 128] | 必选 |
ReqBody请求体示例:
{
"ReauthKey":"QWR12taWwMDA",
}
(4)新增删除用户会话接口
变化类型:新增接口,参考原有删除用户URI :/UI/Rest/Sessions/:id
变更资源URI :/UI/Rest/Sessions
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| RequestMethod | string | 标识用于删除会话ID | 枚举类型:“DELETE” | 必选 |
| SessionId | string | 用户会话ID | 资源树校验 | 必选 |
ReqBody请求体示例:
{
"RequestMethod": "DELETE",
"SessionId": "c482ad820d6453424d1af86e",
}
(5)新增用户角色接口添加属性
变化类型:新增接口属性
变更资源URI:/UI/Rest/AccessMgnt/RightManagement
原有删除用户角色URI:/UI/Rest/AccessMgnt/RightManagement/:id
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| RequestMethod | string | 用于标识创建用户角色还是删除用户角色,默认使用POST | 枚举类型:“DELETE”,“POST” | 可选 |
| ID | integer | 用户角色ID | 取值范围:[8, 20] | 必选 |
| ReauthKey | string | 二次鉴权密码 | 字符串长度:[1, 128] | 必选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"ID": 10,
"ReauthKey":"QWR12taWwMDA",
}
ReqBody请求体示例(DELETE):
{
"RequestMethod": "DELETE"
"ID": 10,
"ReauthKey":"QWR12taWwMDA",
}
评审点3:能效管理接口整改
1、如下功能的REST接口的DELETE方法需要新增使用功能条件,当AllowHttpDelete为False时无法访问,为True则可以访问:
(1)原有历史功率数据Uri:/UI/Rest/System/Power/History
2、新增下载历史功率接口属性
变化类型:新增接口属性
资源URI:/UI/Rest/System/Power/History
操作类型:POST
输入参数:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| DataType | string | 删除数据类型 | 枚举类型"System",“Fan”,“Cpu”,“Memory” | 必选 |
| SystemId | int | 系统ID | 系统ID是否存在 | 可选 |
| RequestMethod | string | 用于标识下载历史功率接口或者删除,默认使用POST | 枚举类型:“DELETE”,“POST” | 必选 |
ReqBody请求体示例(POST):
{
"RequestMethod":"POST",(可选)
"DataType": "System",
"SystemId": 1
}
ReqBody请求体示例(DELETE):
{
"RequestMethod": "DELETE"
"DataType": "System",
"SystemId": 1
}
评审点4:通用硬件接口整改
相关接口:
(1)查询逻辑盘信息:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Get操作)
(2)设置逻辑盘信息:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Patch操作)
(3)创建逻辑盘:/UI/Rest/System/Storage/:storageid/Volumes(Post操作)
(4)删除逻辑盘:/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid(Delete操作)
1、 变更用于“删除逻辑盘”的WebRest接口Delete操作
资源URI (已有):/UI/Rest/System/Storage/:controllerid/Volumes/:volumeid
变化类型 :变更应用场景
操作类型 :Delete
应用场景 :删除逻辑盘
操作权限 :BasicSetting
输入参数 :无
说明:该接口DELETE操作是否支持依赖于资源协作接口bmc.kepler.Managers.WebService下的AllowHttpDelete 属性:
1)无法获取AllowHttpDelete 属性(社区新版本配套旧版本SDK场景),或AllowHttpDelete 属性值为true时,支持DELETE操作。
2)AllowHttpDelete 属性值为false时,不支持DELETE操作。
2、变更用于“创建逻辑盘”的WebRest接口
资源URI(已有):/UI/Rest/System/Storage/:storageid/Volumes
变化类型:新增输入参数
操作类型:Post
应用场景:用于创建和删除逻辑盘(删除功能与原uri /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid下的Delete操作一致,创建功能与原/UI/Rest/System/Storage/:storageid/Volumes下的功能一致)
操作权限:BasicSetting
输入参数:
参数变更:
| 属性 | 数据类型 | 属性说明 | 取值范围 | 约束 |
|---|---|---|---|---|
| VolumeIds(新增) | Array(string) | 要删除的逻辑盘Id数组 | 数组元素(要删除的逻辑盘Id)的取值范围为字符串 | 当RequestMethod为“POST”时为不可选,当RequestMethod为“DELETE”时为必选 |
| RequestMethod(新增) | string | 操作类型,当取值为“POST”时,实现创建逻辑盘功能;当取值为“DELETE”时,实现删除逻辑盘功能 | 枚举值:“POST”、“DELETE”,默认值为“POST”。 | 可选 |
| Drives(已有) | Array(number) | 物理盘Id数组 | 数组元素(物理盘Id)的取值范围为number | 当RequestMethod为“POST”时为必选,当RequestMethod为“DELETE”时不可选 |
| VolumeRaidLevel(已有) | string | RAID级别 | 枚举值:“RAID0”, “RAID1”,“RAID5”, “RAID6”, “RAID10”,“RAID50”,“RAID60”, “RAID1(ADM)”,“RAID10(ADM)”,“RAID1Triple”,“RAID10Triple” | 当RequestMethod为“POST”时为必选,当RequestMethod为“DELETE”时不可选 |
ReqBody请求体示例:
创建逻辑盘:
{
"RequestMethod": "POST",
"Drives": [0, 1],
"VolumeRaidLevel": "RAID0"
}
删除逻辑盘:
{
"RequestMethod": "DELETE",
"VolumeIds": [“LogicalDrive238”]
}
评审结论
一、同意新增以下post接口,详细描述见各评审点
| uri | 操作类型 | 功能 |
|---|---|---|
| /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot | POST | 删除手动截屏 |
| /UI/Rest/BMCSettings/SPService/SystemErase/Actions/SystemErase.Delete | POST | 删除SP系统擦除配置文件 |
| /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | POST | 删除证书 |
| /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | POST | 删除ssh公钥 |
| /UI/Rest/Sessions | POST | 删除用户会话 |
二、同意以下post接口新增RequestMethod属性判断调用的业务,详细描述见各评审点
| uri | 操作类型 | 功能 |
|---|---|---|
| /UI/Rest/Maintenance/WorkRecord | POST | RequestMethod属性取值为POST时表示创建工作记录。RequestMethod属性取值为DELETE时表示删除工作记录。 |
| /UI/Rest/AccessMgnt/Accounts | POST | RequestMethod属性取值为POST时表示新增用户。RequestMethod属性取值为DELETE时表示删除用户。 |
| /UI/Rest/AccessMgnt/RightManagement | POST | RequestMethod属性取值为POST时表示新增用户角色。RequestMethod属性取值为DELETE时表示删除用户角色。 |
| /UI/Rest/System/Power/History | POST | RequestMethod属性取值为POST时表示下载历史功率。RequestMethod属性取值为DELETE时表示清空历史功率。 |
| /UI/Rest/System/Storage/:storageid/Volumes | POST | RequestMethod属性取值为POST时表示创建逻辑盘。RequestMethod属性取值为DELETE时表示删除逻辑盘。 |
三、同意webrest的Delete接口根据AllowHttpDelete属性判断是否支持,详细描述见各评审点
| uri | 操作类型 | 功能 |
|---|---|---|
| /UI/Rest/Maintenance/SystemDiagnostic/DeleteScreenshot | DELETE | 删除手动截屏 |
| /UI/Rest/BMCSettings/SPService/SystemErase | DELETE | 删除SP系统擦除配置文件 |
| /UI/Rest/Maintenance/WorkRecord/:workrecord_id | DELETE | 删除工作记录 |
| /UI/Rest/AccessMgnt/Accounts/:accountid | DELETE | 删除用户 |
| /UI/Rest/AccessMgnt/CertMgnt/DeleteCert | DELETE | 删除证书 |
| /UI/Rest/AccessMgnt/Accounts/:accountid/DeleteSSHPublicKey | DELETE | 删除ssh公钥 |
| /UI/Rest/Sessions/:id | DELETE | 删除会话 |
| /UI/Rest/AccessMgnt/RightManagement/:id | DELETE | 删除用户角色 |
| /UI/Rest/System/Power/History | DELETE | 清空历史功率 |
| /UI/Rest/System/Storage/:controllerid/Volumes/:volumeid | DELETE | 删除逻辑盘 |
遗留问题
1、需要到TC组织汇报,同步变更的背景和变更方式
结果:已在TC评审(社区WebRest接口整改Delete的Method为POST方式),使用兼容性的策略落地
2、需要添加映射器检查机制:禁止开发者直接新增WebRest的delete接口。新增白名单,后续评审后需要手动向白名单添加接口。
结果:已闭环
3、rackmount仓的Readme需要添加对应的修改(webrest接口添加delete操作时,需要加上AllowHttpDelete属性,判断是否支持该接口)
结果:已闭环
4、是否要改成post类型接口的请求参数中添加操作类型的参数,通过这个参数控制是Post还是Delete,默认为Post。然后删除Delete接口
结果:已闭环,见各个评审点
5、要提前在社区发布变更说明
结果:实际落地方案不涉及接口变更,不需要发布变更说明