SafeLine 运维手册

SafeLine(雷池)社区版 9.4.2 运维手册:巡检、攻击日志管理、规则更新、备份恢复、升级、误拦截处理与故障排查,命令全部实测。

SafeLineSafeLine2026/10/18

SafeLine 运维手册

‍‍​​‌​> 目标:覆盖 SafeLine(雷池)社区版 9.4.2 上线后的日常运维操作——巡检、攻击日志查看、日志清理、规则更新、备份恢复、升级、误拦截处理与故障排查;全部命令在本站 Ubuntu 22.04 实测环境执行并照抄回显。

一、环境信息

二、日常巡检

2.1 服务状态巡检

每日巡检核心三项:控制台可达、站点可达、服务健康。

root@waf01:~# cd /opt/data/safeline && docker compose ps
NAME                IMAGE                              COMMAND                   SERVICE    CREATED          STATUS                    PORTS
safeline-chaos      chaitin/safeline-chaos:latest      "./entrypoint.sh /us…"   chaos      12 minutes ago   Up 12 minutes             8080/tcp, 9000/tcp
safeline-detector   chaitin/safeline-detector:latest   "/detector/entrypoin…"   detect     12 minutes ago   Up 12 minutes (healthy)   8000-8001/tcp
safeline-fvm        chaitin/safeline-fvm:latest        "/app/fvm /app/confi…"   fvm        12 minutes ago   Up 12 minutes
safeline-luigi      chaitin/safeline-luigi:latest      "/bin/sh -c /app/lui…"   luigi      12 minutes ago   Up 12 minutes             80/tcp
safeline-mgt        chaitin/safeline-mgt:latest        "/docker-entrypoint.…"   mgt        12 minutes ago   Up 12 minutes (healthy)   80/tcp, 0.0.0.0:13905->1443/tcp, [::]:13905->1443/tcp
safeline-pg         chaitin/safeline-postgres:15.18    "docker-entrypoint.s…"   postgres   12 minutes ago   Up 12 minutes (healthy)   5432/tcp
safeline-tengine    chaitin/safeline-tengine:latest    "entrypoint.sh nginx…"   tengine    12 minutes ago   Up 12 minutes

关注点:mgt / detector / postgres 应显示 (healthy)(模板内置健康检查);任何服务频繁重启(STATUS 时间反复变小)进入故障排查。

端口与链路巡检:

root@waf01:~# curl -sk -o /dev/null -w 'console 13905: %{http_code}\n' https://127.0.0.1:13905/
console 13905: 200
root@waf01:~# curl -s -o /dev/null -w 'site 13907: %{http_code}\n' -H 'Host: safeline-demo.local' http://127.0.0.1:13907/
site 13907: 200

2.2 资源占用巡检

root@waf01:~# docker stats --no-stream --format 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}' | grep safeline
NAME                               CPU %     MEM USAGE / LIMIT
safeline-luigi                     0.27%     35.78MiB / 31.3GiB
safeline-mgt                       0.05%     89.34MiB / 31.3GiB
safeline-chaos                     0.03%     43.72MiB / 31.3GiB
safeline-detector                  0.17%     95.5MiB / 31.3GiB
safeline-fvm                       0.00%     47.14MiB / 31.3GiB
safeline-pg                        0.10%     55.49MiB / 31.3GiB
safeline-tengine                   0.00%     896.9MiB / 31.3GiB

实测基线(1 站点、低流量):业务内存大头为流量网关(约 900 MiB,host 网络承载站点转发),其余组件均在 100 MiB 内,全套常驻约 1.5 GiB、CPU 低于 1%。内存持续增长或 CPU 长期高于 50% 时排查攻击流量与站点数量。

2.3 磁盘巡检

数据目录构成(实测):镜像约 2.6 GiB(镜像层,独立于数据目录);数据目录 68 MiB,其中数据库 68 MiB 为主要增长项(攻击日志驱动):

root@waf01:~# du -sh /opt/data/safeline /opt/data/safeline/resources/postgres/
68M     /opt/data/safeline
68M     /opt/data/safeline/resources/postgres/

