一、目的

本文主要是针对smartbi系统提供安全配置建议,提升smartbi系统的安全性。

二、V11的安全加固建议

1.安全加固类型

根据实际需求选择安全加固优先级

需求分类

风险特征

风险事件

数据权限加固

用于不同用户访问数据的范围是不一样的,如客户信息、核心业务数据,各个区域负责人只能看自己区域

数据越权访问、内部人员滥用权限、数据篡改或窃取

资源权限加固

如基于财务数据创建的报表,只有财务人员和领导层可看,主要控制基于系统创建的报表、数据模型等资源的查看/编辑权限,敏感报表建议设置用户访问权限

用户访问超出权限的目录

操作权限加固

敏感功能限制,如自定义计划任务、自助ETL、原生SQL等给用户很大灵活空间的功能同样会带来操作风险

功能包含敏感信息或开放风险较高

系统攻击防御

安全漏洞、界面暴力破解、IP地址伪造

已存在的安全漏洞没有更新安全补丁、登录界面或配置界面被暴力破解

按场景进行区分攻击防御的手段

场景分类

场景示例

风险

需求分类

必须加固措施

建议增强措施

外网暴露环境

  • 外网仅具备浏览报表权限,但因未实施内外网权限分离,且全国众多子公司均有访问需求,难以有效进行分离。
  • 系统已集成至第三方平台,集成程度较深,如:支持创建资源等操作。
  • 数据来源在云环境平台,只能打通外网。
  • 攻击导致服务不可用

  • 暴力破解获取管理员账号

★系统攻击防御

  • 各个部署组件弱密码检测

  • 及时更新系统安全补丁
  • 限制 IP地址访问config、monitor、defender页面

  • 通过安全卫士设置内外网访问请求黑名单限制


  • 防止 index 登录界面暴力破解

组件安全推荐配置

  • 防止IP地址伪造
  • 数据加密传输
  • 删除tomcat/webapps目录下的多余应用

操作权限/资源权限/数据权限

  • 关闭DDL/DML语句执行权限
  • 过滤 [其它类型] 参数中的特殊字符
  • 敏感功能的权限控制

  • 数据挖掘安全配置

  • 导出引擎配置白名单

  • 限制config/chooser.jsp文件访问路径

外网仅浏览权限场景

  • 集成移动端驾驶舱。

  • 实现钉钉、企业微信、飞书与报表的集成。

  • 目录遍历攻击

  • 获取系统敏感信息

★系统攻击防御
  • 各个部署组件弱密码检测
  • 及时更新系统安全补丁
  • 限制 IP地址访问config、monitor、defender页面
  • 通过安全卫士设置内外网访问请求黑名单限制
  • 防止 index 登录界面暴力破解
组件安全推荐配置
  • 防止IP地址伪造
  • 数据加密传输
  • 删除tomcat/webapps目录下的多余应用
操作权限/资源权限/数据权限
  • 数据挖掘安全配置
  • 导出引擎配置白名单
  • 关闭DDL/DML语句执行权限
  • 敏感功能的权限控制

内网场景

  • 仅限内部员工访问,无外网入口

  • 内部越权操作

  • 员工导出敏感数据

/
  • 限制config/chooser.jsp文件访问路径
  • 防止IP地址伪造
  • 防止 index 登录界面暴力破解
  • 系统水印添加

2.数据权限加固

【按需加固】数据权限设置

数据权限设置:数据权限

【建议加固】系统水印添加

水印设置:系统选项-水印设置

【建议加固】

在系统选项-高级设置中,添加 SQLDDLDMLAUTHORITY_CONTROL_SWITCH=true 配置项,关闭在SQL 查询中执行 DDL/DML 语句的权限。

[其他类型]是一种特殊的参数类型,区别于常规的数据库数据类型,主要用于将参数值动态拼接到SQL语句中。例如,它可以将参数值拼接为SQL查询的SELECT子句部分

