雷池Safeline&HFish主动防御方案

雷池Safeline&HFish主动防御方案

雷池Safeline简介

雷池Safeline是一个基于智能语义分析引擎的下一代Web应用防火墙(WAF)。由长亭科技开发,雷池Safeline旨在通过其创新的智能语义分析算法,提供对Web应用攻击的深度检测和防护,特别是在面对未知威胁和0day攻击时,显示出天然的优势和防护能力。
雷池Safeline的核心优势在于其语义分析技术,这种技术能够理解Web应用上下文中的数据含义,而不仅仅是单纯的字符串匹配。这样的分析能力使得雷池Safeline在检测和阻止恶意流量和攻击行为时更加精准和高效。它能够对Web应用的通信进行深度解析,从而识别并阻断那些使用传统规则防护无法应对的复杂攻击。
除了智能语义分析外,雷池Safeline还具备以下特点:

  • 高度可扩展性:雷池Safeline设计灵活,能够适应不断变化的网络威胁环境,可以通过更新和迭代不断强化其防护能力。
  • 易用性:雷池Safeline提供简单易用的管理界面,使得配置和部署变得更加直观和简单。
  • 性能优化:雷池Safeline考虑到性能对Web应用的重要性,因此在设计上优化了处理速度和资源消耗,确保在提供强大防护的同时,不会对Web应用的性能造成负面影响。
  • 社区支持:雷池Safeline有一个活跃的社区,用户可以在这里获得技术支持、分享经验以及参与产品的未来发展。
    雷池Safeline在安全行业获得了一定的认可,其商业版本受到了众多头部企业的信赖,而社区版则通过GitHub平台免费提供,使得更广泛的用户能够零成本体验其智能语义分析算法的能力。雷池Safeline的发布,体现了长亭科技在网络安全领域的创新精神和对开放合作的承诺。

image-20240201150146817

安装雷池Safeline:

环境检测:

最低配置需求

  • 操作系统:Linux
  • 指令架构:x86_64
  • 软件依赖:Docker 20.10.14 版本以上
  • 软件依赖:Docker Compose 2.0.0 版本以上
  • 最小化环境:1 核 CPU / 1 GB 内存 / 5 GB 磁盘

可以逐行执行以下命令来确认服务器配置

1
2
3
4
5
6
7
8
uname -m                                    # 查看指令架构
docker version # 查看 Docker 版本
docker compose version # 查看 Docker Compose 版本
docker-compose version # 老版本查看Compose 版本
cat /proc/cpuinfo| grep "processor" # 查看 CPU 信息
free -h # 查看内存信息
df -h # 查看磁盘信息
lscpu | grep ssse3 # 确认CPU是否支持 ssse3 指令集

在线安装(推荐)

复制以下命令执行,即可完成安装

1
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)" 

如果需要使用华为云加速,可使用

1
CDN=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)" 

如果需要安装最新版本流式检测模式,可使用

1
STREAM=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)" 

离线安装

  • 如果服务器不可以访问互联网环境,推荐使用该方式
  1. 下载 雷池社区版镜像包 并传输到需要安装雷池的服务器上,执行以下命令加载镜像
1
cat image.tar.gz | gzip -d | docker load
  1. 执行以下命令创建并进入雷池安装目录
1
mkdir -p safeline  &&  cd safeline    # 创建 safeline 目录并且进入
  1. 下载 编排脚本 并传输到 safeline 目录中

  2. 复制执行以下命令,生成雷池运行所需的相关环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    cat >> .env <<EOF
    SAFELINE_DIR=$(pwd)
    IMAGE_TAG=latest
    MGT_PORT=9443
    POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)
    SUBNET_PREFIX=172.22.222
    IMAGE_PREFIX=chaitin
    EOF
    • 不要一行一行复制,一次性复制全部命令后执行
  3. 执行以下命令启动雷池

    1
    docker compose up -d

安装问题

在线安装失败

  1. 检查是否手动关闭防火墙
  2. 检测配置是否符合最低的配置要求

参考 环境检测方式

  1. 如果连接 Docker Hub 网络不稳,导致镜像下载失败(超时):

docker hub 默认使用国外节点拉取镜像,可以自行搜索配置国内镜像加速源

采用 离线安装 方式

安装时遇到报错处理方法:

* 报错:ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

需要安装 docker。尝试 curl -fLsS https://get.docker.com/ | sh 或者Docker初始化环境

* 报错:docker not found, unable to deploy

