百度openrasp基于docker环境安装及初步使用实践

需求环境

php 7.2
apache 2.4
docker 

官方资料

管理后台安装说明
openrasp文档
github仓库

php-rasp镜像构建

Dockerfile文件内容

FROM php:7.2-apache

RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's|security.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list

RUN apt-get update

RUN apt-get install -y wget && wget https://github.com/baidu/openrasp/releases/download/v1.0/rasp-php-linux.tar.bz2 \
&& tar -jxvf rasp-php-linux.tar.bz2 && cd rasp-php* \
&& cp -f php/linux-php5.6-x86_64/openrasp.so /usr/local/lib/php/extensions/no-debug-non-zts-20170718/openrasp.so \
&& cd ../ && rm -rf rasp-php* \
&& apt-get remove -y wget

RUN mkdir -p /opt/rasp && chmod 777 -R /opt/rasp
COPY config/php_openrasp.ini /usr/local/etc/php/conf.d/php_openrasp.ini
COPY openrasp  /opt/rasp/rasp

php_openrasp.ini文件内容

;OPENRASP BEGIN

extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/openrasp.so
openrasp.root_dir=/opt/rasp

;拦截攻击后,跳转到这个URL,并增加 request_id 参数
openrasp.block_url=https://rasp.baidu.com/blocked/

;拦截攻击后,将状态码设置为这个值
;openrasp.block_status_code=302

;数组回调函数黑名单,命中即拦截
openrasp.callable_blacklists=system,exec,passthru,proc_open,shell_exec,popen,pcntl_exec,assert

;当服务器不满足安全配置规范,是否禁止服务器启动
;openrasp.enforce_policy=Off

;hook 点黑名单,逗号分隔
;openrasp.hooks_ignore=

;对于以下URL,修改响应并注入HTML
;openrasp.inject_urlprefix=

;国际化配置
;openrasp.locale=

;每个进程/线程每秒钟最大日志条数
;openrasp.log_maxburst=1000

;当SQL查询结果行数大于或等于该值,则认为是慢查询
;openrasp.slowquery_min_rows=500

;报警是否开启 syslog
;openrasp.syslog_alarm_enable=Off

;用于 syslog 的 facility
;openrasp.syslog_facility=

;syslog 服务器地址
;openrasp.syslog_server_address=

;syslog connection timeout(毫秒)
;openrasp.syslog_connection_timeout=50

;syslog read timeout(毫秒)
;openrasp.syslog_read_timeout=10

;syslog重连时间间隔(秒)
;openrasp.syslog_connection_retry_interval=300

;对于单个请求,JS插件整体超时时间(毫秒)
;openrasp.timeout_ms=100

;插件获取堆栈的最大深度
;openrasp.plugin_maxstack=100

;报警日志记录的最大堆栈深度
;openrasp.log_maxstack=10

; 远程管理配置,不需要不用配置
;openrasp.backend_url=http://127.0.0.1:9400
;openrasp.app_id=cf78de842bcb1fd73cf928e0cbefeb56845d00d6
;openrasp.app_secret=iuR8uD81GP18KBd2TCeBSQsDojutHyVTYC5bGuhzBqk
;openrasp.remote_management_enable=1

;OPENRASP END

远程管理主机

登陆后台后使用添加主机功能,获取AppIDAppSecretBackendURL三项参数,并更改启用php_openrasp.ini文件中有关远程配置的选项

; 远程管理配置,不需要不用配置
;openrasp.backend_url=http://127.0.0.1:9400
;openrasp.app_id=cf78de842bcb1fd73cf928e0cbefeb56845d00d6
;openrasp.app_secret=iuR8uD81GP18KBd2TCeBSQsDojutHyVTYC5bGuhzBqk
;openrasp.remote_management_enable=1

重启php-rasp服务(参照后面步骤创建)即可在后台看见主机列表,若不能,请检查服务器是否能访问backend_url或有关设置是否正确。

构建命令

1
docker build -t php72-rasp:latest .

运行并检查扩展生效

启动容器方式

1
docker run -p 80:80 -v /var/www/html:/var/www/html php72-rasp:latest

创建php脚本

1
echo "<?php\rphpinfo();" > /var/www/html/info.php