我们可以通过在 [系统选项-高级设置] 添加 SQL_ILLEGAL_CHARTS 设置项来自定义一些需要过滤的特殊字符,预防SQL注入。

# sql 非法字符,value值就是想要限制的特殊字符,多个使用 | 来分割
SQL_ILLEGAL_CHARTS='| and | or |--|updatexml|extractvalue

# 设置发现存在非法字符时报错的提示内容,如果不设置则默认内容为“使用了禁用的特殊关键字,如有特殊需要,请联系管理员。”
SQL_ILLEGAL_CHARTS_TIP=存在注入攻击的可能,如有特殊需要,请联系管理员


【可选加固】数据安全

强制启用导出规则控制数据导出,在系统选项-安全设置中配置。具体配置请参考文档:系统选项-安全设置

3.资源权限加固

【按需加固】资源权限设置

资源权限设置:资源权限管理

【建议加固】限制config/chooser.jsp文件访问路径

在 运维设置>常用功能>系统选项>高级设置 中,设置JSP_CHOOSER_ROOT_PATH设置项可限制config/chooser.jsp页面文件访问路径,值为限制用户可选的最大可选择根目录。

参考wiki文档配置:限制config/chooser.jsp文件访问路径

4.操作权限加固

【按需加固】操作权限分配

操作权限设置:操作权限管理

【必须加固】敏感功能的权限控制

功能

建议加固级别

权限建议

安全设置->定制任务

必须加固

只开放给管理用户

安全设置->系统监控

必须加固

只开放给管理用户

安全设置->错误详情

建议加固

只开放给管理用户

安全设置->系统日志

建议加固

只开放给管理用户

数据准备->数据集->数据模型->脚本查询

建议加固

只开放给管理用户

数据准备->数据集->数据模型->SQL查询

建议加固

只开放给管理用户

数据准备->数据集->数据模型->JAVA查询

建议加固

只开放给管理用户

数据准备->数据集->数据模型->存储过程查询

建议加固

只开放给管理用户

数据准备->自助 ETL->Python 脚本

建议加固

只开放给管理用户

数据挖掘->实验管理->Python 脚本

建议加固

只开放给管理用户

系统选项->高级设置->不允许调用没有用权限的服务接口(越权访问)

建议加固

手工修改为 true

【外网-必须加固】数据挖掘安全配置

配置为只允许内部服务器的 IP 访问数据挖掘相关的服务,不开放外网访问。

【外网-必须加固】导出引擎配置白名单

配置为只允许内部服务器的 IP 访问Smartbi导出引擎相关的服务,不开放外网访问。参考wiki文档配置:导出引擎白名单设置

5.系统攻击防御

【必须加固】各个部署组件弱密码检测

弱密码检测checklist:安装部署_安全维度Checklist

【必须加固】及时更新系统安全补丁

关注smartbi官方的安全补丁通知,及时做好相关安全漏洞补丁更新。

官网安全补丁地址下载:https://www.smartbi.com.cn/patchinfo

【必须加固】限制 IP地址访问config、monitor、defender页面

通过smartbi.properties 文件新增配置项来限定ip访问,建议只对服务所在机器开放。,具体可参考wiki文档进行配置:授权IP地址访问config、monitor、defender页面

其他注意事项:

登录config.jsp页面内的知识库的【密码】项要勾选【加密保存】

【建议加固】防止 index 登录界面暴力破解

通过安装登录验证码扩展包+登录错误多次锁定用户扩展包+增强用户复杂密码 来防止暴力破解
配置方式:

  1. 部署登录验证码扩展包

  2. 登录错误多次锁定用户扩展包

  3. 设置复杂的用户登录密码和密码有效期

对于系统安全来说,用户登录密码强度是一个系统安全检测点,如何提高用户密码的安全性,比如说进行口令复杂度校验以及定期更新密码:
1)密码位数要求8位以上(含8位);
2)密码需有一定的复杂度(有字母、数字的混合);
3)设置密码有效期;
可以通过【运维设置】>【常用功能】>【系统选项】>【用户管理】–>用户密码复杂度设置(正则表达式)以及密码有效周期(天)
正则表达式:^(?![^a-zA-Z]+$)(?!\D+$)[a-zA-Z0-9]{8,}$