failed to create network safeline-ce safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重启下 dockerd 之后重试

需要启动 docker daemon 才能执行相关的命令。尝试 systemctl start docker

* 报错:docker compose v2 not found, unable to deploy

需要安装 docker compose v2。尝试 Docker初始化环境

* 报错: 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”信息。

端口冲突,根据报错信息中的端口号,排查是哪个服务占用了,手动处理冲突。

* 报错:safelint-mgt-api 出现 Operation not permitted

docker logs -f safelint-mgt-api 容器日志中看到 “runtime/cgo: pthread_create failed: Operation not permitted” 报错,这个错误一般会在 docker 20.10.9 及以下发生。

  • 最推荐的方式是升级 docker 到最新版本尝试解决这个问题。

  • 或您的系统支持配置 seccomp (执行 grep CONFIG_SECCOMP= /boot/config-$(uname -r) 输出 “ CONFIG_SECCOMP=y ” 则为支持), 则可以在雷池工作目录下载 seccomp 并且编辑 compose.yaml 文件, 在 management 下加入如下配置项,然后执行 docker compose down && docker compose up -d 来尝试解决这个问题:

    1
    2
    3
    security_opt:
    - seccomp=./seccomp.json

* 报错:safeline-pg 出现 Operation not permitted

docker logs -f safeline-pg 容器日志中看到 “Operation not permitted” 报错。

可能是您的 docker 版本过低,升级 docker 到最新版本尝试一下。

* 其他奇怪的报错比如:It does not belong to any of this network’s subnets…等等

查看如何卸载 ,卸载以后重新安装一次

* 如何自定义 SafeLine 安装路径?

基于最新的 “compose.yaml”,你可以手动修改 “.env” 文件的 变量。

* 雷池和业务服务可以部署到同一台机器中吗?

可以,但是不建议,机器负载将高于分开部署。

* MacOS/Windows 是否支持安装雷池

社区版暂不支持,如有需求咨询企业版。

* docker compose 还是 docker-compose?

属于两个版本,推荐使用 docker compose

* 如何修改 SafeLine 后台管理的默认端口?比如:本机 “:9443”已经被别的服务占用

使用 ss -antp|grep LISTEN 确认端口使用情况,找到未被占用端口

修改在安装目录(默认 safeline)下的隐藏文件.env 文件,你可以手动添加 MGT_PORT 变量到 .env 文件。

文件修改后,需要等重启才会生效。

在安装目录(默认 safeline)下执行 docker compose down && docker compose up -d

* 如何卸载

在安装目录(默认 safeline)下

根据本地的compose版本,执行 docker compose down 或者 docker-compose down

* 问题无法解决
  1. 通过右上角搜索检索其他页面
  2. 通过社群(官网首页加入微信讨论组)寻求帮助或者 Github issue 提交反馈,并附上排查的过程和截图

HFish简介

HFish是一款社区型免费蜜罐,侧重企业安全场景,从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发,为用户提供可独立操作且实用的功能,通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能力。

HFish支持基本网络 服务、OA系统、CRM系统、NAS存储系统、Web服务器、运维平台、安全产品、无线AP、交换机/路由器、邮件系统、IoT设备等90多种蜜罐服务、支持用户制作自定义Web蜜罐、支持流量牵引到免费云蜜网、支持可开关的全端口扫描感知能力、支持可自定义的蜜饵配置、一键部署、跨平台多架构,支持Linux x32/x64/ARM、Windows x32/x64平台和多种国产操作系统、支持龙芯、海光、飞腾、鲲鹏、腾云、兆芯等国产CPU、极低的性能要求、邮件/syslog/webhook/企业微信/钉钉/飞书告警等多项特性,帮助用户降低运维成本,提升运营效率。

image-20240201150100393

安装HFish

CentOS 是HFish团队主力开发和测试系统,推荐选用CentOS系统部署管理端

​ 如果部署的环境为Linux,且可以访问互联网,强烈建议使用一键部署脚本进行安装和配置,在使用一键脚本前,请先配置防火墙。

