安装管理后台

快速开始

在开始之前,请先根据 软件下载 里的说明,下载 rasp-cloud.tar.gz,并解压缩到本地。

安装数据库

目前,我们使用了 ElasticSearchMongoDB 两种数据库。前者用来存储报警和统计信息,后者用来存储应用、账号密码等信息。

目前我们对数据库的要求是,

  • MongoDB 版本大于等于 3.6
  • ElasticSearch 版本大于等于 5.6,小于 7.0

具体如何安装数据库,这里不在赘述。

启动管理后台

首先,编辑 conf/app.conf 文件,修正 ElasticSearch 和 MongoDB 两个服务器的地址。如果这两个服务器都安装在了本机,且使用默认端口,请跳过此步骤:

[prod]
EsAddr = http://127.0.0.1:9200
EsUser =
EsPwd =
MongoDBAddr = 127.0.0.1:27017
MongoDBUser =
MongoDBPwd =

然后,在终端里执行如下命令,启动后台服务器:

./rasp-cloud -d

最后,在浏览器里打开 http://your-ip:8086,登录管理后台。其中用户名固定为 openrasp,初始密码为 admin@123。如果不能访问,请检查防火墙设置,或者检查 logs/api/agent-cloud.log 下面的错误信息。

登录成功后,请根据 管理后台 - 添加主机 文档,了解如何添加第一台主机。

高级配置

后台负载均衡

在实际场景中,我们需要部署多个服务器,才能处理来自数十万主机的连接。因此,我们将管理后台拆分为 Agent 接口服务器 (AgentServer)前端服务器 (PanelServer)。前者用于跟agent通信,比如心跳、日志上传,可以部署多个;后者用于展示数据、定时报警、修改配置,用户可访问这个后台来查看报警,只能部署一个

在百度,我们会启动一个前端服务器,

./rasp-cloud -type=panel -d