PS:密码有效期周期(天):用于限制用户密码的有效时间,到使用期限前3天,消息中心中会提示用户联系管理员、修改密码。 

效果验证:
当用户设置密码的时候,就会校验密码复杂度。对于之前已设置密码的,需要单独进行修改,登录界面不会进行密码复杂度设置校验。

更多详情请查看:用户密码复杂度设置参考

【外网-必须加固】通过安全卫士设置内外网访问请求黑名单限制

如项目必须要开放外网访问smartbi系统的权限,为提升系统访问安全性,建议开启黑名单访问限制。对于功能权限以及接口权限进行外网限制调用,从而降低外网系统被攻击后所带来的系统风险。

1、 设置入口:http://ip:port/smartbi/vision/defender.jsp

2、进行黑名单限制,需要对外网流量入口进行识别,比如说可以通过代理将互联网流量转发到smartbi,这时候设置的就是代理的IP或者请求头标识。设置方式参考 wiki内外网隔离最小化

3、设置启用安全卫士。

默认放行请求勾选浏览类别,只允许浏览类的操作;

默认限制请求勾选【高危类别】,拦截执行计划任务、java 查询等高危动作的请求;请务必勾选此选项。


还可以根据实际需要,自定义添加白名单/黑名单请求;


更多详情请查看:内外网隔离最小化

(wiki 文档还没更新新功能的说明)

【建议加固】防止会话固定攻击/会话劫持

【内部】会话劫持漏洞-可使用该url进行jsessionid用户直接登录后台

修复会话固定漏洞扩展包SessionFixationHandler【内部】

6.各组件安全推荐配置

中间件层面

以下以tomcat为例进行相关安全配置推荐说明。

【建议加固】数据加密传输

通过在tomcat或nginx开启https功能,注意涉及到的CA证书需要和CA厂商获取。

tomcat配置方式:Tomcat配置HTTPS访问

nginx配置方式:https://www.jianshu.com/p/602a70c1b04e

未启用cookie的secure属性

通过tomcat中进行配置启用或nginx代理启用

注:secure与https相关的,前提条件是开启了https

tomcat配置方式:

1、进入到Tomcat目录下的conf/web.xml文件中添加如下配置

<session-config>
		<cookie-config>
            <http-only>true</http-only>
            <secure>true</secure>
        </cookie-config>
    </session-config>

nginx配置方式:

1、进入到nginx目录下的conf/nginx.conf文件中的server location 添加如下配置

location / {
proxy_cookie_path ~^/(.+)$ "/$1; HttpOnly; secure; SameSite=none";

}


目标主机可能存在缓慢的HTTP拒绝服务攻击

通过配置中间件或nginx的连接超时时间

tomcat配置方式:

1、进入到Tomcat目录下的conf/server.xml文件中修改如下配置

将 connectionTimeout 值修改为 8000

connectionTimeout="8000"

nginx配置方式:

  1. 进入到nginx目录下的conf/nginx.conf文件中的server location 修改如下配置

http {

#指定每一个 TCP 链接最多能够保持多长时间

keepalive_timeout 60;

server {

#服务端向客户端传输数据的超时时间

send_timeout 60s;

#请求头分配一个缓冲区

client_body_buffer_size 16k;

#指定客户端与服务端建立连接后发送 request body 的超时时间

client_body_timeout 50s;

#客户端向服务端发送一个完整的 request header 的超时时间

client_header_timeout 10s;

location / {



}

}

}


http host头攻击漏洞

通过配置中间件或nginx的 serviceName 属性

tomcat配置方式:

1、进入tomcat的配置目录下(%tomcatHome%\conf)修改server.xml文件中的Host的name属性为指定ip或域名。