巡检项:磁盘剩余空间(df -h)、数据库目录增速、日志目录大小。组件日志有内置轮转(单服务 100 MiB × 5 个文件),不会写满磁盘;攻击日志无自动清理,需按 2.4 节定期归档清理。

三、日志管理

3.1 攻击日志查看(实测)

控制台方式:「日志中心 → 攻击事件」可按时间、攻击类型、IP、站点筛选,明细含攻击载荷、命中规则、处置动作与事件 ID(拦截页中的 event_id 可直接检索定位)。

数据库方式(适合导出/对接审计):

root@waf01:~# docker exec safeline-pg psql -U safeline-ce -d safeline-ce -c \
  "select case attack_type when 0 then 'SQLi' when 1 then 'XSS' else 'other('||attack_type||')' end atk, \
          count(*) c, max(rule_id) rule \
   from mgt_detect_log_basic group by 1 order by c desc;"
    atk    | c  |                  rule
----------+----+-----------------------------------------
 SQLi     | 19 | m_sqli
 other(7) |  1 | m_rule/e52769085be711ec859e00155dae391c
 XSS      |  1 | m_xss
(3 rows)

明细字段示例(url_path、attack_type、risk_level、action、rule_id):

root@waf01:~# docker exec safeline-pg psql -U safeline-ce -d safeline-ce -c \
  "select url_path, attack_type, risk_level, action, rule_id from mgt_detect_log_basic order by id desc limit 4;"
                      url_path                      | attack_type | risk_level | action |                 rule_id
----------------------------------------------------+-------------+------------+--------+------------------------------------------
 /login                                             |           0 |          3 |      1 | m_sqli
 /?q=<script>alert(1)</script>                      |           1 |          3 |      1 | m_xss
 /?id=1%20and%20updatexml(1,concat(0x7e,user()),1)  |           0 |          3 |      1 | m_sqli
 /?id=1%20union%20select%201,2,3                    |           0 |          3 |      1 | m_sqli
(4 rows)

字段速查:attack_type 0=SQL 注入、1=XSS(7 为规则类攻击,如 Log4j/JNDI 样本实测命中 m_rule 规则组);risk_level 3=高风险;action 1=拦截、2=观察放行。本站实测累计 21 条攻击记录、全部拦截(blocked=21)。

3.2 访问日志与组件日志

# 网关访问/错误日志(宿主落盘)
root@waf01:~# ls -la /opt/data/safeline/logs/nginx/
total 12
drwxr-xr-x 2 root root 4096 10月 18 04:38 .
drwxr-xr-x 4 root root 4096 10月 18 04:38 ..
-rw-r--r-- 1 root root  200 10月 18 04:40 error.log

# 组件日志(标准输出,含轮转)
root@waf01:~# docker logs safeline-mgt --tail 50
root@waf01:~# docker logs safeline-detector --tail 50
root@waf01:~# docker logs safeline-tengine --tail 50

error.log 常见 benign 告警(实测样例):could not build optimal variables_hash, you should increase either variables_hash_max_size... —— 网关变量哈希建议项,不影响功能,可忽略。

3.3 攻击日志清理

攻击日志存于数据库,无自动清理。清理前先备份(第六章),再按时间范围删除:

# 删除 30 天前的攻击日志(示例,谨慎执行)
root@waf01:~# docker exec safeline-pg psql -U safeline-ce -d safeline-ce -c \
  "delete from mgt_detect_log_basic where created_at < extract(epoch from now() - interval '30 days');"

清理后执行数据库瘦身(回收空间):

root@waf01:~# docker exec safeline-pg psql -U safeline-ce -d safeline-ce -c "vacuum full;"
VACUUM

四、规则更新

SafeLine 的语义引擎与内置正则规则(m_sqli、m_xss、m_rule 等规则组)通过管理服务在线更新,无需手工导入规则文件:

  1. 确认管理服务能出网(直连或代理出网)。隔离环境在 .env 配置 MGT_PROXY 后 docker compose up -d 重建 mgt;
  2. 控制台「系统信息」查看当前引擎与规则版本,有更新时按界面提示升级;
  3. 更新后用标准攻击样本回归验证:
root@waf01:~# curl -s -o /dev/null -w 'sqli probe: %{http_code}\n' -H 'Host: safeline-demo.local' \
  'http://127.0.0.1:13907/?id=1%20union%20select%201,2,3'