然后在不同的机房,分别启动一个 agent 服务器(使用同一份 conf/app.conf 配置文件即可

./rasp-cloud -type=agent -d

服务器部署完成后,请根据 管理后台 - 设置后台信息 文档,将所有的Agent服务器填入。之后就可以在 添加主机 界面上,生成自动安装命令了。

容量说明: 目前,在2核4GB的主机上,按照3分钟一个心跳计算,大概单台机器可容纳 1000个 客户端。

ElasticSearch 负载均衡

在使用ES集群时,EsAddr 填写一个服务器的地址即可。我们自动会调用 /_nodes/ 接口获取全部服务器信息并轮询,以避免单点问题。

配置项详细说明

Beego 相关

常用 beego 配置项如下,更多设置请参考 beego 官网 文档,

参数 说明 默认值
appname 应用名称
httpport http 监听端口 8086
runmode 运行模式,dev 为开发模式,prod 为线上模式 prod
OpenRASP 相关

OpenRASP 可用配置项目如下,

参数 说明 默认值
EsAddr Elasticsearch 服务器地址 http://127.0.0.1:9200
EsUser Elasticsearch 用户名 (X-Pack)
EsPwd Elasticsearch 密码 (X-Pack)
EsExpireTime Elasticsearch 数据过期时间,单位/天 366
MongoDBAddr MongoDB 连接地址 127.0.0.1:27017
MongoDBName 使用的 MongoDB 的数据库名称 openrasp
MongoPoolLimit MongoDB 连接池最大限制 2048
MongoDBUser MongoDB 认证用户名,该用户需要有操作 openrasp 数据库的权限,有认证才需要配置
MongoDBPwd MongoDB 认证密码
MaxPlugins 每个App最多保留多少插件,超过删除最老的 30
CookieLifeTime 登录 cookie 有效期,单位/小时 168
AlarmLogMode 报警日志采集模式,file 模式将日志落地到文件,可配合 logstash 上传到 es;es 模式将日志直接写入到 ES es
AlarmBufferSize es 模式下日志缓冲区大小,当日志量过大,缓冲区满的情况下,将会出现日志丢失 300
AlarmCheckInterval 报警检查间隔时间,单位秒 120

后台运维

升级后台

请登录到每一台部署了 rasp-cloud 的主机,并按照如下步骤进行升级:

  1. 备份原来的配置文件,conf/app.conf
  2. 下载新的安装包,解压缩到相同目录
  3. 检查是否需要更新配置文件
  4. 执行命令 ps aux | grep rasp-cloud 找到后台进程 PID
  5. 对上述进程发出 HUP 信号,e.g kill -HUP $PID
  6. 检查后台是否可以正常访问

找回密码

请登录到后台所在的主机,执行如下命令,根据提示重置密码。目前密码强度要求是 8-50 位,必须包含数字和字母。

./rasp-cloud -type=reset

查看后台版本

请登录到后台所在的主机,执行如下命令即可:

%> ./rasp-cloud -version
1.0.0 RC1

定期备份

在百度,我们以小时级别对 MongoDB 和 ElasticSearch 数据库进行备份。其中,MongoDB 需要备份 openrasp 数据库,可以使用 mongodump + mongorestore 实现;ElasticSearch 需要备份如下索引,可以用 snapshot 方式备份:

real-openrasp-report-data-{appid}
real-openrasp-attack-alarm-{appid}
real-openrasp-policy-alarm-{appid}
real-openrasp-error-alarm-{appid}

当然,如果公司有DBA团队,可以考虑托管给他们。

其他说明

Logstash 配置

当 AlarmLogMode 设置为 file 时,可使用 Logstash 采集文件日志。Logstash 样例配置如下,使用前请先修正日志路径

input{
    file{
        path=>[
            ## 1. 修改该处,将 $cloud-agent-home 替换为部署的 agent 模式后台的根目录
            "$cloud-agent-home/openrasp-logs/attack-alarm/attack.log"
        ]
        start_position => "beginning"
        type => "attack-alarm"
        codec => "json"
    }

    file{
        path=>[
            ## 2. 修改该处,将 $cloud-agent-home 替换为部署的 agent 模式后台的根目录
            "$cloud-agent-home/openrasp-logs/policy-alarm/policy.log"
        ]
        start_position => "beginning"
        type => "policy-alarm"
        codec => "json"
   }
}

output {

    if [type] == "attack-alarm" {
        elasticsearch {
            ## 3. 修改 ES 地址
            hosts  => "0.0.0.0:9200"
            index =>  'real-openrasp-%{type}-%{[app_id]}'
            timeout => 30
            document_type => '%{type}'
        }
    }

    if [type] == "policy-alarm"{
        elasticsearch {
            ## 4. 修改 ES 地址
            hosts  => "0.0.0.0:8200"
            index =>  'real-openrasp-%{type}-%{[app_id]}'
            timeout => 30
            document_type => '%{type}'
            action => 'update'
            document_id => '%{[upsert_id]}'
            doc_as_upsert => true
        }
    }

}

FAQ

1. 常见启动失败原因

日志会打印到 logs/api/agent-cloud.log 里。如果启动时没有增加 -d 参数,我们将同时在前台打印错误消息,e.g

2018/12/14 09:55:11.393 [I] [environment.go:62]  ===== start type: default =====
2018/12/14 09:55:11.408 [E] [mongo.go:54]  [30002] init mongodb failed: no reachable servers

目前定义的错误如下,

错误码 说明
30001 日志初始化失败,如文件权限问题
30002 MongoDB 初始化失败,如 MongoDB 地址无法连接
30003 ES 初始化失败,如 ES 地址无法连接
30004 配置错误 ,如未配置 Domain
30005 启动模式错误,启动使用了 agent, panel 之外的,不支持模式
30006 管理员密码初始化失败
30007 geoip 初始化失败,如 geoip 数据库文件权限问题
30008 后台管理员用户名密码重置失败
30009 创建默认 app 失败
30010 -d 参数启动后台失败

具体错误信息请查看 nohup 控制台输出

2. 管理后台打开后空白、按钮点不动等问题

我们目前只兼容 Google Chrome 浏览器。如果页面出现任何问题,请按下 F12 调出开发工具,并检查控制台是否有错误输出。如下图中的红色字样:

console

如果发现这种问题,请加入QQ群联系我们处理。

3. ElasticSearch "Result window is too large" 错误

如果你搜索的时间范围太大,ES 可能会爆出如下错误:

Result window is too large, from + size must be less than or equal to: [10000] but was [281280]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.

这是因为你搜索的时间范围很大,导致ES需要对大量的数据进行排序。解决方法是打开 config/elasticsearch.yml,修改或者增加 index.max_result_window 配置,将它调整为一个较大的值。当然,修改这个值会消耗更多的内存。

4. 我的主机名显示为 "im-not-resolvable"

在 Java 版本里,我们使用了 InetAddress 来获取主机名称,如果这个主机名在 /etc/hosts 下面没有对应的记录,Java 将抛出 Unknown host 异常。在这种情况下,我们会将主机名设置为 im-not-resolvable,并让程序继续运行。

解决方法是,在 /etc/hosts 下面为你的主机名添加一条记录:

127.0.0.1 myhostname

添加后,重启 Java 服务器生效。再次启动时,我们会注册一个新的agent到后台。

5. 管理后台打不开,Chrome 浏览器提示 ERR_CONNECTION_REFUSED

默认情况下,后台监听地址为 0.0.0.0:8086。如果你无法访问服务器,请检查防火墙是否开启对应端口。对于基于 netfilter 的防火墙,你可以执行如下命令开放 8086 端口:

iptables -I INPUT -p tcp --dport 8086 -j ACCEPT

6. 无法发送邮件报警,提示 5XX 错误

国内某些免费邮箱,不支持密码登录,需要申请授权码进行登录。如果你在使用下列邮箱,请参考他们的 FAQ 文档进行配置:

7. ElasticSearch X-Pack 使用说明

目前,后台使用的索引名称前缀为:

  • real-openrasp-X (alias)
  • openrasp-X

如果你在使用 X-Pack,且需要按照索引名称前缀进行授权,可以根据上述规则添加认证。若要查看当前 ES 的索引和别名列表,可访问如下URL:

http://elasticsearch_hostname:port/_cat/indices?v
http://elasticsearch_hostname:port/_cat/alias?v

8. 自己编译的后台,访问前端服务器 8086 端口提示 404 错误

前端文件在 dist 目录下,如果前端服务器返回 404 则说明这个目录不存在,或者 dist/index.html 不存在。

9. 误删ES索引,如何处理?

ES索引里只保存报警信息,误删索引不会导致agent信息丢失。若要完全重置ES,请先删除所有以 real-openrasp-openrasp- 开头的索引,并重新启动 rasp-cloud 即可。rasp-cloud 会在启动时检查并重新创建索引。