​ 蜜罐节点暴露在互联网,可能会出现TCP连接超过最大1024个连接数限制,导致其他连接被拒绝的情况,可手动放开机器TCP最大连接数。

  • 第一步,修改/etc/security/limits.conf文件,在文件中添加如下行(*指代系统用户名),修改Linux系统对用户的关于打开文件数的软限制和硬限制:

  • soft nofile 65535
    hard nofile 65535
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    - 第二步,修改/etc/pam.d/login文件,在文件中添加如下行:

        session required /lib/security/pam_limits.so

        如果是64bit系统的话,应该为 :
        session required /lib64/security/pam_limits.so

    - 第三步,修改/etc/sysctl.conf文件,在文件中(清楚文件原始内容)添加如下行(修改网络内核对TCP连接的有关限制):

    - ```
    net.ipv4.ip_local_port_range = 1024 65535

    net.core.rmem_max=16777216

    net.core.wmem_max=16777216

    net.ipv4.tcp_rmem=4096 87380 16777216

    net.ipv4.tcp_wmem=4096 65536 16777216

    net.ipv4.tcp_fin_timeout = 10

    net.ipv4.tcp_tw_recycle = 1

    net.ipv4.tcp_timestamps = 0

    net.ipv4.tcp_window_scaling = 0

    net.ipv4.tcp_sack = 0

    net.core.netdev_max_backlog = 30000

    net.ipv4.tcp_no_metrics_save=1

    net.core.somaxconn = 262144

    net.ipv4.tcp_syncookies = 0

    net.ipv4.tcp_max_orphans = 262144

    net.ipv4.tcp_max_syn_backlog = 262144

    net.ipv4.tcp_synack_retries = 2

    net.ipv4.tcp_syn_retries = 2
  • 第四步,执行如下命令(使上述设置生效):

  • /sbin/sysctl -p /etc/sysctl.conf
    
    /sbin/sysctl -w net.ipv4.route.flush=1
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    - 第五步,执行如下命令(linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的):

    - ```shell
    echo ulimit -HSn 65536 >> /etc/rc.local

     echo ulimit -HSn 65536 >>/root/.bash_profile

     ulimit -HSn 65536
  • 第六步,重启机器。通过修改,tcp可以达到20000个连接完全没有问题。

以root权限运行以下命令,确保配置防火墙开启TCP/4433、TCP/4434
1
2
3
firewall-cmd --add-port=4433/tcp --permanent   #(用于web界面启动)
firewall-cmd --add-port=4434/tcp --permanent #(用于节点与管理端通信)
firewall-cmd --reload

如之后蜜罐服务需要占用其他端口,可使用相同命令打开