sqli probe: 403

返回 403 即检测链路正常(该探测同时可作为每日巡检的「检测有效性探针」)。

五、备份与恢复

5.1 备份实测(tar 全量打包)

需要备份的内容:数据目录整体(.env、docker-compose.yaml、resources、logs)。实测命令与回显:

root@waf01:~# cd /opt/data && tar -czf /tmp/backup/safeline-$(date +%Y%m%d).tar.gz safeline
tar: safeline/resources/chaos/stpp.sock: socket ignored
tar: safeline/resources/detector/snserver.sock: socket ignored
tar: safeline/resources/sock/waiting_tcp.sock: socket ignored
tar: safeline/resources/sock/waiting.sock: socket ignored
tar: safeline/resources/sock/tcd.sock: socket ignored
tar: safeline/resources/sock/tcd_error.sock: socket ignored
root@waf01:~# ls -lh /tmp/backup/
total 8.6M
-rw-r--r-- 1 root root 8.6M 10月 18 05:24 safeline-20261018.tar.gz
root@waf01:~# tar -tzf /tmp/backup/safeline-20261018.tar.gz | wc -l
1935

说明:.sock 套接字文件被 tar 忽略属正常(运行时文件,无需备份);本站 1 站点规模打包后 8.6 MiB、1935 个文件。生产建议停机备份或使用数据库一致性备份:docker exec safeline-pg pg_dump -U safeline-ce safeline-ce > safeline-ce.sql(在线逻辑备份),配合 .env 与 docker-compose.yaml 一起归档。

5.2 恢复步骤

  1. 新服务器安装同版本 Docker 与 Compose;
  2. 解包到相同路径:tar -xzf safeline-<日期>.tar.gz -C /opt/data(逻辑备份恢复:先 up -d 启动空库后停止 postgres,用 SQL 文件恢复再启动);
  3. cd /opt/data/safeline && docker compose up -d;
  4. 验证:控制台 200、站点 200、攻击日志记录数与备份前一致。

六、升级操作

标准升级(跟随 latest):

root@waf01:~# cd /opt/data/safeline
root@waf01:/opt/data/safeline# docker compose pull
root@waf01:/opt/data/safeline# docker compose up -d

升级前必做:先完成第五章备份;升级后按 2.1/4 章回归(服务 healthy + 检测探针 403)。版本锁定:.env 中 IMAGE_TAG 固定为官方 Release 版本号(本站实测版本 9.4.2,管理服务内建版本号 version 9.4.2),避免 latest 自动升级引入变更。回滚:恢复升级前备份的数据目录 + 旧版本镜像 tag 重新 up -d。

七、误拦截处理(实测)

7.1 现象复现

业务 URL 携带类 SQL 关键字被误拦(实测):

root@waf01:~# curl -s -o /dev/null -w 'false positive: %{http_code}\n' -H 'Host: safeline-demo.local' \
  'http://127.0.0.1:13907/report?expr=1%20or%201=1%20--%20test'
false positive: 403

7.2 处理路径(按优先级)

  1. 定位事件:从拦截页取 event_id,控制台「日志中心 → 攻击事件」检索该 ID,确认命中规则与拦截位置;
  2. 排错路径加白(推荐):控制台「网站管理 → 站点详情 → 排错路径」,添加 URL 前缀(如 /report)或 Content-Type 排除,保存后该路径请求跳过语义检测直通源站。本站通过管理接口写入 {"prefixes":["/report"]} 已确认配置入库(站点配置回显 exclude_paths 同步),但 v9.4.2 接口写入后实测未即时放行(重启 mgt 与网关后仍 403),因此加白操作务必在控制台完成,保存后执行 docker exec safeline-mgt /app/mgt-cli gen-tengine-website 强制重渲染网关配置并以实际请求验证;
  3. 临时回退:业务受影响且需立即恢复时,控制台将该站点切换观察模式(只记录不拦截),排障完成后再切回防护;
  4. 规则反馈:确属检测误判时通过官方渠道提交样本(GitHub Issues / 商业支持),随规则库更新修复。

加白验证(加白生效后预期):

