【已评审】整改WebRest接口中的DELETE操作,将其修改为POST接口

背景

客户对安全提出了更高的要求,不允许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. 老接口的资源描述不规范,携带动作的。补充删除或者其他自定义行为时,直接使用新的标准资源接口。
  2. 老接口的资源描述符合规范(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、要提前在社区发布变更说明
结果:实际落地方案不涉及接口变更,不需要发布变更说明