以root权限运行以下一键部署命令
1
bash <(curl -sS -L https://hfish.net/webinstall.sh)
完成安装后,通过以下网址、账号密码登录
1
2
3
登陆链接:https://[ip]:4433/web/
账号:admin
密码:HFish2021复制失败成功

如果管理端的IP是192.168.1.1,则登陆链接为:https://192.168.1.1:4433/web/

  • URL中/web/路径不能少

数据库选择

除非性能极度紧张或环境所限,否则强烈建议使用MySQL/MariaDB数据库

经过实战测评,MySQL/MariaDB数据库可以适应目前绝大多数场景,其数据处理和并发兼容能力都要优于SQLite。

关于SQLite

出于开箱即用考虑,HFish系统默认使用的SQLite数据库,自带的已经初始化好的db具体路径为/usr/share/db/hfish.db

SQLite数据库仅适用于功能预览、小规模内网环境失陷感知等有限场景。

SQLite更换为MySQL/MariaDB数据库

HFish提供两种更换数据库的机会:

1、在首次安装时,用户可以选择使用SQLite或MySQL/MariaDB数据库

2、如果已经选择了SQLite,以管理员身份登录后,在「数据库配置」页面,根据指南可快速更换数据库

  • HFish只支持SQLite向MySQL/MariaDB数据库迁移,不支持反向迁移。

主动联网要求

安全声明

HFish使用100% Golang语言开发,本地采用低交互蜜罐,本地模拟的所有网络服务都是由HFish构架的虚假服务,攻击者看似可以登录进入MySQL、Redis等蜜罐服务,但实际上那是完全用Golang开发的MySQL、Redis部分能力,用于迷惑攻击者。用户完全不需要担心HFish模拟服务被击穿的风险。

HFish管理端主动访问如下网络域名

HFish支持IPv4和IPv6网络环境,可以在完全隔离互联网的内部网络工作,但为了最大限度感知真实威胁、对接云端高交互情报、对接消费云端威胁情报和自动化升级,强烈建议客户允许HFish管理端主动访问有限互联网地址,管理端永远不会主动访问节点,管理端仅负责生成一个配置,等待节点每60秒尝试连接管理端拉取。

为兼顾安全性和服务可用性,建议用户设置ACL仅允许HFish管理端主动访问如下网络域名、地址和端口:

开放IP 对应开放域名 协议/端口 访问目的
106.75.31.212、106.75.71.108 api.hfish.net(已经禁止ping) TCP/443 用于官网升级与攻击数据拉取,建议开启
106.75.5.50、106.75.15.34 zoo.hfish.net(已经禁止ping) TCP/22222(高交互ssh端口)、TCP/22223(高交互Telnet端口) 用于与云端高交互蜜罐通信,建议开启
43.227.197.203、43.227.197.42 hfish.cn-bj.ufileos.com TCP/443 用于分发安装和升级包
106.75.36.224、123.59.51.113、123.59.72.253、106.75.36.226 api.threatbook.cn TCP/443 用于威胁情报查询,如果未启用该功能,无需开放
(无法罗列,建议按域名开通) open.feishu.cn TCP/443 用于飞书告警功能,如果未使用该功能,无需开放
(无法罗列,建议按域名开通) oapi.dingtalk.com TCP/443 用于钉钉告警功能,如果未使用该功能,无需开放
(无法罗列,建议按域名开通) qyapi.weixin.qq.com TCP/443 用于企业微信告警功能,如果未使用该功能,无需开放
1
2
3
4
注意:
1. 基于安全考虑,不建议用户将HFish管理端Web管理端口TCP/4433暴露在互联网;
2. 如果使用邮件通知,请开启相应邮件服务器的访问权限;
3. HFish支持最多 5 路syslog日志发送,便于与安全设备联动,请根据实际情况开放权限;复制失败成功
HFish客户端主动访问如下网络域名

HFish客户端不会主动访问除管理端外任何地址。

安全配置

管理端安全要求

管理端应部署在安全区,只向少部分有网络管理权限和安全分析能力工作的人员和设备开放Web和SSH端口。

管理端用于配置管理的Web页面开启了HTTPS,默认访问端口为TCP/4433,虽然官方不推荐,但是用户可以在config.ini中自行修改Web管理端口和登录URL。

此外,管理端还会开放TCP/4434用于节点和管理端进行通讯,该端口不可改变,且必须保证该端口可被所有节点联通。

1
2
3
注意:
- TCP/4433端口和TCP/22端口 “只能”被安全区的管理设备访问;
- TCP/4434端口“必须能”被蜜罐节点访问;复制失败成功
节点端安全要求

蜜罐节点直接面对攻击者,建议遵循以下安全配置:

  1. 如果用户同时有外网和内部需求,强烈建议用户分别在外网和内网部署完全独立的两套管理端和节点端;
  2. 如果有节点需要能被外网访问,建议把节点和管理端部署在DMZ区;
  3. 外网节点除了能访问管理端的TCP/4434端口外,不能有权限访问内网中的任何资产;
  4. 内网节点除了开放蜜罐服务相应端口外,其它任何端口都不应该在网络中能被用户访问到;
  5. 考虑安全区设备有维护节点主机的需求,可以向有限的设备开放SSH端口;

忘记密码

如果用户不慎忘记HFish Web管理端admin密码,可以按照如下步骤强行重置。

  1. 进入HFish管理端安装目录,执行./tools -mode resetpwd
  2. kill hfish-server 等待几秒钟,进程会被自动拉起
  3. 使用默认账号密码:admin/HFish2021进行登录

卸载HFish

删除Linux管理端

删除计划任务进程
1
2
# 打开计划任务,删除带有hfish字样的行
root@HFish~# crontab -e复制失败成功
结束管理端进程
1
2
3
4
5
6
7
8
# 结束hfish和hfish-server的进程
root@HFish~# ps ax | grep ./hfish | grep -v grep
8435 ? Sl 97:59 ./hfish
8436 ? Sl 97:59 ./hfish-server


root@HFish:~# kill -9 8435
root@HFish:~# kill -9 8436复制失败成功
删除文件夹
1
2
# 使用install.sh安装的HFish会被部署到/opt/hfish目标,将整个删除即可
root@HFish~# rm -rf /opt/hfish复制失败成功
清理所有配置(如果后续还要安装,建议不要删除,否则下次使用需要完全重新配置)
1
2
# 使用install.sh安装的HFish会在/usr/share/hfish下建立全局变量
root@HFish~# rm -rf /usr/share/hfish复制失败成功
删除MySQL数据库配置(SQLite可忽略)
1
2
3
4
5
6
7
8
# 删除HFish数据库
root@HFish:~# mysql -h127.0.0.1 -uroot -p
Enter password:*******(默认密码详见config.ini配置文件)
mysql> DROP DATABASE hfish;

# 停止MySQL服务
root@HFish:~# systemctl stop mysqld
root@HFish:~# systemctl disable mysqld复制失败成功
还原SSH和Firewall配置
1
2
3
4
5
6
7
8
9
10
11
12
13
# 清除SSH config内对于访问来源的限制
root@HFish~# vi /etc/ssh/sshd_config
注释掉以 AllowUsers root@ 开头的行

# 重启SSH服务
root@HFish~# systemctl restart sshd

# 清除Firewall服务的规则(请根据实际情况删除!)
root@HFish~# firewall-cmd --permanent --list-all | grep ports | head -n 1 | \
cut -d: -f2 | tr ' ' '\n' | xargs -I {} firewall-cmd --permanent --remove-port={}

# 重启Firewall服务
root@HFish~# systemctl restart firewalld复制失败成功

卸载Linux节点

删除计划任务
1
2
# 打开计划任务,删除带有hfish字样的行
root@HFish~# crontab -e复制失败成功
结束client进程
1
2
3
4
root@HFish~# ps ax | grep ./client | grep -v grep
8435 ? Sl 97:59 ./client

root@HFish:~# kill -9 8435复制失败成功
删除client文件夹

文件夹路径为按照自己的安装路径,client端没有全局配置,删除安装文件夹即可

E-R模型:

er

​ 互联网环境部署,HFish管理端和雷池Safeline位于同一区域内相互隔离的VPC中,HFish节点端位于不同区域VPC。HFish用于配置web蜜罐以及收集互联网威胁情报,调用微步在线威胁分析与情报共享社区的IP信誉接口,将收集到的外网攻击数据存储在RDS云数据库中,数据库定时执行任务,抽取HFish数据库中的IP地址,清洗后存储到高危地址库,服务器定时执行推送任务,将IP地址表发布到托管平台,雷池Safeline自带IP组订阅功能,每天更新高危IP地址,实现web应用黑名单同步更新,主动拦截黑名单地址的web服务请求。

image-20240201143147891

  • IP地址表同步:

    将hfish库的ipaddress表中的ip、国家、威胁等级、标签、更新时间值同步到dataset库的threatips表中,ip地址唯一,威胁等级大于2(中威胁度及以上)。

1
2
3
4
5
6
7
8
9
INSERT INTO dataset.threatips (ip, country, threat_level, labels_cn, update_time)
SELECT ip, country, threat_level, labels_cn, update_time
FROM hfish.ipaddress
WHERE NOT EXISTS (
SELECT 1
FROM sync.threatips
WHERE threatips.ip = hfish.ipaddress.ip
)
AND hfish.ipaddress.threat_level > 2;
  • 值同步

    IP地址同步后,执行值同步任务,更新dataset表中更新时间、标签、威胁等级、国家的值。

1
2
3
4
5
6
UPDATE threatips
SET <update_time> = (
SELECT <update_time>
FROM hfish.ipaddress
WHERE threatips.ip = ipaddress.ip
);
  • 拉取IP地址

​ 编写shell脚本定时从数据库拉取IP地址,输出txt文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

# 编辑数据库信息
DB_USER="username"
DB_PASSWORD="password"
DB_NAME="dataset"
TABLE_NAME="threatips"
COLUMN_NAME="ip"
HOST="dbhost:3306"

# 目标文件夹
EXPORT_DIR="/opt/output"

# 检查目录是否存在
mkdir -p "$EXPORT_DIR"

# 输出文件名<数据表_ip_日期>.txt
OUTPUT_FILE="$EXPORT_DIR/${TABLE_NAME}_${COLUMN_NAME}_$(date +%Y-%m-%d).txt"

# 连接到MySQL数据库
mysql -h"$HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -e "SELECT \`$COLUMN_NAME\` FROM \`$TABLE_NAME\`" > "$OUTPUT_FILE"

sed -i '1d' $OUTPUT_FILE

echo "Column \`$COLUMN_NAME\` from table \`$TABLE_NAME\` has been exported to $OUTPUT_FILE"

cp "$OUTPUT_FILE" $EXPORT_DIR/threatips.txt
  • 定时推送

    根据部署情况选择Github、OSS、MinIO对象存储等途径上传threatips.txt文件,使用脚本定时推送更新即可。

防御效果:

image-20240201150403087

image-20240201150428430

image-20240201150331151