1.需求背景
系统安全保障非常重要,我们对用户自行安全测试过程中发现的问题进行了总结,主要有以下几类:
(1) Smartbi作为通用的产品,以及考虑常用的应用场景,个别安全问题无法在产品中直接做修改;
(2)因为测试标准不同,内部测试没有发现的问题,或者是产品修改添加一些增强的功能点,没有及时发现问题;
(3)由于集成或者使用第三方应用服务器导致的问题,比如:Tomcat的一些配置会导致启用了不安全的 HTTP 方法;
(4)定制开发扩展功能点导致的安全问题。
针对以上问题,Smartbi提供扩展包WebSecurityExt,主要是解决由appscan扫描出的漏洞,并且可设置自行添加请求头和请求头值。
2.功能说明
WebSecurityExt扩展包主要通过以下方式起作用:
(1)当前扩展包可以根据properties提供的配置,自动给filter拦截到的请求添加请求头和对应的值。
(2)Properties中的key就是请求头的名称,value就是设置的请求头的值。
3.使用说明
使用前提:此扩展包需要匹配使用2021-01-28号之后的smartbi.war包,如果是这个日期之前的smartbi.war包,需要先更新到2021-01-28号之后的war包才能正常使用。
(1)扩展包下载:
V9及以上版本:WebSecurityExt.ext,扩展包部署参考:部署扩展包
V8版本:WebSecurityExt.ext ,扩展包部署参考:部署扩展包
(2)扩展包中Properties文件用于设置漏洞的请求头信息,需要在WebSecurityExt.properties中进行设置。
注意:修改扩展包文件可以用压缩工具打开,然后将文件直接拖拽到桌面进行修改,修改后再添加回扩展包;不要手动解压扩展包然后又压缩回去,这样容易造成扩展包文件路径不对,导致无法正常使用。
4.补充说明
4.1 常见安全问题
总结我们在安全测试中,有以下常见的安全问题,不同安全问题的解决办法不一,具体如下,供参考:
常见安全问题 | 解决办法 |
"Content-Security-Policy" 头缺失或不安全 | 通过在properties中设置key和value,扩展包的filter会根据key和value相对应的给拦截到的请求设置请求头key和请求头的值value。 |
"X-Content-Type-Options"头缺失或不安全 | 同上,也是通过properties配置对其进行设置值。 |
"X-XSS-Protection"头缺失或不安全 | 同上,通过properties配置的key和value进行设置值。 |
跨帧脚本编制防御缺失或不安全 | 主要也是设置请求头参数,设置X-Frame-Options 主要是对iframe进行设置的,要注意修改这个的值的时候,有可能会影响到移动端打开报表的功能(具体可配内容见4 properties值配置) |
CSRF请求伪造 | 主要是判断referer是否是信任的安全网络,如果是信任的安全网络就可以放行,如果是不信任的站点,则重定向到错误页面,具体如何配置请看下面的safeReferer。 |
SSRF跨站服务端请求伪造 |
4.2 配置说明
通过设置Properties值,可以解决常见的几种Web安全问题,对Properties中值解释如下:
4.2.1 errorURL
(1)跳转到错误页面的地址,默认值为/smartbi/vision/errorCode500.jsp
(2)如果没有修改过前缀的话,则不需要改动。如果修改了前缀,比如: ip:host/Huawei/vision/index.jsp,则需要errorURL的值改为: /Huawei/vision/errorCode500.jsp
4.2.2 safeReferer
(1)这个是设置允许通过的网络路径,比如http://localhost:8080是允许通过的网络,就可以设置为 http\://localhost:8080
(2)若safeReferer不设置的话,本服务器是默认放行,然后把其他referer全都拦截。
(3)如果设置多个允许通过的网络路径,就以英文逗号为分割如 http\://localhost:8080,http\://10.10.101.86:8080
注意:多数的集成环境(单点登录,nginx)会出现配置扩展包以后无法正常访问系统的情况,主要就是因为safeReferer没有配置完整。
此时,可以根据日志进行判断,看请求的referer是否都配置在safereferer中。
4.2.3 X-XSS-Protection
(1)配置X-XSS-Protection请求头的值。
(2)X-XSS-Protection有几种配置:
0:禁用XSS保护;
1:启用XSS保护;启用XSS保护,并在检查到XSS攻击时,停止渲染页面
4.2.4 X-Frame-Options
(1)配置 X-Frame-Options 请求头的值。
(2)可设置的值为:
DENY:页面不能被嵌入到任何iframe或frame中;
SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中;设置后,页面将不能被外部iframe嵌套,如果有集成相关的功能,可能会受到影响
ALLOW-FROM:页面允许frame或frame加载。(当前允许本服务器的)
---注意:这是一个被弃用的指令,不再适用于现代浏览器,请不要使用它。在支持旧版浏览器时,页面可以在指定来源的 frame 中展示。请注意,在旧版 Firefox 上,它会遇到与 SAMEORIGIN 相同的问题——它不会检查 frame 所有的祖先页面来确定他们是否是同一来源。Content-Security-Policy HTTP 首部有一个 frame-ancestors 指令,可以使用这一指令来代替。
示例:
i.-->允许单个其他服务器嵌套
Content-Security-Policy='frame-ancestors https://www.xxx.com'
ii.-->允许多个其他服务器嵌套,使用空格分隔
Content-Security-Policy='frame-ancestors https://www.xxx.com https://www.yyy.com'
(3)若使用DENY以及SAMEORIGIN有可能会导致移动端的报表,以及第三方集成相关的资源无法加载。
4.2.5 X-Content-Type-Options
(1)配置 X-Content-Type-Options 请求头的值。
通常浏览器会根据响应头的Content-Type字段来分辨请求资源的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
(2)默认值为:nosniff (一般不需要修改)
4.2.6 Content-Security-Policy
(1)配置 Content-Security-Policy 请求头的值。
(2)配置好并启用后,不符合 CSP 的外部资源就会被阻止加载。比如配置了 default-src 'self' ,有这个规则的话,就会对某些资源进行了阻碍,如果设置了这个值,然后打开smartbi发现有些功能不正常,可以打开f12(开发者工具),然后观察是否是系统禁用了。
(3)请求头可以设置的值为下面的:
请求头 | 解释 |
script-src 'self' | 外部脚本 |
style-src 'self' | script-src 版的样式表 |
img-src 'self' | 用于定义可从中加载图像的来源 |
font-src 'self' | 用于指定可提供网页字体的来源 |
media-src 'self' | 用于限制允许传输视频和音频的来源 |
object-src 'self' | 可对 Flash 和其他插件进行控制 |
plugin-types 'self' | 用于限制页面可以调用的插件种类 |
child-src 'self' | 用于列出适用于工作线程和嵌入的帧内容的网址(框架) |
default-src 'self' | 会对所有外部资源都限制,然后只能加载当前域名的资源 |
(4)现在的值是:form-action *,限制能被用来作为给定上下文的表单提交的目标 URL(限制 form 的 action 属性的链接地址)。
(5)如果要修改的form-action的话,要注意当前是否有form表单到其他地方,防止没设置导致form表单提交失败。
(6)如果使用default-src 'self' 这个值的话,有的时候会导致smartbi一些资源无法加载出来,比如在登陆页面的输入框就无法加载
4.2.7 strictLimit
(1)该配置项表示 是否要开启严格限制。
(2)默认值为false,表示不开启。如果修改为true,则表示当referer为空且使用post请求rmiservlet时做拦截。(这种情况通常发生在本地使用html表单请求当前服务器)
4.3 添加新的请求头
(1)除了errorURL和safeReferer是特殊的情况。其他的都是对应请求头的key和value值
(2)比如想要添加请求头 ABC,值为11。只需要在properties文件中,添加ABC=11 就可以了。
4.4 .Web应用服务器配置
(1)启用了不安全的"OPTIONS"HTTP 方法