nginx配置方式:

  1. 进入到nginx目录下的conf/nginx.conf文件中的server server_name 指定ip或域名。

注意:下面的1、2配置只选其一即可,不用两个都配置

server_name 192.168.137.1 10.11.27.46;

# 1、 $http_Host 需要加端口,如果是80或433也可省略
if ($http_Host !~* ^192.168.137.1:80|10.11.27.46:443$){
return 403;
}

# 2、 $host不需要加端口

if ($host !~* ^192.168.137.1|10.11.27.46$){
return 403;
}

这里的ip要根据需要进行替换 192.168.137.1 10.11.27.46 、 192.168.137.1|10.11.27.46

SSL弱密码支持

通过配置中间件或代理来排除不安全的加密方式。

注:前提条件是tomcat或代理开启了https。

tomcat配置方式:

1、进入tomcat的配置目录下(%tomcatHome%\conf)修改server.xml文件中的Connector节点内容。

sslProtocols="TLSv1"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA"


完整示例

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocols="TLSv1"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA"
keystoreFile="conf/tomcat.keystore" keystorePass="123456"
truststoreFile="conf/tomcat.keystore" truststorePass="123456"/>

nginx配置方式:

1、进入到nginx目录下的conf/nginx.conf文件中的server 中加入以下配置。

前提是开启了https

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE;

Tomcat暴露异常堆栈信息

通过tomcat配置,隐藏版本号与相关堆栈信息。

配置方式:

1、进入tomcat的配置目录下(%tomcatHome%\conf) 在 server.xml文件中的Host节点添加如下配置。

<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

启用了没必要的 http 请求类型

通过配置中间件或代理来禁用相关http方法。

tomcat配置方式:

1、进入tomcat的配置目录下(%tomcatHome%\conf)修改web.xml文件中添加以下配置。

<security-constraint>
<web-resource-collection>
<web-resource-name>filter-http-method</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>OPTIONS</http-method>
<http-method>HEAD</http-method>
</web-resource-collection>
<auth-constraint></auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>

这里禁用了PUT、DELETE、OPTIONS、HEAD,如果还需要禁用其它的则新增一行

<http-method>其它</http-method> 即可

注:

如果配置了http强制转https的,则只需要下面配置即可(会包含上面启用没必要的http请求类型)

<login-config>

<!-- Authorization setting for SSL -->

<auth-method>CLIENT-CERT</auth-method>

<realm-name>Client Cert Users-only Area</realm-name>

</login-config>

<security-constraint>

<!-- Authorization setting for SSL -->

<web-resource-collection >

<web-resource-name >SSL</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

nginx配置方式:

1、进入到nginx目录下的conf/nginx.conf文件中的server 或 location 中加入以下配置。

if ($request_method ~ ^(PUT|DELETE|OPTIONS|HEAD)$) {
return 403;
}

【必须加固】防止IP地址伪造


下面两种方式只能二选一,不能同时配置!!!


第一种方式:通过配置nginx来防止。

配置方式:

1、进入到nginx目录下的conf/nginx.conf文件中的server location 中加入以下配置。

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;


注意

$proxy_add_x_forwarded_for会将和Nginx直接连接的客户端IP追加在请求原有X-Forwarded-For值的右边。所以依然可以伪造 IP。检查 nginx 是否有proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;这个配置项,如果有要删除。


第二种方式:系统选项高级设置配置

如果无法配置前置代理,可以通过运维设置>常用功能>系统选项>高级设置进行配置:

# 是否开启防止IP伪造,如果有前置代理的情况下不能开启
HAS_ENABLED_IP_PORGERY=true

【建议加固】删除tomcat/webapps目录下的多余应用

Tomcat自带很多应用,非项目需要情况下,建议可考虑移除相关文件夹,避免因这类多余应用造成安全问题。

7.其他组件

其他组件比如 mysql、redis、smartbimpp、跨库、proxy 的推荐配置。