🛡️使用 eBPF 进行高级主机监控和威胁检测🛡️
eBPFShield是一款高性能安全工具,利用 eBPF 和 Python 提供实时IP 情报和DNS 监控。通过在内核空间中执行,eBPFShield 避免了代价高昂的上下文切换,并通过监控出站连接并与威胁情报源进行比较,有效检测和预防网络上的恶意行为。🔍
📝简介
欢迎使用 eBPFShield,这是一款功能强大且直观的安全工具,用于监控和保护您的服务器。eBPFShield具有IP 智能和DNS 监控功能,利用 ebpf 和 python 的强大功能提供实时监控和可操作的见解,以识别和减轻潜在威胁。
告别使用 tcpdump 持续监控服务器,转而使用 eBPFShield 提供更高效、自动化的安全解决方案。
可以用来windows、Linux 和 Ubuntu。
🛠特征
您可以使用 eBPFShield 执行以下操作:
目前的特点:🔥
DNS Monitoring
:显示系统中所有的 DNS 查询。IP-Intelligence
:监控出站连接(tcp/udp)并根据威胁情报列表进行检查,阻止恶意目标。包括用于拉取公共威胁源的脚本。
功能路线图:📅
- 使用机器学习算法进行自动化 IP 声誉分析
- 支持 IPv6 和非标准 DNS 端口,以改善覆盖范围和检测
- 与流行的SIEM系统集成以进行集中监控和警报
- JSON 输出,可轻松与UI仪表板集成
- 非标准端口DNS报文检测
📦 依赖关系
安装
apt install python3-bpfcc bpfcc-tools libbpfcc linux-headers-$(uname -r)
🚀 用法
该工具监视出站连接(仅限 tcp/udp、ipv4)并根据威胁情报列表进行检查。其中包含一个脚本,用于拉取两个公共源、活动 Tor 出口节点列表和 Talos 的 IP 黑名单。只需./update_feeds.sh
在该项目的根目录中运行,它就会填充该ip_feeds/
目录。您也可以将自定义列表添加到该目录。
update_feeds.sh
您可以在 cron 作业中运行该脚本,用于crontab
定期更新威胁情报源列表。这可确保该列表保持最新状态,并且 eBPFShield 能够检测和阻止最新的威胁。
运行python main.py
开始。开箱即用,它不会采取任何操作,它只会打印看到的违规行为。
$ python main.py -h
usage: main.py [-h] [--block {print, dump, suspend, kill}] [--feature {ebpf_ipintelligence, ebpf_monitor}] [--verbose]
optional arguments:
-h, --help show this help message and exit
--block {print, dump, suspend, kill}
--feature {ebpf_ipintelligence, ebpf_monitor}
--verbose
标志下支持两个选项--features
:
ebpf_ipintelligence
:使用 tcp/udp 和 ipv4 监控并阻止针对 IP 威胁情报列表的出站连接。ebpf_monitor
:显示系统中所有的DNS查询。
目前通过该标志支持四种操作--block
:
print
:默认操作,只需写入屏幕即可suspend
: 发送 aSIGSTOP
到进程。如果您需要将进程保持在可以与其交互的状态,这会很有用。kill
: 杀死进程。如果您只想立即停止潜在的恶意行为,这可能很有用。dump
:暂停该进程,对其进行核心转储以进行取证,然后将其终止。
如果您对调试感兴趣,该--verbose
标志可能对您有用。这告诉程序打印它看到的所有连接,而不仅仅是恶意连接。
样本输出
阻止恶意目的地🚫
- 在具有 root 权限的一个终端中:
$ sudo python main.py --action kill
- 在另一个终端中,作为任何用户,让我们使用curl 将 HTTP 请求发送到 Tor 出口节点,并将另一个请求发送到 google。
我们可以看到,我们只收到了三分之二的警报,并且前两个在连接完成之前被终止。最后的卷发就完成得很好。
root@host:~/eBPFShield# python3 main.py --feature ebpf_ipintelligence --block kill
The program is running. Press Ctrl-C to abort.
Client:b'curl' (pid:140278) was killed by eBPFShield (ip-blacklist:31.41.8.66)
Client:b'curl' (pid:140279) was killed by eBPFShield (ip-blacklist:103.43.12.106)
root@host:~# curl -v 31.41.8.66
* Trying 31.41.8.66:80...
* TCP_NODELAY set
Killed
root@host:~# curl -v 103.43.12.106
* Trying 103.43.12.106:80...
* TCP_NODELAY set
Killed
root@host:~# curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
监控 DNS 流量🔍
root@host:~# dig @1.1.1.1 google.com +tcp +short
172.217.160.206
root@host:~# dig @1.1.1.1 geekwire.com +tcp
104.26.14.176
172.67.69.185
104.26.15.176
root@host:~/eBPFShield# python3 main.py --feature ebpf_monitor
The program is running. Press Ctrl-C to abort.
COMM=dig PID=140623 TGID=140624 DEV=ens3 PROTO=TCP SRC=10.XX.20.37 DST=1.1.1.1 SPT=60687 DPT=53 UID=0 GID=0 DNS_QR=0 DNS_NAME=google.com. DNS_TYPE=A
COMM=dig PID=140623 TGID=140624 DEV=ens3 PROTO=TCP SRC=1.1.1.1 DST=10.XX.20.37 SPT=53 DPT=60687 UID=0 GID=0 DNS_QR=1 DNS_NAME=google.com. DNS_TYPE=A DNS_DATA=172.217.160.206
COMM=dig PID=140627 TGID=140628 DEV=ens3 PROTO=TCP SRC=10.XX.20.37 DST=1.1.1.1 SPT=42469 DPT=53 UID=0 GID=0 DNS_QR=0 DNS_NAME=geekwire.com. DNS_TYPE=A
COMM=dig PID=140627 TGID=140628 DEV=ens3 PROTO=TCP SRC=1.1.1.1 DST=10.XX.20.37 SPT=53 DPT=42469 UID=0 GID=0 DNS_QR=1 DNS_NAME=geekwire.com. DNS_TYPE=A DNS_DATA=104.26.14.176
COMM=dig PID=140627 TGID=140628 DEV=ens3 PROTO=TCP SRC=1.1.1.1 DST=10.XX.20.37 SPT=53 DPT=42469 UID=0 GID=0 DNS_QR=1 DNS_NAME=geekwire.com. DNS_TYPE=A DNS_DATA=172.67.69.185
COMM=dig PID=140627 TGID=140628 DEV=ens3 PROTO=TCP SRC=1.1.1.1 DST=10.XX.20.37 SPT=53 DPT=42469 UID=0 GID=0 DNS_QR=1 DNS_NAME=geekwire.com. DNS_TYPE=A DNS_DATA=104.26.15.176