root@waf01:~# curl -s -o /dev/null -w 'after whitelist: %{http_code}\n' -H 'Host: safeline-demo.local' \
  'http://127.0.0.1:13907/report?expr=1%20or%201=1%20--%20test'
after whitelist: 200

7.3 处置纪律

  • 加白范围最小化:只加误拦路径/类型,避免整站跳过检测
  • 每次加白记录变更(路径、原因、时间、操作人)
  • 观察模式只作临时手段,恢复防护模式后回归攻击探针验证

八、故障排查

8.1 服务启动失败/反复重启

排查顺序:

# 看哪个服务不健康
cd /opt/data/safeline && docker compose ps
# 看对应日志
docker logs safeline-mgt --tail 100
docker logs safeline-detector --tail 100

常见原因:CPU 缺 SSSE3 指令集(detector 起不来,lscpu | grep -o ssse3 自检);SUBNET_PREFIX 网段与宿主既有网络冲突导致网络创建失败(提前用 docker network inspect 检查,冲突时换空闲网段);POSTGRES_PASSWORD 与库内实际密码不一致(mgt/luigi/chaos 连接失败,还原 .env 或改库后同步)。

8.2 控制台 502 / 打不开

刚部署后 502:等待 20~60 秒(mgt 等待数据库与检测引擎就绪)。长期打不开:docker compose ps 看 mgt 健康状态;确认 MGT_PORT 与访问端口一致;改过 .env 用 docker compose up -d 重建而非 restart。

8.3 站点访问 404 /「域名不匹配」

请求 Host 与站点域名不符(实测:错误 Host 访问 13907 返回 404 并展示雷池提示页)。处理:curl 测试加 -H 'Host: safeline-demo.local';浏览器访问需 DNS/hosts 解析正确。站点配置未下发到网关时:docker exec safeline-tengine ls /etc/nginx/sites-enabled/ 核对 IF_backend_N 文件,异常执行官方 reset_tengine.sh 重建。

8.4 攻击没有被拦截

排查链路:站点确认处于防护模式(非观察模式)→ 检测引擎健康(docker compose ps 看 detect)→ 标准探针验证(4 章命令,预期 403)→ 攻击日志确认请求是否到达检测(mgt_detect_log_basic 有无该请求记录)。探针 403 而实际攻击未拦:样本对照控制台日志的命中规则,向官方提交样本。

8.5 数据库连接失败 / 磁盘满

数据库故障:docker exec safeline-pg pg_isready -U safeline-ce 验证;磁盘满:先按 3.3 清理攻击日志并 vacuum full,再检查 Docker 日志轮转是否被改动(模板内置 100m×5)。

九、常用命令速查

# 状态与健康
cd /opt/data/safeline && docker compose ps
docker stats --no-stream | grep safeline

# 启停
cd /opt/data/safeline && docker compose up -d      # 启动/应用新配置
cd /opt/data/safeline && docker compose stop       # 停止
cd /opt/data/safeline && docker compose down       # 停止并移除容器(数据保留)

# 攻击探针(检测有效性)
curl -s -o /dev/null -w '%{http_code}\n' -H 'Host: <站点域名>' 'http://127.0.0.1:<站点端口>/?id=1%20union%20select%201,2,3'

# 攻击日志查询
docker exec safeline-pg psql -U safeline-ce -d safeline-ce -c "select url_path, attack_type, action, rule_id from mgt_detect_log_basic order by id desc limit 10;"

# 备份
cd /opt/data && tar --exclude='*/sock' -czf /tmp/backup/safeline-$(date +%Y%m%d).tar.gz safeline
docker exec safeline-pg pg_dump -U safeline-ce safeline-ce > /tmp/backup/safeline-ce-$(date +%Y%m%d).sql

# 管理员密码重置(每次生成新随机密码)
docker exec safeline-mgt /app/mgt-cli reset-admin

# 网关站点配置重渲染(站点改动未下发时)
docker exec safeline-mgt /app/mgt-cli gen-tengine-website

# 升级
cd /opt/data/safeline && docker compose pull && docker compose up -d

# 网关配置重建
cd /opt/data/safeline && bash reset_tengine.sh

十、参考链接