Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a66b82d878 | ||
|
|
d081ae11ea | ||
|
|
37960b6c70 | ||
|
|
f92b914551 | ||
|
|
e5ede1c94f | ||
|
|
75c9510aa5 | ||
|
|
3593b12c67 | ||
|
|
80e2616c19 | ||
|
|
b61a1bd169 | ||
|
|
d0165d5a1c | ||
|
|
3a549322af | ||
|
|
7d5328d7e6 | ||
|
|
9d4b987c93 | ||
|
|
ac15c5f015 | ||
|
|
7d0dcf828c | ||
|
|
fa642c12c9 | ||
|
|
a4a178bdfd | ||
|
|
43c40ec29f | ||
|
|
e967686adc | ||
|
|
58f65d6cca | ||
|
|
6941f74d2e |
59
CHANGELOG.md
@@ -1,5 +1,64 @@
|
||||
# SAFELINE-CE CHANGELOG
|
||||
|
||||
## [5.3.2] - 2024-04-12
|
||||
|
||||
### 修复
|
||||
* 修复了地理位置库识别错误的问题
|
||||
|
||||
### 优化
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
## [5.3.1] - 2024-04-11
|
||||
|
||||
### 新增
|
||||
* 专业版支持*钉钉告警*
|
||||
* 专业版新增高级数据统计
|
||||
|
||||
### 优化
|
||||
* 上线新版智能 AI 攻击分析,分析结果由长亭问津安全大模型提供,大幅度提升安全分析效果
|
||||
* 支持全种类的攻击分析,包含 注入、CSRF、SSRF、后门等
|
||||
* 标准化输出内容,例如 攻击影响、意图分析、防护建议等
|
||||
* 优化站点上游服务器的格式校验([#792](https://github.com/chaitin/SafeLine/issues/792) 中涉及问题)
|
||||
* 修复了其他一些已知问题
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
## [5.2.0] - 2024-03-28
|
||||
|
||||
### 新增
|
||||
|
||||
* 黑白名单、人机验证、身份认证中,规则匹配条件增加 “Method”(请求方法),方便对 POST、PUT、DELETE 等客户端操作进行限制
|
||||
* 攻击原始日志的防护模块为 “补充规则” 时,“命中规则” 处增加规则的 ID
|
||||
|
||||
### 优化
|
||||
|
||||
* 优化导航,调整功能位置,方便寻找:
|
||||
* 证书管理 移动到 防护站点->证书管理
|
||||
* IP 组 移动到 防护配置->通用配置->IP 组
|
||||
* 源 IP 获取方式、站点通用配置 移动到 防护站点->代理设置
|
||||
* 拦截页面附加说明、自定义拦截页面、IP 情报共享计划 移动到 防护配置->通用配置->拦截页面、IP 情报共享计划
|
||||
* 雷池控制台登录设置、雷池控制台证书、Syslog 设置、系统信息 移动到一级导航 系统设置
|
||||
* 密码登录框增加请求频率限制,提高暴力猜解的难度
|
||||
* 免费证书由过期前 10 天自动续期,改为过期前 30 天就自动续期
|
||||
* 修复站点数量较多时,站点管理处采集不到资源的问题
|
||||
* 修复移动端点击登录页的 “忘记密码” 无法弹出重置命令的问题
|
||||
* 修复 syslog 因请求内容较多被截断时,json 格式会被截得不合法的问题
|
||||
* 修复其他一些已知问题
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
## [5.1.0] - 2024-03-21
|
||||
|
||||
### 新增
|
||||
|
||||
- 专业版支持 syslog 转发攻击日志到外部服务器。
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复某些情况下站点资源批量删除失败的问题。
|
||||
- 修复身份认证中配置 ip 组规则时功能异常的问题。
|
||||
- 修复某些攻击日志不显示地址位置的问题。
|
||||
- 修复页面缓存导致显示错误的问题。
|
||||
- 修复其他一些已知问题。
|
||||
|
||||
## [5.0.0] - 2024-03-14
|
||||
|
||||
### 新增
|
||||
|
||||
@@ -6,11 +6,23 @@ title: "登录雷池"
|
||||
|
||||
> TOTP (Time-based One-Time Password algorithm) 将密钥与当前时间进行组合,通过哈希算法产生一次性密码,已被采纳为 RFC 6238,被用于许多双因素身份验证系统。
|
||||
|
||||
## 登录演示
|
||||
## 登录流程
|
||||
|
||||
浏览器打开后台管理页面 `https://<waf-ip>:9443`。
|
||||
1.浏览器打开后台管理页面 `https://<waf-ip>:9443`。
|
||||
|
||||
根据界面提示,使用 **支持 TOTP 的认证软件或者小程序** 扫描二维码,然后输入动态口令登录:
|
||||
2.输入初始的admin密码
|
||||
|
||||
完成安装后在shell会自动输出密码。
|
||||
|
||||

|
||||
|
||||
若忘记查看,需手动执行重置命令获得初始密码
|
||||
|
||||
`docker exec safeline-mgt resetadmin`
|
||||
|
||||

|
||||
|
||||
3.根据界面提示,使用 **支持 TOTP 的认证软件或者小程序** 扫描二维码,然后输入动态口令登录:
|
||||
|
||||
<iframe src="//player.bilibili.com/player.html?aid=748637002&bvid=BV1wC4y177zN&cid=1339420830&p=1&autoplay=0" scrolling="no" border="0" frameBorder="no" framespacing="0" allowFullScreen='{true}'
|
||||
style={{ width: '100%', height: '350px' }}
|
||||
|
||||
@@ -61,14 +61,20 @@ title: "测试防护"
|
||||
3. 使用以下请求开始测试
|
||||
|
||||
```
|
||||
./blazehttp -t http://<IP或域名>:<端口>
|
||||
./选择对应版本 -t http://<IP或域名>:<端口>
|
||||
|
||||
windows下
|
||||
./blazehttp_windows.exe -t http://<IP或域名>:<端口>
|
||||
|
||||
linux下
|
||||
./blazehttp_linux_x64 -t http://<IP或域名>:<端口>
|
||||
```
|
||||
|
||||
### 测试效果展示
|
||||
|
||||
```sh
|
||||
# 测试请求
|
||||
.//blazehttp -t http://127.0.0.1:8008
|
||||
# linux测试请求演示
|
||||
./blazehttp -t http://127.0.0.1:8008
|
||||
sending 100% |█████████████████████████████████████████████████████████| (33669/33669, 940 it/s) [35s:0s]
|
||||
总样本数量: 33669 成功: 33669 错误: 0
|
||||
检出率: 71.65% (恶意样本总数: 575 , 正确拦截: 412 , 漏报放行: 163)
|
||||
|
||||
@@ -6,53 +6,21 @@ title: "配置其他"
|
||||
|
||||
其他配置项介绍
|
||||
|
||||
### 黑白名单
|
||||
|
||||
黑名单:拦截
|
||||
|
||||
白名单:放通
|
||||
|
||||
注意:条件 AND 是指同时符合,如果希望多个匹配条件需要增加多条黑名单或者白名单
|
||||
|
||||

|
||||
|
||||
### 频率限制
|
||||
|
||||
通过开启频率限制功能封锁恶意 IP
|
||||
|
||||

|
||||
|
||||
### 人机验证
|
||||
|
||||
人机验证的有效时间默认是一个小时,未来可能会支持配置,敬请期待
|
||||
|
||||
详情查看 [人机验证 2.0](/about/challenge)
|
||||
|
||||
### 语义分析
|
||||
|
||||
详情查看 [语义分析检测算法](/about/syntaxanalysis)
|
||||
|
||||
## 通用配置
|
||||
|
||||
### IP 组配置
|
||||
|
||||
1.支持自定义 IP 组
|
||||
|
||||
2.长亭社区恶意 IP 情报,需要加入 IP 情报共享计划才可以使用
|
||||
## 防护站点
|
||||
|
||||
### 证书管理
|
||||
|
||||
管理需要使用的证书,点击添加证书添加
|
||||
|
||||
### 其他
|
||||
### 代理配置
|
||||
|
||||
#### 源 ip 获取方式
|
||||
|
||||
1.使用默认的方式获取源 IP
|
||||
|
||||
2.自定义获取源 IP 的 header
|
||||
2.自定义获取源 IP 的 header
|
||||
|
||||
#### 站点通用配置
|
||||
#### 其他代理配置
|
||||
|
||||
1.如果配置站点需要 http 自动转为 https 功能时,需要手动开启
|
||||
|
||||
@@ -64,17 +32,177 @@ title: "配置其他"
|
||||
|
||||
注:开启后并不会遵循源请求的信息,雷池会覆盖,为防止客户端伪造
|
||||
|
||||
#### 拦截页面附加说明
|
||||
## 防护配置
|
||||
|
||||
自定义拦截页面的提示信息
|
||||
### 黑白名单
|
||||
|
||||
黑名单:拦截
|
||||
|
||||
白名单:放通,优先级大于黑名单
|
||||
|
||||
注意:条件 AND 是指同时符合,如果希望多个匹配条件需要增加多条黑名单或者白名单
|
||||
|
||||

|
||||
|
||||
### 频率限制
|
||||
|
||||
通过开启频率限制功能封锁恶意 IP
|
||||
|
||||
对已经限制的ip可以在限频日志页面点击解除限制进行放行
|
||||
|
||||

|
||||
|
||||
### 人机验证
|
||||
|
||||
人机验证的有效时间默认是一个小时,未来可能会支持配置,敬请期待。
|
||||
|
||||
详情查看 [人机验证 2.0](/about/challenge)
|
||||
|
||||
### 语义分析
|
||||
|
||||
详情查看 [语义分析检测算法](/about/syntaxanalysis)
|
||||
|
||||
### 补充规则(专业版)
|
||||
|
||||
补充规则能在语义分析的基础上,针对一些特殊的业务漏洞、框架漏洞的利用行为进行防护。
|
||||
|
||||
社区版默认进行平衡防护,专业版可进一步配置防护模式。
|
||||
|
||||

|
||||
|
||||
### 身份认证
|
||||
|
||||
可以通过添加认证规则,对雷池保护的站点额外增加身份认证功能。
|
||||
|
||||

|
||||
|
||||
如图,触发身份认证规则后需要使用账户密码登录后继续访问网站。
|
||||
|
||||

|
||||
|
||||
### 通用配置
|
||||
|
||||
#### IP 组
|
||||
|
||||
1.支持自定义 IP 组
|
||||
|
||||
2.长亭社区恶意 IP 情报,需要加入 IP 情报共享计划才可以使用
|
||||
|
||||
|
||||
#### 拦截页面
|
||||
|
||||
1.自定义拦截页面的提示信息
|
||||
|
||||
2.自定义拦截页面(专业版),可以修改替或换拦截页面
|
||||
|
||||
#### 攻击告警(专业版)
|
||||
|
||||
支持钉钉、飞书、企业微信
|
||||
|
||||
支持发送(攻击、频率限制)告警到钉钉
|
||||
|
||||
#### IP 情报共享计划
|
||||
|
||||
默认加入共享计划,加入后将共享攻击 IP 信息到社区,并可使用 IP 组 “长亭社区恶意 IP 情报”。
|
||||
|
||||
## 系统设置
|
||||
|
||||
#### 雷池控制台登录设置
|
||||
|
||||
用于配置登录雷池管理端的方式
|
||||
|
||||
低于5.0.0版本升级上来的,shell会显示初始密码,忘记可以手动重置
|
||||
|
||||
社区版支持单用户,**专业版**支持多用户管理
|
||||
|
||||
管理员固定为 admin,非管理员不能修改其他用户配置
|
||||
|
||||
#### 雷池控制台证书
|
||||
|
||||
存放默认证书,可以自定义证书
|
||||
|
||||
#### IP 情报共享计划
|
||||
#### Syslog 设置
|
||||
|
||||
默认加入共享计划,加入后将共享攻击 IP 信息到社区,并可使用 IP 组 “长亭社区恶意 IP 情报”
|
||||
让雷池发送syslog到设置的服务器,**当前只支持UDP协议**
|
||||
|
||||

|
||||
|
||||
保存信息后可以点击测试按钮测试,收到测试信息表示配置成功
|
||||
|
||||
雷池发现攻击事件后,会发送事件的syslog信息
|
||||
|
||||

|
||||
|
||||
```
|
||||
#syslog 内容详情
|
||||
{
|
||||
"scheme": "http", // 请求协议为 HTTP
|
||||
"src_ip": "12.123.123.123", // 源 IP 地址
|
||||
"src_port": 53008, // 源端口号
|
||||
"socket_ip": "10.2.71.103", // Socket IP 地址
|
||||
"upstream_addr": "10.2.34.20", // 上游地址
|
||||
"req_start_time": 1712819316749, // 请求开始时间
|
||||
"rsp_start_time": null, // 响应开始时间
|
||||
"req_end_time": 1712819316749, // 请求结束时间
|
||||
"rsp_end_time": null, // 响应结束时间
|
||||
"host": "safeline-ce.chaitin.net",// 主机名
|
||||
"method": "GET", // 请求方法为 GET
|
||||
"query_string": "", // 查询字符串
|
||||
"event_id": "32be0ce3ba6c44be9ed7e1235f9eebab", // 事件 ID
|
||||
"session": "", // 会话
|
||||
"site_uuid": "35", // 站点 UUID
|
||||
"site_url": "http://safeline-ce.chaitin.net:8083", // 站点 URL
|
||||
"req_detector_name": "1276d0f467e4", // 请求检测器名称
|
||||
"req_detect_time": 286, // 请求检测时间
|
||||
"req_proxy_name": "16912fe30d8f", // 请求代理名称
|
||||
"req_rule_id": "m_rule/9bf31c7ff062936a96d3c8bd1f8f2ff3", // 请求规则 ID
|
||||
"req_location": "urlpath", // 请求位置为 URL 路径
|
||||
"req_payload": "", // 请求负载为空
|
||||
"req_decode_path": "", // 请求解码路径
|
||||
"req_rule_module": "m_rule", // 请求规则模块为 m_rule
|
||||
"req_http_body_is_truncate": 0, // 请求 HTTP 主体
|
||||
"rsp_http_body_is_truncate": 0, // 响应 HTTP 主体
|
||||
"req_skynet_rule_id_list": [ // 请求 Skynet 规则 ID 列表
|
||||
65595,
|
||||
65595
|
||||
],
|
||||
"http_body_is_abandoned": 0, // HTTP 主体
|
||||
"country": "US", // 国家
|
||||
"province": "", // 省份
|
||||
"city": "", // 城市
|
||||
"timestamp": 1712819316, // 时间戳
|
||||
"payload": "",
|
||||
"location": "urlpath", // 位置为 URL 路径
|
||||
"rule_id": "m_rule/9bf31c7ff062936a96d3c8bd1f8f2ff3", / 规则 ID
|
||||
"decode_path": "", // 解码路径
|
||||
"cookie": "sl-session=Z0WLa8mjGGZPki+QHX+HNQ==", // Cookie
|
||||
"user_agent": "PostmanRuntime/7.28.4", // 用户代理
|
||||
"referer": "", // 引用页
|
||||
"timestamp_human": "2024-04-11 15:08:36", // 时间戳
|
||||
"resp_reason_phrase": "", // 响应
|
||||
"module": "m_rule", // 模块为 m_rule
|
||||
"reason": "", // 原因
|
||||
"proxy_name": "16912fe30d8f", // 代理名称
|
||||
"node": "1276d0f467e4", // 节点
|
||||
"dest_port": 8083, // 目标端口号
|
||||
"dest_ip": "10.2.34.20", // 目标 IP 地址
|
||||
"urlpath": "/webshell.php", // URL 路径
|
||||
"protocol": "http", // 协议为 HTTP
|
||||
"attack_type": "backdoor", // 攻击类型
|
||||
"risk_level": "high", // 风险级别
|
||||
"action": "deny", // 动作
|
||||
"req_header_raw": "GET /webshell.php HTTP/1.1\r\nHost: safeline-ce.chaitin.net:8083\r\nUser-Agent: PostmanRuntime/7.28.4\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate, br\r\nCache-Control: no-cache\r\nCookie: sl-session=Z0WLa8mjGGZPki+QHX+HNQ==\r\nPostman-Token: 8e67bec1-6e79-458c-8ee5-0498f3f724db\r\nX-Real-Ip: 12.123.123.123\r\nSL-CE-SUID: 35\r\n\r\n", // 请求头原始内容
|
||||
"body": "", // 主体
|
||||
"req_block_reason": "web", // 请求阻止原因
|
||||
"req_attack_type": "backdoor", // 请求攻击类型
|
||||
"req_risk_level": "high", // 请求风险级别
|
||||
"req_action": "deny" // 动作
|
||||
}
|
||||
```
|
||||
|
||||
#### 系统信息
|
||||
|
||||
显示系统版本和设备机器码
|
||||
|
||||
## 常见配置问题
|
||||
|
||||
|
||||
@@ -26,9 +26,8 @@ title: "安装问题"
|
||||
|
||||
需要安装 docker。尝试 `curl -fLsS https://get.docker.com/ | sh` 或者 [Install Docker Engine](https://docs.docker.com/engine/install/)。
|
||||
|
||||
#### 报错:docker not found, unable to deploy
|
||||
#### 报错:failed to create network safeline-ce
|
||||
|
||||
failed to create network safeline-ce
|
||||
safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重启下 dockerd 之后重试
|
||||
|
||||
需要启动 docker daemon 才能执行相关的命令。尝试 `systemctl start docker`。
|
||||
@@ -37,10 +36,6 @@ safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重
|
||||
|
||||
需要安装 `docker compose v2`。尝试 `[Install Docker Compose](https://docs.docker.com/compose/install/)`。
|
||||
|
||||
#### 报错: `failed to create network safeline-ce`
|
||||
|
||||
safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重启下 dockerd 之后重试。
|
||||
|
||||
#### 报错: safeline-tengine 出现 Address already in use
|
||||
|
||||
`docker logs -f safeline-tengine` 容器日志中看到 `Address already in use` 信息。
|
||||
@@ -103,8 +98,11 @@ security_opt:
|
||||
|
||||
在安装目录(默认 safeline)下
|
||||
|
||||
根据本地的compose版本,执行 `docker compose down` 或者 `docker-compose down`
|
||||
1.根据本地的compose版本,执行 `docker compose down` 或者 `docker-compose down` 停止容器
|
||||
|
||||
2.手动删除镜像
|
||||
|
||||
3.动手删除目录
|
||||
|
||||
|
||||
## 问题无法解决
|
||||
|
||||
@@ -6,6 +6,16 @@ title: "登录问题"
|
||||
|
||||
记录常见的登录问题
|
||||
|
||||
## admin密码错误
|
||||
|
||||
### 使用命令重置
|
||||
|
||||
需手动执行重置命令获得初始密码
|
||||
|
||||
```
|
||||
docker exec safeline-mgt resetadmin
|
||||
```
|
||||
|
||||
## 动态口令错误
|
||||
|
||||
### 时间不一致
|
||||
@@ -30,7 +40,7 @@ TOTP 动态口令只有 30 秒的有效期,如果认证失败,请在动态
|
||||
命令执行完成后打开雷池页面重新绑定即可。
|
||||
|
||||
```
|
||||
docker exec safeline-mgt resetadmin
|
||||
docker exec safeline-mgt resettotp
|
||||
```
|
||||
|
||||
**注意:重置动态口令后要尽快完成绑定,别被其他人捷足先登了。**
|
||||
|
||||
@@ -81,10 +81,16 @@ title: "配置问题"
|
||||
|
||||
## 配置完成后,测试时返回 400 Request Header Or Cookie Too Large
|
||||
|
||||
请麻烦检查是否形成了环路,即:雷池将请求转发给上游服务器后,上游服务器又将请求转发回雷池。
|
||||
检查是否形成了环路,即:雷池将请求转发给上游服务器后,上游服务器又将请求转发回雷池。
|
||||
|
||||
重新修改配置后再次测试
|
||||
|
||||
## 不同版本关闭防火墙的命令
|
||||
|
||||
默认使用雷池不需要关闭防火墙,配置对应的开放规则即可
|
||||
|
||||
如果需要直接关闭防火墙可以参考
|
||||
|
||||
Ubuntu 18.04 LTS 、 Ubuntu 20.04 LTS 、 Ubuntu 22.04 LTS
|
||||
|
||||
Debian 9 (Stretch)、Debian 10 (Buster)、Debian 11 (Bullseye)
|
||||
|
||||
@@ -45,6 +45,22 @@ docker exec safeline-tengine nginx -s reload
|
||||
|
||||
**_注意:该操作会加快对硬盘的消耗,请定时清理访问日志_**
|
||||
|
||||
## 有信任的ip进入了社区黑名单怎么办
|
||||
|
||||
社区黑名单的进入条件是需要多个雷池设备上报恶意行为,自动移出条件是连续一段时间没有被上报
|
||||
|
||||
由于网络环境的复杂性,存在ip被利用或者规则误报导致进入社区黑名单的情况
|
||||
|
||||
出于安全考虑,雷池社区不会主动为任何人移出社区黑名单
|
||||
|
||||
误报如何处理
|
||||
|
||||
1.排查信任ip的情况,确认是否真的安全
|
||||
|
||||
2.对信任的ip针对性配置加白规则
|
||||
|
||||
3.等待信任ip自动被移出社区黑名单
|
||||
|
||||
## 问题无法解决
|
||||
|
||||
1. 通过右上角搜索检索其他页面
|
||||
|
||||
@@ -6,6 +6,18 @@ title: "升级问题"
|
||||
|
||||
记录常见的升级问题
|
||||
|
||||
## 默认账号密码
|
||||
|
||||
雷池社区版5.0.0以后的版本都有一个默认的账户密码
|
||||
|
||||
正常情况升级时shell会自动输出新密码
|
||||
|
||||
若非在线升级,需手动执行重置命令获得密码
|
||||
|
||||
重置密码命令:`docker exec safeline-mgt resetadmin`
|
||||
|
||||
初始密码是随机的,需要修改可以进入【通用配置-其他-雷池控制台登录设置】设置新的密码
|
||||
|
||||
## 升级提示目录不对
|
||||
|
||||
在错误的目录下执行(比如 safeline 的子目录)会导致无法升级成功。
|
||||
@@ -20,7 +32,6 @@ title: "升级问题"
|
||||
|
||||
恢复(还原):把备份的内容放回安装目录执行 `docker compose down && docker compose up -d`,重新启动雷池
|
||||
|
||||
|
||||
## 升级过程中下载超时
|
||||
|
||||
网络问题导致,建议等待网络稳定或者尝试离线升级。
|
||||
|
||||
@@ -143,7 +143,7 @@ docker run -d --restart=always --name safeline-fluentd --net safeline-ce -v ./sq
|
||||
|
||||
## 自定义站点 nginx conf
|
||||
|
||||
雷池每次修改站点或者重启服务时,都会在waf的安装目录下的**resources/nginx/sites-enabled/**重新生成 nginx conf 文件。因为没法“智能”合并用户自定义的配置和自动生成的配置。但是也还是有方式能持久化地添加一些 nginx conf,不会被覆盖。
|
||||
雷池每次修改站点或者重启服务时,都会在waf的安装目录下的 **resources/nginx/sites-enabled/** 重新生成 nginx conf 文件。因为没法“智能”合并用户自定义的配置和自动生成的配置。但是也还是有方式能持久化地添加一些 nginx conf,不会被覆盖。
|
||||
|
||||
每个 `IF_backend_XXX` 的 location 中都有 `include proxy_params;` 这一行配置,且 `resources/nginx/proxy_params` 这个文件不会被修改站点、重启服务等动作覆盖。2.1.0 版本之后支持 `include custom_params/backend_XXX;` 可以自定义站点级的 nginx location 配置。
|
||||
|
||||
|
||||
@@ -6,6 +6,66 @@ title: "版本更新记录"
|
||||
|
||||
[版本升级方法](/guide/upgrade)
|
||||
|
||||
### [5.3.2] - 2024-04-12
|
||||
|
||||
#### 修复
|
||||
* 修复了地理位置库识别错误的问题
|
||||
|
||||
#### 优化
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
### [5.3.1] - 2024-04-11
|
||||
|
||||
#### 新增
|
||||
* 专业版支持*钉钉告警*
|
||||
* 专业版新增高级数据统计
|
||||
|
||||
#### 优化
|
||||
* 上线新版智能 AI 攻击分析,分析结果由长亭问津安全大模型提供,大幅度提升安全分析效果
|
||||
* 支持全种类的攻击分析,包含 注入、CSRF、SSRF、后门等
|
||||
* 标准化输出内容,例如 攻击影响、意图分析、防护建议等
|
||||

|
||||
* 优化站点上游服务器的格式校验([#792](https://github.com/chaitin/SafeLine/issues/792) 中涉及问题)
|
||||
* 修复了其他一些已知问题
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
### [5.2.0] - 2024-03-28
|
||||
|
||||
#### 新增
|
||||
|
||||
* 黑白名单、人机验证、身份认证中,规则匹配条件增加 “Method”(请求方法),方便对 POST、PUT、DELETE 等客户端操作进行限制
|
||||
* 攻击原始日志的防护模块为 “补充规则” 时,“命中规则” 处增加规则的 ID
|
||||
|
||||
#### 优化
|
||||
|
||||
* 优化导航,调整功能位置,方便寻找:
|
||||
* 证书管理 移动到 防护站点->证书管理
|
||||
* IP 组 移动到 防护配置->通用配置->IP 组
|
||||
* 源 IP 获取方式、站点通用配置 移动到 防护站点->代理设置
|
||||
* 拦截页面附加说明、自定义拦截页面、IP 情报共享计划 移动到 防护配置->通用配置->拦截页面、IP 情报共享计划
|
||||
* 雷池控制台登录设置、雷池控制台证书、Syslog 设置、系统信息 移动到一级导航 系统设置
|
||||
* 密码登录框增加请求频率限制,提高暴力猜解的难度
|
||||
* 免费证书由过期前 10 天自动续期,改为过期前 30 天就自动续期
|
||||
* 修复站点数量较多时,站点管理处采集不到资源的问题
|
||||
* 修复移动端点击登录页的 “忘记密码” 无法弹出重置命令的问题
|
||||
* 修复 syslog 因请求内容较多被截断时,json 格式会被截得不合法的问题
|
||||
* 修复其他一些已知问题
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
### [5.1.0] - 2024-03-21
|
||||
|
||||
#### 新增
|
||||
|
||||
- 专业版支持 syslog 转发攻击日志到外部服务器。
|
||||
|
||||
#### 修复
|
||||
|
||||
- 修复某些情况下站点资源批量删除失败的问题。
|
||||
- 修复身份认证中配置 ip 组规则时功能异常的问题。
|
||||
- 修复某些攻击日志不显示地址位置的问题。
|
||||
- 修复页面缓存导致显示错误的问题。
|
||||
- 修复其他一些已知问题。
|
||||
|
||||
### [5.0.0] - 2024-03-14
|
||||
|
||||
#### 新增
|
||||
|
||||
@@ -4,7 +4,7 @@ title: "雷池技术架构"
|
||||
|
||||
# 雷池技术架构
|
||||
|
||||
查看雷池的服务架构图。最上面虚线框住的是数据流,也就是访问业务服务器的流量数据的流动情况。中间框起来的部分是雷池的各个服务。
|
||||
查看雷池的服务架构图(示意图较老,参考为主)。最上面虚线框住的是数据流,也就是访问业务服务器的流量数据的流动情况。中间框起来的部分是雷池的各个服务。
|
||||
|
||||

|
||||
|
||||
@@ -12,11 +12,14 @@ title: "雷池技术架构"
|
||||
|
||||
| 名称 | 定义 | 详情 |
|
||||
| ----------------- | ------------ | ------------------------------------------------------- |
|
||||
| safeline-mgt | 管理容器 | 接收管理后台行为,向其他服务或容器推送消息 |
|
||||
| safeline-mgt | 管理容器(管理端) | 接收管理后台行为,向其他服务或容器推送消息 |
|
||||
| safeline-detector | 检测容器 | 执行检测的容器,从 Tengine 进入的流量会转发到该节点检测 |
|
||||
| safeline-mario | 日志容器 | 记录与统计恶意行为的节点 |
|
||||
| safeline-tengine | 网关 | 转发网关,有简单的过滤功能 |
|
||||
| safeline-tengine | 网关 | 转发网关,有简单的过滤功能,基于nginx实现 |
|
||||
| safeline-pg | 关系型数据库 | 存储攻击日志、保护站点、黑白名单配置的数据库 |
|
||||
| safeline-luigi | 数据统计服务 | 统计qps等信息 |
|
||||
| safeline-fvm | 规则处理容器 | 将规则传递到检测容器 |
|
||||
| safeline-bridge | 支持云托管 | 通讯的桥接器 |
|
||||
|
||||
对于后台管理人员,可以直接通信的节点为管理服务 `safeline-mgt`,该节点负责:
|
||||
|
||||
|
||||
BIN
documents/static/images/docs/about_changelog/5.3.1-1.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
documents/static/images/docs/guide_config/login_1.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
documents/static/images/docs/guide_config/login_2.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
documents/static/images/docs/guide_config/other_config3.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
documents/static/images/docs/guide_config/other_config4.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
documents/static/images/docs/guide_config/other_config5.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
documents/static/images/docs/guide_config/other_config6.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
documents/static/images/docs/guide_config/other_config7.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
@@ -2001,10 +2001,10 @@
|
||||
prop-types "^15.8.1"
|
||||
react-is "^18.2.0"
|
||||
|
||||
"@node-rs/jieba-darwin-x64@1.7.2":
|
||||
"@node-rs/jieba-darwin-arm64@1.7.2":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.npmmirror.com/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.7.2.tgz"
|
||||
integrity sha512-euDawBU2FxB0CGTR803BA6WABsiicIrqa61z2AFFDPkJCDrauEM0jbMg3GDKLAvbaLbZ1Etu3QNN5xyroqp4Qw==
|
||||
resolved "https://registry.npmmirror.com/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.7.2.tgz"
|
||||
integrity sha512-M2cHIWRaaOmXGKy446SH2+Y2PzREaI2oYznPbg55wYEdioUp01YS/2WRG8CaoCKEj0aUocA7MFM2vVcoIAsbQw==
|
||||
|
||||
"@node-rs/jieba@^1.6.0":
|
||||
version "1.7.2"
|
||||
|
||||
@@ -201,3 +201,10 @@
|
||||
66.249.79.32/27
|
||||
66.249.79.64/27
|
||||
66.249.79.96/27
|
||||
|
||||
# river
|
||||
39.105.229.198
|
||||
101.37.81.162
|
||||
47.106.222.10
|
||||
8.137.22.18
|
||||
8.222.172.192
|
||||
@@ -24,7 +24,9 @@ services:
|
||||
networks:
|
||||
safeline-ce:
|
||||
ipv4_address: ${SUBNET_PREFIX}.2
|
||||
command: [postgres, -c, max_connections=200]
|
||||
command: [postgres, -c, max_connections=600]
|
||||
healthcheck:
|
||||
test: pg_isready -U safeline-ce -d safeline-ce
|
||||
mgt:
|
||||
container_name: safeline-mgt
|
||||
restart: always
|
||||
|
||||
@@ -250,6 +250,7 @@ fi
|
||||
|
||||
qrcode
|
||||
|
||||
check_container_health safeline-pg
|
||||
check_container_health safeline-mgt
|
||||
docker exec safeline-mgt /app/mgt-cli reset-admin --once
|
||||
|
||||
|
||||
@@ -268,12 +268,14 @@ $compose_command down --remove-orphans && $compose_command up -d
|
||||
if [ $? -ne "0" ]; then
|
||||
abort "替换 Docker 容器失败"
|
||||
fi
|
||||
info "雷池升级成功"
|
||||
|
||||
qrcode
|
||||
|
||||
check_container_health safeline-pg
|
||||
check_container_health safeline-mgt
|
||||
docker exec safeline-mgt /app/mgt-cli reset-admin --once
|
||||
|
||||
info "雷池升级成功"
|
||||
|
||||
warning "雷池 WAF 社区版安装成功, 请访问以下地址访问控制台"
|
||||
warning "https://0.0.0.0:9443/"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"latest_version": "v5.0.0",
|
||||
"rec_version": "v4.4.2"
|
||||
"latest_version": "v5.3.2",
|
||||
"rec_version": "v5.2.0"
|
||||
}
|
||||
BIN
website/public/images/bounty.png
Normal file
|
After Width: | Height: | Size: 745 KiB |
BIN
website/public/images/bounty_btn.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
@@ -1,10 +1,28 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { AppBar, Drawer, Grid, Toolbar, Typography, Button, Box, Container, Link, List, ListItem, ListItemText, Stack, IconButton } from '@mui/material';
|
||||
import Image from 'next/image';
|
||||
import dynamic from 'next/dynamic';
|
||||
import React, { useEffect, useState } from "react";
|
||||
import {
|
||||
AppBar,
|
||||
Drawer,
|
||||
Grid,
|
||||
Toolbar,
|
||||
Typography,
|
||||
Button,
|
||||
Box,
|
||||
Container,
|
||||
Link,
|
||||
List,
|
||||
ListItem,
|
||||
ListItemText,
|
||||
Stack,
|
||||
IconButton,
|
||||
} from "@mui/material";
|
||||
import Image from "next/image";
|
||||
import dynamic from "next/dynamic";
|
||||
import Icon from "@/components/Icon";
|
||||
import CloseIcon from '@mui/icons-material/Close';
|
||||
import usePopupState, { bindPopover, bindHover } from '@/components/Popover/usePopupState'
|
||||
import CloseIcon from "@mui/icons-material/Close";
|
||||
import usePopupState, {
|
||||
bindPopover,
|
||||
bindHover,
|
||||
} from "@/components/Popover/usePopupState";
|
||||
|
||||
const navs = [
|
||||
{ to: "/docs", label: "帮助文档", target: "_blank" },
|
||||
@@ -14,61 +32,142 @@ const navs = [
|
||||
|
||||
const menus = [
|
||||
...navs,
|
||||
{ to: "https://github.com/chaitin/SafeLine", label: "GitHub", target: "_blank" },
|
||||
{ to: "https://demo.waf-ce.chaitin.cn:9443/dashboard", label: "演示 Demo", target: "_blank" },
|
||||
{
|
||||
to: "https://github.com/chaitin/SafeLine",
|
||||
label: "GitHub",
|
||||
target: "_blank",
|
||||
},
|
||||
{
|
||||
to: "https://demo.waf-ce.chaitin.cn:9443/dashboard",
|
||||
label: "演示 Demo",
|
||||
target: "_blank",
|
||||
},
|
||||
];
|
||||
|
||||
const HoverPopover = dynamic(() => import('@/components/Popover/HoverPopover'), {
|
||||
ssr: false,
|
||||
});
|
||||
const HoverPopover = dynamic(
|
||||
() => import("@/components/Popover/HoverPopover"),
|
||||
{
|
||||
ssr: false,
|
||||
}
|
||||
);
|
||||
|
||||
export default function NavBar() {
|
||||
const [isSticky, setIsSticky] = useState(false);
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const popoverState = usePopupState({
|
||||
popupId: "wechat-qrcode-popover"
|
||||
})
|
||||
popupId: "wechat-qrcode-popover",
|
||||
});
|
||||
|
||||
const popoverState1 = usePopupState({
|
||||
popupId: "bounty-popover",
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const handleScroll = () => {
|
||||
const scrollTop = window.pageYOffset;
|
||||
setIsSticky(scrollTop > 0);
|
||||
};
|
||||
handleScroll()
|
||||
window.addEventListener('scroll', handleScroll);
|
||||
handleScroll();
|
||||
window.addEventListener("scroll", handleScroll);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('scroll', handleScroll);
|
||||
window.removeEventListener("scroll", handleScroll);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<AppBar position='fixed' color='transparent'
|
||||
<AppBar
|
||||
position="fixed"
|
||||
color="transparent"
|
||||
sx={{
|
||||
boxShadow: 'none',
|
||||
...(isSticky ? { backdropFilter: 'blur(8px)', background: 'rgba(255,255,255,0.8)' } : {}),
|
||||
alignItems: 'center'
|
||||
boxShadow: "none",
|
||||
...(isSticky
|
||||
? {
|
||||
backdropFilter: "blur(8px)",
|
||||
background: "rgba(255,255,255,0.8)",
|
||||
}
|
||||
: {}),
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<Container maxWidth="lg" sx={{ mx: 0 }}>
|
||||
<Toolbar sx={{ backgroundColor: 'transparent', py: 1, ml: 2, px: { sm: 0 } }}>
|
||||
<Toolbar
|
||||
sx={{ backgroundColor: "transparent", py: 1, ml: 2, px: { sm: 0 } }}
|
||||
>
|
||||
<Grid container justifyContent="space-around">
|
||||
<Grid item xs={10} md={6} display="flex">
|
||||
<Box display="flex" alignItems="center">
|
||||
<SafelineTitle />
|
||||
<Box display={{ xs: 'none', md: 'flex' }} alignItems="center">
|
||||
<Box display={{ xs: "none", md: "flex" }} alignItems="center">
|
||||
{navs.map((nav, index) => (
|
||||
<Box component="span" key={index} mr={3.5}>
|
||||
<Link key={index} href={nav.to} sx={{ color: "common.black" }} target={nav.target}>{nav.label}</Link>
|
||||
<Link
|
||||
key={index}
|
||||
href={nav.to}
|
||||
sx={{ color: "common.black" }}
|
||||
target={nav.target}
|
||||
>
|
||||
{nav.label}
|
||||
</Link>
|
||||
</Box>
|
||||
))}
|
||||
</Box>
|
||||
</Box>
|
||||
</Grid>
|
||||
<Grid item xs={2} md={6} display="flex" justifyContent="flex-end">
|
||||
<Box sx={{ fontSize: "16px", display: { xs: "none", md: "flex" }, alignItems: "center" }}>
|
||||
<Box
|
||||
sx={{
|
||||
fontSize: "16px",
|
||||
display: { xs: "none", md: "flex" },
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<Box mr={3.5}>
|
||||
<Typography
|
||||
{...bindHover(popoverState1 as any)}
|
||||
variant="body1"
|
||||
sx={{
|
||||
color: popoverState1.isOpen
|
||||
? "primary.main"
|
||||
: "common.black",
|
||||
cursor: "pointer",
|
||||
"&:hover": {
|
||||
color: "primary.main",
|
||||
backgroundColor: "transparent",
|
||||
},
|
||||
transition: "unset",
|
||||
}}
|
||||
>
|
||||
<Image
|
||||
src="/images/bounty_btn.png"
|
||||
alt="wechat"
|
||||
width={93}
|
||||
height={22}
|
||||
style={{ cursor: "pointer", marginTop: '3px' }}
|
||||
/>
|
||||
</Typography>
|
||||
<HoverPopover
|
||||
{...bindPopover(popoverState1)}
|
||||
anchorOrigin={{
|
||||
vertical: 42,
|
||||
horizontal: "left",
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: "top",
|
||||
horizontal: "left",
|
||||
}}
|
||||
marginThreshold={16}
|
||||
>
|
||||
<Image
|
||||
src="/images/bounty.png"
|
||||
alt="wechat"
|
||||
width={672}
|
||||
height={491}
|
||||
/>
|
||||
</HoverPopover>
|
||||
</Box>
|
||||
<Link
|
||||
href="https://github.com/chaitin/SafeLine"
|
||||
target="_blank"
|
||||
@@ -87,15 +186,17 @@ export default function NavBar() {
|
||||
<Box mr={3.5}>
|
||||
<Typography
|
||||
{...bindHover(popoverState as any)}
|
||||
variant='body1'
|
||||
variant="body1"
|
||||
sx={{
|
||||
color: popoverState.isOpen ? 'primary.main' : 'common.black',
|
||||
color: popoverState.isOpen
|
||||
? "primary.main"
|
||||
: "common.black",
|
||||
cursor: "pointer",
|
||||
'&:hover': {
|
||||
"&:hover": {
|
||||
color: "primary.main",
|
||||
backgroundColor: "transparent",
|
||||
},
|
||||
transition: 'unset',
|
||||
transition: "unset",
|
||||
}}
|
||||
>
|
||||
微信讨论组
|
||||
@@ -104,11 +205,11 @@ export default function NavBar() {
|
||||
{...bindPopover(popoverState)}
|
||||
anchorOrigin={{
|
||||
vertical: 42,
|
||||
horizontal: 'left',
|
||||
horizontal: "left",
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'left',
|
||||
vertical: "top",
|
||||
horizontal: "left",
|
||||
}}
|
||||
marginThreshold={16}
|
||||
>
|
||||
@@ -120,7 +221,14 @@ export default function NavBar() {
|
||||
/>
|
||||
</HoverPopover>
|
||||
</Box>
|
||||
<Link href="https://demo.waf-ce.chaitin.cn:9443/dashboard" sx={{ color: "common.black" }} mr={3.5} target="_blank">演示 Demo</Link>
|
||||
<Link
|
||||
href="https://demo.waf-ce.chaitin.cn:9443/dashboard"
|
||||
sx={{ color: "common.black" }}
|
||||
mr={3.5}
|
||||
target="_blank"
|
||||
>
|
||||
演示 Demo
|
||||
</Link>
|
||||
<Button
|
||||
variant="contained"
|
||||
target="_blank"
|
||||
@@ -147,18 +255,25 @@ export default function NavBar() {
|
||||
</Container>
|
||||
</AppBar>
|
||||
<Drawer
|
||||
anchor='right'
|
||||
anchor="right"
|
||||
sx={{ width: "100%" }}
|
||||
variant="temporary"
|
||||
open={open}
|
||||
PaperProps={{
|
||||
style: {
|
||||
width: '100%',
|
||||
width: "100%",
|
||||
},
|
||||
}}
|
||||
onClose={() => setOpen(false)}
|
||||
>
|
||||
<Stack direction="row" justifyContent="space-between" pl={4} pr={0.5} py={1} sx={{ boxShadow: "rgba(0, 0, 0, 0.1) 0px 1px 2px 0px" }}>
|
||||
<Stack
|
||||
direction="row"
|
||||
justifyContent="space-between"
|
||||
pl={4}
|
||||
pr={0.5}
|
||||
py={1}
|
||||
sx={{ boxShadow: "rgba(0, 0, 0, 0.1) 0px 1px 2px 0px" }}
|
||||
>
|
||||
<Box>
|
||||
<SafelineTitle />
|
||||
</Box>
|
||||
@@ -191,8 +306,18 @@ export default function NavBar() {
|
||||
export const SafelineTitle: React.FC = () => {
|
||||
return (
|
||||
<Link href="/">
|
||||
<Grid container flexDirection="row" display="flex" spacing={2} sx={{ marginTop: '0px', minWidth: "192px" }}>
|
||||
<Box width={{ xs: "40px", md: "24px" }} height={{ xs: "43px", md: "26px" }} position="relative">
|
||||
<Grid
|
||||
container
|
||||
flexDirection="row"
|
||||
display="flex"
|
||||
spacing={2}
|
||||
sx={{ marginTop: "0px", minWidth: "192px" }}
|
||||
>
|
||||
<Box
|
||||
width={{ xs: "40px", md: "24px" }}
|
||||
height={{ xs: "43px", md: "26px" }}
|
||||
position="relative"
|
||||
>
|
||||
<Image
|
||||
src="/images/safeline.svg"
|
||||
alt="SafeLine Logo"
|
||||
@@ -207,8 +332,8 @@ export const SafelineTitle: React.FC = () => {
|
||||
ml: { xs: 2, md: 1 },
|
||||
mr: { xs: 0, md: 7 },
|
||||
fontSize: { xs: "24px", md: "16px" },
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
fontFamily: "AlimamaShuHeiTi-Bold",
|
||||
}}
|
||||
>
|
||||
|
||||