检查扩展

访问http://127.0.0.1/info.php输出phpinfo信息检查是否成功加载openrasp

远程管理后台配置及使用

启用ElasticSearch服务

1
docker run -p 9200:9200 -p 9300:9300 -e discovery.type=single-node elasticsearch:6.5.4

若要启用外网访问活动节点,使用下面的命令,network.publish_host为外网ip,http.port为访问端口

1
docker run -p 9200:9200 -p 9300:9300 -e discovery.type=single-node -e network.publish_host=10.2.98.2 -e http.port=9200 elasticsearch:6.5.4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## service 模式
mkdir -p /data/elasticsearch
docker volume create --driver local \
--opt device=/data/elasticsearch \
--opt o=bind \
--opt type=none \
elasticsearch_data
docker network create --driver=overlay --attachable name=traefiknet
docker service create \
--name app-elasticsearch \
--network traefiknet \
--mount type=volume,source=elasticsearch_data,destination=/usr/share/elasticsearch/data \
--publish 9200:9200 --publish 9300:9300 \
--env "discovery.type=single-node" \
--replicas 1 \
elasticsearch:5.6.16

启用MongoDB服务

1
docker run -p 27017:27017 mongo:3.6-stretch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## service 模式
mkdir -p /data/mongo
docker volume create --driver local \
--opt device=/data/mongo \
--opt o=bind \
--opt type=none \
mongo_data
docker network create --driver=overlay --attachable name=traefiknet
docker service create \
--name app-mongo \
--network traefiknet \
--mount type=volume,source=mongo_data,destination=/data/db \
--publish 27017:27017 \
--replicas 1 \
mongo

启动rasp-cloud

普通模式

下载rasp-cloud.tar.gz,解压到服务器本地,编辑 conf/app.conf 文件,将 PanelServerURLAgentServerURL 里面的 127.0.0.1 替换为你的服务器IP或者域名

1
2
wget https://github.com/baidu/openrasp/releases/download/v1.0/rasp-cloud.tar.gz
tar zxvf rasp-cloud.tar.gz

#vi rasp-cloud/conf/app.conf
PanelServerURL = http://127.0.0.1:8086
AgentServerURL = http://127.0.0.1:8086

修正 ElasticSearch 和 MongoDB 两个服务器的地址。如果这两个服务器都安装在了本机,请跳过此步骤:

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

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

1
./rasp-cloud -d

启动成功后,可通过 http://127.0.0.1:8086 访问管理后台。其中,后台用户名固定为 openrasp,初始密码为 admin@123。如果不能访问,请检查防火墙设置,或者检查 logs/api/agent-cloud.log 下面的错误信息。

docker模式

Dockerfile内容

FROM centos:7
RUN mkdir -p /rasp-cloud
ADD https://github.com/baidu/openrasp/releases/download/v1.0/rasp-cloud.tar.gz /tmp/
RUN tar xzvf /tmp/rasp-cloud.tar.gz -C /rasp-cloud && rm -rf /tmp/rasp-cloud.tar.gz
COPY app.conf /rasp-cloud/rasp-cloud-2019-04-17/conf/app.conf
WORKDIR /rasp-cloud/rasp-cloud-2019-04-17
EXPOSE 8086
ENTRYPOINT ["./rasp-cloud"]

app.conf内容

appname = rasp-cloud
httpport = 8086
runmode = prod
autorender = false
copyrequestbody = true
EnableDocs = true
MaxPlugins = 30
; alarm log handle method include: es, file
; file mode can collect the alarm with logstash
AlarmLogMode = es
AlarmBufferSize = 300
; AlarmCheckInterval unit second
AlarmCheckInterval = 120
; CookieLifeTime unit hour
CookieLifeTime = 168
MongoDBName = openrasp
MongoDBPoolLimit = 2048

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

构建命令

1
docker build -t rasp-cloud:v1.0 .

运行命令

1
docker run -name rasp-cloud -p 8086:8086 rasp-cloud:v1.0 .
1
2
3
4
5
6
7
#service
docker service create
--name="app-rasp"
--network traefiknet
--publish 8086:8086 \
--replicas 1
rasp-cloud:v1.0

结束