SentryPeer/SentryPeer
GitHub: SentryPeer/SentryPeer
SentryPeer 是一个 SIP 蜜罐工具,用于检测和防止 VoIP 服务器上的欺诈行为。
Stars: 211 | Forks: 24
## 保护您的 SIP 服务器免受恶意行为者侵害
[](https://masterminds.github.io/stability/active.html)
[](https://github.com/SentryPeer/SentryPeer/releases)
[](https://hub.docker.com/r/sentrypeer/sentrypeer)
[](https://scan.coverity.com/projects/sentrypeer-sentrypeer)
[](https://github.com/SentryPeer/SentryPeer/actions/workflows/main.yml)
[](https://github.com/SentryPeer/SentryPeer/actions/workflows/codeql-analysis.yml)
[](https://github.com/SentryPeer/SentryPeer/actions/workflows/clang-analyzer.yml)
[](https://bestpractices.coreinfrastructure.org/projects/5374)
[](https://github.com/SentryPeer/SentryPeer/actions/workflows/gitleaks.yml)
特别感谢 [Deutsche Telekom Security GmbH](https://github.com/telekom-security) 对我们的赞助!太友好了!
_为什么不给我们一个星标并在 [Twitter](https://twitter.com/sentrypeer) 上关注我们呢!_
## 目录
* [简介](#introduction)
* [概述](#overview)
* [功能](#construction-features)
* [演讲](#talks)
* [采用情况](#adoption)
* [设计](#design)
* [Docker](#docker)
* [环境变量](#environment-variables)
* [安装说明](#installation)
* [Homebrew (macOS 或 Linux)](#homebrew-macos-or-linux)
* [Alpine Linux](#alpine-linux)
* [Ubuntu 软件包](#ubuntu-package)
* [从源代码构建](#building-from-source)
* [运行 SentryPeer](#running-sentrypeer)
* [WebHook](#webhook)
* [RESTful API](#restful-api)
* [端点 /health-check](#endpoint-health-check)
* [端点 /ip-addresses](#endpoint-ip-addresses)
* [端点 /ip-addressss/{ip-address}](#endpoint-ip-addressip-address)
* [端点 /numbers](#endpoint-numbers)
* [端点 /numbers/{phone-number}](#endpoint-numbersphone-number)
* [Syslog 和 Fail2ban](#syslog-and-fail2ban)
* [JSON 日志格式](#json-log-format)
* [命令行选项](#command-line-options)
* [IPv6 多播地址](#ipv6-multicast-address)
* [许可证](#license)
* [参与贡献](#contributing)
* [项目网站](#project-website)
* [商标](#trademark)
* [问题、错误报告、功能请求](#questions-bug-reports-feature-requests)
* [特别感谢](#special-thanks)
* [赞助](#sponsorship)
### 简介
SentryPeer® 是一个欺诈检测工具。它允许恶意行为者尝试拨打电话,并保存他们来自的 IP 地址以及他们尝试拨打的号码。然后,这些详细信息可用于在服务提供商网络中触发通知,下次用户/客户尝试拨打已收集的号码时,您可以采取任何您认为合适的措施。
例如:
假设您在自己的场所运行 VoIP PBX。SentryPeer 在此场景中允许您在用户进行出站呼叫时查询电话号码列表(使用 RESTful API)。如果匹配成功,您将收到警报,提示您网络中的某个设备可能正在尝试拨打已知的探测电话号码,这些号码可能是:
1. 您自己运行的 SentryPeer 节点收集的号码
2. 其他 SentryPeer 节点通过点对点网络复制到您的节点的号码
这使您能够在产生昂贵话费或更糟的事情发生之前,从监控系统生成通知。
什么情况会导致这种场景?
1. 潜在的语音邮件欺诈。如果您允许呼入号码(您的 DID/DDI)接入您的语音邮件系统,然后提示输入 PIN,就可能发生这种情况。如果此 PIN 很弱,并且语音邮件系统允许您按 '*' 回拨留下语音邮件的主叫号码,那么攻击者已留下语音邮件,他们猜到您的 PIN 后回拨。CLI 是 SentryPeer 见过的已知号码。您可以对此发出警报。
2. 设备已被劫持和/或软电话或类似设备正在使用从电话 GUI 窃取的凭据尝试注册到您的系统,并拨打 SentryPeer 见过的号码。
3. 一个无辜的用户正在拨打 SentryPeer 之前见过的钓鱼号码或已知的昂贵号码等。
传统上,这些数据被发送到一个中心位置,因此您不拥有您收集的数据。这个项目是关于该数据的点对点共享。对我来说,关键点是数据所有者以及与服务提供商/网络提供商相关的各种数据源。我厌倦了那些保留数据并出售数据的服务。如果您收集了它,您应该有权选择保留它和/或选择通过点对点方法与其他 SentryPeer 社区成员共享它。
### 概述
#### SentryPeer 节点
这里我们使用 [Mermaid 时序图](https://mermaid.js.org/syntax/sequenceDiagram.html) 展示数据从 SentryPeer 节点到 SentryPeerHQ 的流程。
```
sequenceDiagram
actor A as Attacker
participant S as SentryPeer Node
participant DS as Data Store
participant W as WebHook
Endpoint Note over DS: sqlite/json log/syslog
(if enabled) Note over W: if enabled A->>S: SIP probe OPTIONS/REGISTER/etc S->>DS: Save event S->>W: Send event W->>S: 200 OK S->>A: 200 OK A->>S: INVITE sip:00046500729221@ ``` #### SentryPeer 节点到 SentryPeerHQ ``` sequenceDiagram actor A as Attacker participant S as SentryPeer Node participant DS as Data Store participant HQ as SentryPeerHQ Note over DS: sqlite/json log/syslog (if enabled) Note over HQ: OAuth2 creds required.
if using https://sentrypeer.com A->>S: SIP probe OPTIONS/REGISTER/etc S->>DS: Save event S->>HQ: Send event HQ->>S: 201 Created S->>A: 200 OK A->>S: INVITE sip:00046500729221@ ``` #### 使用 SentryPeer 节点和 SentryPeerHQ API ``` sequenceDiagram Actor U as User participant S as SentryPeer Node/HQ API Note over S: if enabled U->>S: GET /numbers S->>U: 200 OK Return all Phone numbers seen in database ``` #### 与您自己的系统集成 ``` sequenceDiagram participant D as Device participant P as PBX/ITSP/Carrier participant HQ as SentryPeer Node/HQ API participant N as NOC Note over P: Integration with
SentryPeer needed Note over N: Consumes alerts Note over HQ: OAuth2 creds required
if using SentryPeerHQ Note over P,HQ: API rate limiting if using SentryPeerHQ D->>P: SIP INVITE P->>HQ: Have you seen attackers call this number? HQ->>P: Yes, this has been seen on SentryPeer Nodes HQ->>N: WebHook/Email/Slack Note over HQ,N: Only if using SentryPeerHQ P->>D: I'm blocking this call. Sorry ``` ### :construction: 功能 - [x] 所有代码 [自由/开源软件](https://www.gnu.org/philosophy/floss-and-foss.en.html) - [x] 速度快 - [x] 用户_拥有_其数据 - [x] 用户可以提交自己的数据(如果他们愿意)(需要启用点对点模式 - `-p`) - [x] 用户**仅在**他们选择将其数据提交到共享池时才会获得其他用户的数据 - [x] 使用 [OpenDHT](https://github.com/savoirfairelinux/opendht/wiki/Running-a-node-in-your-program) 的嵌入式分布式哈希表(DHT)节点(`-p` 命令行选项) - [x] 使用 [OpenDHT](https://github.com/savoirfairelinux/opendht) 点对点**共享**收集的恶意行为者(默认关闭) - [x] 使用 [OpenDHT](https://github.com/savoirfairelinux/opendht) 点对点数据复制以**接收**收集的恶意行为者(默认关闭) - [x] 设置您自己的 DHT 引导节点(`-b` 命令行选项) - [x] 多线程 - [x] UDP 传输 - [x] TCP 传输 - [x] TLS 传输 - [x] [JSON 日志记录](#json-log-format)到文件 - [x] SIP 模式可被禁用。这允许您仅以 API 模式或 DHT 模式等运行 SentryPeer,即不作为蜜罐,而是作为 SentryPeer 社区中的一个节点或仅提供复制数据。 - [x] SIP 响应模式可被启用以收集数据 - 命令行/环境变量标志 - [x] **本地**数据副本用于**快速访问** - 命令行/环境变量数据库位置标志 - [x] **本地** API 用于**快速访问** - 命令行/环境变量标志 - [x] WebHook 用于将恶意行为者 JSON 发布到中心位置 - 命令行/环境变量标志 - [x] 通过 OAuth2 令牌与 [SentryPeerHQ](https://sentrypeer.com) 集成 - [x] 查询恶意行为者 IP 地址的 API - [ ] 查询恶意行为者 IPSET 的 API - [x] 查询特定恶意行为者 IP 地址的 API - [x] 查询恶意行为者尝试拨打的电话号码的 API - [x] 查询恶意行为者尝试拨打的特定电话号码的 API - [x] [Fail2Ban](https://www.fail2ban.org/wiki/index.php/Main_Page) 支持,通过 `syslog`,符合[功能请求](https://github.com/SentryPeer/SentryPeer/issues/6) - [x] 本地 [sqlite](https://www.sqlite.org/index.html) 数据库 - 功能/命令行标志 - [ ] 分析 - 选择加入 - [ ] 用于外部访问的 SDK/库 - 从 [CGRateS](https://github.com/cgrates/cgrates) 开始或我们自己的 nftables 防火墙 - [x] 小型二进制大小适用于物联网用途 - [x] 跨平台 - [x] 防火墙选项,可实时使用分布式数据 - [x] [Docker Hub 上提供最新构建版本的容器](https://hub.docker.com/r/sentrypeer/sentrypeer) - [ ] BGP 代理,用于对等连接以黑洞化收集的 IP 地址(类似于 [Team Cymru Bogon 路由器服务器项目](https://team-cymru.com/community-services/bogon-reference/bogon-reference-bgp/)) - [ ] SIP 代理,返回 404 或默认目标用于 SIP 重定向 ### 演讲 - ClueCon Weekly 2023 - https://www.youtube.com/watch?v=iuN_MtVfT6g - UKNOF49 2022 ([演示幻灯片](https://indico.uknof.org.uk/event/59/contributions/801/attachments/1033/1520/UKNOF-49-2022-SentryPeer.pdf)) - https://indico.uknof.org.uk/event/59/contributions/801/ - ClueCon Weekly 2022 - https://youtu.be/DFxGHJI_0Wg - CommCon 2021 - https://2021.commcon.xyz/talks/sentrypeer-a-distributed-peer-to-peer-list-of-bad-ip-addresses-and-phone-numbers-collected-via-a-sip-honeypot - TADSummit 2021 - https://blog.tadsummit.com/2021/11/17/sentrypeer/ - ### 采用情况 * [Kali Linux](https://pkg.kali.org/pkg/sentrypeer) * Deutsche Telekom [T-Pot - 一体化蜜罐平台](https://github.com/telekom-security/tpotce) [v22](https://github.com/telekom-security/tpotce/releases/tag/22.04.0) 及更高版本  [](https://join.slack.com/t/sentrypeer/shared_invite/zt-zxsmfdo7-iE0odNT2XyKLP9pt0lgbcw) [](https://twitter.com/SentryPeer) ### 设计 我开始这个项目是因为我想进行 [C 语言网络编程](https://github.com/codeplea/Hands-On-Network-Programming-with-C),因为我日常使用的所有项目都是用 C 编写的,如 [PostgreSQL](https://www.postgresql.org/)、[OpenLDAP](https://www.openldap.org/)、[FreeSWITCH](https://freeswitch.com/)、[OpenSIPS](https://opensips.org/)、[Asterisk](https://www.asterisk.org/) 等。参见 [第 414 集: Jens Gustedt 谈现代 C](https://www.se-radio.net/2020/06/episode-414-jens-gustedt-on-modern-c/) 了解为什么 [C](https://en.wikipedia.org/wiki/C_(programming_language)) 是一个不错的选择。有兴趣者请查看我在 [Software Engineering Radio](https://www.se-radio.net/) 的完整播客节目列表(https://www.se-radio.net/team/gavin-henry/) ### Docker 您可以使用 [Docker](https://www.docker.com/) 运行最新版本的 SentryPeer。最新版本可从 [Docker Hub](https://hub.docker.com/r/sentrypeer/sentrypeer/) 获取。 或者自行构建: ``` sudo docker build --no-cache -t sentrypeer . sudo docker run -d -p 5060:5060/tcp -p 5061:5061/tcp -p 5060:5060/udp -p 8082:8082 -p 4222:4222/udp sentrypeer:latest ``` 然后您可以在 `http://localhost:8082/ip-addresses` 和 `http://localhost:8082/health-check` 检查它是否正在运行。 #### 环境变量 ``` ENV SENTRYPEER_CONFIG_FILE=/my/location/sentrypeer.toml ENV SENTRYPEER_DB_FILE=/my/location/sentrypeer.db ENV SENTRYPEER_API=1 ENV SENTRYPEER_WEBHOOK=1 ENV SENTRYPEER_WEBHOOK_URL=https://my.webhook.url/events ENV SENTRYPEER_OAUTH2_CLIENT_ID=1234567890 ENV SENTRYPEER_OAUTH2_CLIENT_SECRET=1234567890 ENV SENTRYPEER_SIP_RESPONSIVE=1 ENV SENTRYPEER_SIP_DISABLE=1 ENV SENTRYPEER_SYSLOG=1 ENV SENTRYPEER_PEER_TO_PEER=1 ENV SENTRYPEER_BOOTSTRAP_NODE=mybootstrapnode.com ENV SENTRYPEER_JSON_LOG=1 ENV SENTRYPEER_JSON_LOG_FILE=/my/location/sentrypeer_json.log ENV SENTRYPEER_VERBOSE=1 ENV SENTRYPEER_DEBUG=1 ENV SENTRYPEER_CERT=/my/location/sentrypeer-crt.pem ENV SENTRYPEER_KEY=/my/location/sentrypeer-key.pem ENV SENTRYPEER_TLS_LISTEN_ADDRESS=0.0.0.0:5061 ``` 可以在 Dockerfile 或您的 `Dockerfile.env` 文件或 `docker run` 命令中设置这些。 将其中任何一个设置为 `0` 也会_启用_该功能。我们_不在乎_您将其设置为什么值,只要设置了就行。 #### 配置文件 您也可以使用配置文件来设置某些内容。主要是下面的 TLS 配置。默认位置是 `~/.config/sentrypeer/default-config.toml`,但可以通过 `SENTRYPEER_CONFIG_FILE` 环境变量或 `-g` 命令行选项更改。 #### TLS 配置 要使用您自己的证书,您可以设置相应的环境变量、命令行参数或使用配置文件。例如: ``` cat ~/.config/sentrypeer/default-config.toml cert = "tests/unit_tests/127.0.0.1.pem" key = "tests/unit_tests/127.0.0.1-key.pem" tls_listen_address = "0.0.0.0:5061" ``` 如果您不设置这些,将在 sentrypeer 运行的目录中自动生成一个用于 localhost 的证书,创建 `cert.pem` 和 `key.pem` 文件。 ### 安装说明 Debian 或 Fedora 软件包始终可从 SentryPeer 当前版本的发布页面获取: https://github.com/SentryPeer/SentryPeer/releases #### Homebrew (macOS 或 Linux): 我们有一个[该项目的 Homebrew Tap](https://github.com/SentryPeer/homebrew-sentrypeer)(直到我们更受欢迎): ``` brew tap sentrypeer/sentrypeer brew install sentrypeer ``` #### Alpine Linux: SentryPeer 位于 [Alpine Linux 的测试仓库](https://gitlab.alpinelinux.org/alpine/aports/-/tree/master/testing/sentrypeer)中,因此您可以使用以下命令安装它: ``` apk -U add --no-cache -X https://dl-cdn.alpinelinux.org/alpine/edge/testing sentrypeer ``` #### Ubuntu 软件包 您可以从[我们的 Ubuntu PPA](https://launchpad.net/~gavinhenry/+archive/ubuntu/sentrypeer) 安装 SentryPeer,该 PPA 目前适用于 Ubuntu 20 LTS (Focal Fossa): ``` sudo apt install software-properties-common sudo add-apt-repository ppa:gavinhenry/sentrypeer sudo apt-get update ``` 可以通过手动复制以下行并将其添加到您系统的软件源来添加此 PPA: ``` deb https://ppa.launchpadcontent.net/gavinhenry/sentrypeer/ubuntu focal main deb-src https://ppa.launchpadcontent.net/gavinhenry/sentrypeer/ubuntu focal main ``` 然后您可以安装 SentryPeer: ``` sudo apt-get install sentrypeer ``` #### 从源代码构建 从源代码安装有两种选择。CMake 或 autotools。目前推荐 autotools。发布版本是 autotools 构建的。 如果您是 Fedora 用户,可以通过 [Fedora copr](https://copr.fedorainfracloud.org/coprs/) 安装: [https://copr.fedorainfracloud.org/coprs/ghenry/SentryPeer/](https://copr.fedorainfracloud.org/coprs/ghenry/SentryPeer/) 如果您打算从此存储库构建,则需要安装以下内容: - `git`、`autoconf`、`automake` 和 `autoconf-archive` (Debian/Ubuntu) - `libtool`、`rustc` 和 `cargo` (Fedora) - `libosip2-dev` (Debian/Ubuntu) 或 `libosip2-devel` (Fedora) - `libsqlite3-dev` (Debian/Ubuntu) 或 `sqlite-devel` (Fedora) - `uuid-dev` (Debian/Ubuntu) 或 `libuuid-devel` (Fedora) - `libmicrohttpd-dev` (Debian/Ubuntu) 或 `libmicrohttpd-devel` (Fedora) - `libjansson-dev` (Debian/Ubuntu) 或 `jansson-devel` (Fedora) - `libpcre2-dev` (Debian/Ubuntu) 或 `pcre2-devel` (Fedora) - `libcurl-dev` (Debian/Ubuntu) 或 `libcurl-devel` (Fedora) - `libcmocka-dev` (Debian/Ubuntu) 或 `libcmocka-devel` (Fedora) - 用于单元测试 Debian/Ubuntu: ``` sudo apt-get install git build-essential clang autoconf-archive autoconf \ automake libtool cmake libosip2-dev libsqlite3-dev libcmocka-dev uuid-dev \ libcurl4-openssl-dev libpcre2-dev libjansson-dev libmicrohttpd-dev libclang-dev ``` Fedora: ``` sudo dnf install git clang pkg-config autoconf automake autoconf-archive \ libtool libosip2-devel libsqlite3-devel libcmocka-devel libuuid-devel \ libmicrohttpd-devel jansson-devel libcurl-devel pcre2-devel cmake \ clang-libs clang ``` macOS: ``` brew install git libtool autoconf automake autoconf-archive libosip cmocka \ libmicrohttpd jansson curl pcre2 pkg-config opendht ossp-uuid cmake ``` Rust: ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` 然后(强烈推荐运行 make check): ``` ./bootstrap.sh ./configure make make check make install ``` CMake: ``` cmake -S . -B build -DUNIT_TESTING=ON cmake --build build ctest --test-dir build cmake --install build ``` ### 运行 SentryPeer 构建完成后,您可以这样运行以在**调试模式**下启动、**响应** SIP 探测、启用 **RESTful API**、启用 WebHook 和启用 syslog 日志记录(如果需要 [systemd](https://www.freedesktop.org/wiki/Software/systemd/) 请使用[软件包](https://github.com/SentryPeer/SentryPeer/releases)): ``` ./sentrypeer -draps SentryPeer node id: e5ac3a88-3d52-4e84-b70c-b2ce83992d02 Starting sentrypeer... API mode enabled, starting http daemon... SIP mode enabled... Peer to Peer DHT mode enabled... Starting peer to peer DHT mode using OpenDHT-C lib version '2.4.0'... Configuring local address... Creating sockets... Binding sockets to local address... Listening for incoming UDP connections... SIP responsive mode enabled. Will reply to SIP probes... Listening for incoming TCP connections... Peer to peer DHT mode started. DHT InfoHash for key 'bad_actors' is: 14d30143330e2e0e922ed4028a60ff96a59800ad Bootstrapping the DHT Waiting 5 seconds for bootstrapping to bootstrap.sentrypeer.org... Listening for changes to the bad_actors DHT key ``` 当您收到探测请求时,您可以在终端中看到类似以下的内容: ``` Received (411 bytes): OPTIONS sip:100@XXX.XXX.XXX.XXX SIP/2.0 Via: SIP/2.0/UDP 91.223.3.152:5173;branch=z9hG4bK-515761064;rport Content-Length: 0 From: "sipvicious";tag=6434396633623535313363340131363131333837383137
Accept: application/sdp
User-Agent: friendly-scanner
To: "sipvicious"
Contact: sip:100@91.223.3.152:5173
CSeq: 1 OPTIONS
Call-ID: 679894155883566215079442
Max-Forwards: 70
read_packet_buf size is: 1024:
read_packet_buf length is: 468:
bytes_received size is: 411:
Bad Actor is:
Event Timestamp: 2021-11-23 20:13:36.427515810
Event UUID: fac3fa20-8c2c-445b-8661-50a70fa9e873
SIP Message: OPTIONS sip:100@XXX.XXX.XXX.XXX SIP/2.0
Via: SIP/2.0/UDP 91.223.3.152:5173;branch=z9hG4bK-515761064;rport
From: "sipvicious" ;tag=6434396633623535313363340131363131333837383137
To: "sipvicious"
Call-ID: 679894155883566215079442
CSeq: 1 OPTIONS
Contact:
Accept: application/sdp
User-agent: friendly-scanner
Max-forwards: 70
Content-Length: 0
Source IP: 193.107.216.27
Called Number: 100
SIP Method: OPTIONS
Transport Type: UDP
User Agent: friendly-scanner
Collected Method: responsive
Created by Node Id: fac3fa20-8c2c-445b-8661-50a70fa9e873
SentryPeer db file location is: sentrypeer.db
Destination IP address of UDP packet is: xx.xx.xx.xx
```
您可以使用 [sqlitebrowser](https://sqlitebrowser.org/) 或 sqlite3 命令行工具在名为 `sentrypeer.db` 的 sqlite3 数据库中查看数据。
这是使用 [sqlitebrowser](https://sqlitebrowser.org/) 打开数据库的屏幕截图(它很大,所以我只链接到图片):
[sqlitebrowser 探索 sentrypeer.db](./screenshots/SentryPeer-sqlitebrowser.png)
### WebHook
有一个 WebHook 可用于将 [JSON 日志格式](#json-log-format) 的有效负载发布到 [SentryPeerHQ](https://github.com/SentryPeer/SentryPeerHQ) 或您自己的 WebHook 端点。WebHook **默认**未启用。您可以通过 `-w` 配置 WebHook URL 或设置 `SENTRYPEER_WEBHOOK_URL` 环境变量。
如果使用 [SentryPeer SaaS](https://sentrypeer.com),您需要从控制面板获取您的客户端 ID 和客户端密钥,并设置 `SENTRYPEER_OAUTH2_CLIENT_ID` 和 `SENTRYPEER_OAUTH2_CLIENT_SECRET` 环境变量或使用 `-i` 和 `-c` 标志。
### RESTful API
RESTful API 对于当前用例是完整的。请点击 Watch 按钮,以便在有更多内容发布时收到通知 :-)
#### 端点 /health-check
查询 API 以查看它是否存活:
```
curl -v -H "Content-Type: application/json" http://localhost:8082/health-check
* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /health-check HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 24 Apr 2022 11:16:25 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.4.0
< Content-Length: 81
<
{
"status": "OK",
"message": "Hello from SentryPeer!",
"version": "1.0.0"
}
```
#### 端点 /ip-addresses
列出 SentryPeer 见过的所有 IP 地址:
```
curl -v -H "Content-Type: application/json" http://localhost:8082/ip-addresses
* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /ip-addresses HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 11:17:05 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.0.0
< Content-Length: 50175
<
{
"ip_addresses_total": 396,
"ip_addresses": [
{
"ip_address": "193.107.216.27",
"seen_last": "2022-01-11 13:30:48.703603359",
"seen_count": "1263"
},
{
"ip_address": "193.46.255.152"
"seen_last": "2022-01-11 13:28:27.348926406",
"seen_count": "3220"
}
...
]
}
```
#### 端点 /ip-addresses/{ip-address}
查询单个 IP 地址:
```
curl -v -H "Content-Type: application/json" http://localhost:8082/ip-addresses/8.8.8.8
* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /ip-addresses/8.8.8.8 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Mon, 24 Jan 2022 11:17:57 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.0.0
< Content-Length: 33
<
* Connection #0 to host localhost left intact
{
"message": "No bad actor found"
}
```
#### 端点 /numbers
列出 SentryPeer 见过的所有拨打号码:
```
curl -v -H "Content-Type: application/json" http://localhost:8082/numbers
* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /numbers HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/8.0.1
> Accept: */*
> Content-Type: application/json
< Date: Thu, 27 Jul 2023 11:10:35 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 4.0.0
< Content-Length: 31746258
{
"called_numbers_total": 244850,
"called_numbers": [
{
"called_number": "981046500729221",
"seen_last": "2023-07-27 12:06:59.388055505",
"seen_count": "451"
},
{
"called_number": "81046500729221",
"seen_last": "2023-07-27 12:05:19.206442003",
"seen_count": "453"
},
{
"called_number": "100",
"seen_last": "2023-07-27 11:59:57.679798597",
"seen_count": "17335"
},
....
```
#### 端点 /numbers/{phone-number}
查询恶意行为者尝试拨打的电话号码,可选择带 `+` 前缀:
```
curl -v -H "Content-Type: application/json" http://localhost:8082/numbers/8784946812410967
* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET /numbers/8784946812410967 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.79.1
> Accept: */*
> Content-Type: application/json
>
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 11:19:53 GMT
< Content-Type: application/json
< Access-Control-Allow-Origin: *
< X-Powered-By: SentryPeer
< X-SentryPeer-Version: 1.0.0
< Content-Length: 46
<
{
"phone_number_found": "8784946812410967"
}
```
### Syslog 和 Fail2ban
使用 `sentrypeer -s`,您可以解析 syslog 并使用 Fail2Ban 阻止恶意行为者的 IP 地址:
```
Nov 30 21:32:16 localhost.localdomain sentrypeer[303741]: Source IP: 144.21.55.36, Method: OPTIONS, Agent: sipsak 0.9.7
```
### JSON 日志格式
使用 `sentrypeer -j`,您可以生成一个包含恶意行为者 IP 地址和他们尝试拨打的电话号码以及其他元数据的 JSON 日志文件(使用 `-l` 设置自定义日志文件位置):
```
{
"app_name":"sentrypeer",
"app_version":"v1.4.0",
"event_timestamp":"2022-02-22 11:19:15.848934346",
"event_uuid":"4503cc92-26cb-4b3e-bb33-69a83fa09321",
"created_by_node_id":"4503cc92-26cb-4b3e-bb33-69a83fa09321",
"collected_method":"responsive",
"transport_type":"UDP",
"source_ip":"45.134.144.128",
"destination_ip":"XX.XX.XX.XX",
"called_number":"0046812118532",
"sip_method":"OPTIONS",
"sip_user_agent":"friendly-scanner",
"sip_message":"full SIP message"
}
```
### 命令行选项
```
./sentrypeer -h
Protect your SIP Servers from bad actors at https://sentrypeer.com
Usage: sentrypeer [OPTIONS]
Options:
-f Set 'sentrypeer.db' location or use SENTRYPEER_DB_FILE env
-j Enable json logging or use SENTRYPEER_JSON_LOG env
-p Enable Peer to Peer mode or use SENTRYPEER_PEER_TO_PEER env
-b Set Peer to Peer bootstrap node or use SENTRYPEER_BOOTSTRAP_NODE env
-i Set OAuth 2 client ID or use SENTRYPEER_OAUTH2_CLIENT_ID env to get a Bearer token for WebHook
-c Set OAuth 2 client secret or use SENTRYPEER_OAUTH2_CLIENT_SECRET env to get a Bearer token for WebHook
-a Enable RESTful API mode or use SENTRYPEER_API env
-w Set WebHook URL for bad actor json POSTs or use SENTRYPEER_WEBHOOK_URL env
-r Enable SIP responsive mode or use SENTRYPEER_SIP_RESPONSIVE env
-R Disable SIP mode completely or use SENTRYPEER_SIP_DISABLE env
-l Set JSON logfile (default './sentrypeer_json.log') location or use SENTRYPEER_JSON_LOG_FILE env
-N Disable Rust powered TCP, UDP and TLS or use SENTRYPEER_TLS_DISABLE env
-t Set TLS cert location (default './cert.pem') or use SENTRYPEER_CERT env
-k Set TLS key location (default './key.pem') or use SENTRYPEER_KEY env
-z Set TLS listen address (default '0.0.0.0:5061') or use SENTRYPEER_TLS_LISTEN_ADDRESS env
-g Set config file location or use SENTRYPEER_CONFIG_FILE env
-s Enable syslog logging or use SENTRYPEER_SYSLOG env
-v Enable verbose logging or use SENTRYPEER_VERBOSE env
-d Enable debug mode or use SENTRYPEER_DEBUG env
-h, --help Print help
-V, --version Print version
```
### IPv6 多播地址
该项目有一个 IANA IPv6 多播地址,用于在 SentryPeer 对等体之间发送消息。
```
Addresses: FF0X:0:0:0:0:0:0:172
Description: SentryPeer
Contact: Gavin Henry
Registration Date: 2022-01-26
```
请参见 http://www.iana.org/assignments/ipv6-multicast-addresses
分配的变量作用域地址——也可以简写为 "FF0X::172"——"X" 表示任何可能的作用域。
### 许可证
推荐阅读 - [如何为您自己的作品选择许可证](https://www.gnu.org/licenses/license-recommendations.en.html)
本作品采用 GPL 2.0 和 GPL 3.0 双重许可。
`SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only`
### 参与贡献
参见 [贡献指南](./CONTRIBUTING.md)
### 项目网站
https://sentrypeer.org
### 商标
[**SENTRYPEER** 是 Gavin Henry 的注册商标](https://trademarks.ipo.gov.uk/ipo-tmcase/page/Results/1/UK00003700947)
### 问题、错误报告、功能请求
新问题可以在此提出:
https://github.com/SentryPeer/SentryPeer/issues
提出一个问题来提问是可以的。
### 特别感谢
特别感谢:
- [Deutsche Telekom Security GmbH](https://github.com/telekom-security) 对我们的赞助!
- [Routr](https://github.com/fonoster/routr) 项目的 [psanders](https://github.com/psanders) 关于[修改此 README.md 文件的建议](https://mobile.twitter.com/pedrosanders_/status/1554572884714070019)。
- [Fly.io](https://fly.io) 为在其基础设施上托管 [SentryPeer HQ Web 应用程序](https://sentrypeer.com) 而向 SentryPeer 账户提供积分。
- [AppSignal](https://www.appsignal.com/) 在 [SentryPeer HQ Web 应用程序](https://sentrypeer.com) 中的应用程序性能监控赞助。
- [David Miller](http://davidmiller.io/) 为 SentryPeer [Web GUI 主题](./web-gui-theme) 和 [logo](./web-gui-theme/src/assets/logo.svg) 的设计。你真是太好了!
- [@garymiller](https://github.com/garyemiller) 根据 [通过 syslog 集成 Fail2ban #6](https://github.com/SentryPeer/SentryPeer/issues/6) 提出的 syslog 和 Fail2ban 功能请求。
- [@joejag](https://github.com/joejag) 为启动 [在不同云提供商上启动 SentryPeer 的 Terraform 配方 #12](https://github.com/SentryPeer/SentryPeer/issues/12) 所做的[拉取请求](https://github.com/SentryPeer/SentryPeer/pull/19)。
### 赞助
特别感谢 [Deutsche Telekom Security GmbH](https://github.com/telekom-security) 对我们的赞助!太友好了!
Endpoint Note over DS: sqlite/json log/syslog
(if enabled) Note over W: if enabled A->>S: SIP probe OPTIONS/REGISTER/etc S->>DS: Save event S->>W: Send event W->>S: 200 OK S->>A: 200 OK A->>S: INVITE sip:00046500729221@ ``` #### SentryPeer 节点到 SentryPeerHQ ``` sequenceDiagram actor A as Attacker participant S as SentryPeer Node participant DS as Data Store participant HQ as SentryPeerHQ Note over DS: sqlite/json log/syslog (if enabled) Note over HQ: OAuth2 creds required.
if using https://sentrypeer.com A->>S: SIP probe OPTIONS/REGISTER/etc S->>DS: Save event S->>HQ: Send event HQ->>S: 201 Created S->>A: 200 OK A->>S: INVITE sip:00046500729221@ ``` #### 使用 SentryPeer 节点和 SentryPeerHQ API ``` sequenceDiagram Actor U as User participant S as SentryPeer Node/HQ API Note over S: if enabled U->>S: GET /numbers S->>U: 200 OK Return all Phone numbers seen in database ``` #### 与您自己的系统集成 ``` sequenceDiagram participant D as Device participant P as PBX/ITSP/Carrier participant HQ as SentryPeer Node/HQ API participant N as NOC Note over P: Integration with
SentryPeer needed Note over N: Consumes alerts Note over HQ: OAuth2 creds required
if using SentryPeerHQ Note over P,HQ: API rate limiting if using SentryPeerHQ D->>P: SIP INVITE P->>HQ: Have you seen attackers call this number? HQ->>P: Yes, this has been seen on SentryPeer Nodes HQ->>N: WebHook/Email/Slack Note over HQ,N: Only if using SentryPeerHQ P->>D: I'm blocking this call. Sorry ``` ### :construction: 功能 - [x] 所有代码 [自由/开源软件](https://www.gnu.org/philosophy/floss-and-foss.en.html) - [x] 速度快 - [x] 用户_拥有_其数据 - [x] 用户可以提交自己的数据(如果他们愿意)(需要启用点对点模式 - `-p`) - [x] 用户**仅在**他们选择将其数据提交到共享池时才会获得其他用户的数据 - [x] 使用 [OpenDHT](https://github.com/savoirfairelinux/opendht/wiki/Running-a-node-in-your-program) 的嵌入式分布式哈希表(DHT)节点(`-p` 命令行选项) - [x] 使用 [OpenDHT](https://github.com/savoirfairelinux/opendht) 点对点**共享**收集的恶意行为者(默认关闭) - [x] 使用 [OpenDHT](https://github.com/savoirfairelinux/opendht) 点对点数据复制以**接收**收集的恶意行为者(默认关闭) - [x] 设置您自己的 DHT 引导节点(`-b` 命令行选项) - [x] 多线程 - [x] UDP 传输 - [x] TCP 传输 - [x] TLS 传输 - [x] [JSON 日志记录](#json-log-format)到文件 - [x] SIP 模式可被禁用。这允许您仅以 API 模式或 DHT 模式等运行 SentryPeer,即不作为蜜罐,而是作为 SentryPeer 社区中的一个节点或仅提供复制数据。 - [x] SIP 响应模式可被启用以收集数据 - 命令行/环境变量标志 - [x] **本地**数据副本用于**快速访问** - 命令行/环境变量数据库位置标志 - [x] **本地** API 用于**快速访问** - 命令行/环境变量标志 - [x] WebHook 用于将恶意行为者 JSON 发布到中心位置 - 命令行/环境变量标志 - [x] 通过 OAuth2 令牌与 [SentryPeerHQ](https://sentrypeer.com) 集成 - [x] 查询恶意行为者 IP 地址的 API - [ ] 查询恶意行为者 IPSET 的 API - [x] 查询特定恶意行为者 IP 地址的 API - [x] 查询恶意行为者尝试拨打的电话号码的 API - [x] 查询恶意行为者尝试拨打的特定电话号码的 API - [x] [Fail2Ban](https://www.fail2ban.org/wiki/index.php/Main_Page) 支持,通过 `syslog`,符合[功能请求](https://github.com/SentryPeer/SentryPeer/issues/6) - [x] 本地 [sqlite](https://www.sqlite.org/index.html) 数据库 - 功能/命令行标志 - [ ] 分析 - 选择加入 - [ ] 用于外部访问的 SDK/库 - 从 [CGRateS](https://github.com/cgrates/cgrates) 开始或我们自己的 nftables 防火墙 - [x] 小型二进制大小适用于物联网用途 - [x] 跨平台 - [x] 防火墙选项,可实时使用分布式数据 - [x] [Docker Hub 上提供最新构建版本的容器](https://hub.docker.com/r/sentrypeer/sentrypeer) - [ ] BGP 代理,用于对等连接以黑洞化收集的 IP 地址(类似于 [Team Cymru Bogon 路由器服务器项目](https://team-cymru.com/community-services/bogon-reference/bogon-reference-bgp/)) - [ ] SIP 代理,返回 404 或默认目标用于 SIP 重定向 ### 演讲 - ClueCon Weekly 2023 - https://www.youtube.com/watch?v=iuN_MtVfT6g - UKNOF49 2022 ([演示幻灯片](https://indico.uknof.org.uk/event/59/contributions/801/attachments/1033/1520/UKNOF-49-2022-SentryPeer.pdf)) - https://indico.uknof.org.uk/event/59/contributions/801/ - ClueCon Weekly 2022 - https://youtu.be/DFxGHJI_0Wg - CommCon 2021 - https://2021.commcon.xyz/talks/sentrypeer-a-distributed-peer-to-peer-list-of-bad-ip-addresses-and-phone-numbers-collected-via-a-sip-honeypot - TADSummit 2021 - https://blog.tadsummit.com/2021/11/17/sentrypeer/ - ### 采用情况 * [Kali Linux](https://pkg.kali.org/pkg/sentrypeer) * Deutsche Telekom [T-Pot - 一体化蜜罐平台](https://github.com/telekom-security/tpotce) [v22](https://github.com/telekom-security/tpotce/releases/tag/22.04.0) 及更高版本  [](https://join.slack.com/t/sentrypeer/shared_invite/zt-zxsmfdo7-iE0odNT2XyKLP9pt0lgbcw) [](https://twitter.com/SentryPeer) ### 设计 我开始这个项目是因为我想进行 [C 语言网络编程](https://github.com/codeplea/Hands-On-Network-Programming-with-C),因为我日常使用的所有项目都是用 C 编写的,如 [PostgreSQL](https://www.postgresql.org/)、[OpenLDAP](https://www.openldap.org/)、[FreeSWITCH](https://freeswitch.com/)、[OpenSIPS](https://opensips.org/)、[Asterisk](https://www.asterisk.org/) 等。参见 [第 414 集: Jens Gustedt 谈现代 C](https://www.se-radio.net/2020/06/episode-414-jens-gustedt-on-modern-c/) 了解为什么 [C](https://en.wikipedia.org/wiki/C_(programming_language)) 是一个不错的选择。有兴趣者请查看我在 [Software Engineering Radio](https://www.se-radio.net/) 的完整播客节目列表(https://www.se-radio.net/team/gavin-henry/) ### Docker 您可以使用 [Docker](https://www.docker.com/) 运行最新版本的 SentryPeer。最新版本可从 [Docker Hub](https://hub.docker.com/r/sentrypeer/sentrypeer/) 获取。 或者自行构建: ``` sudo docker build --no-cache -t sentrypeer . sudo docker run -d -p 5060:5060/tcp -p 5061:5061/tcp -p 5060:5060/udp -p 8082:8082 -p 4222:4222/udp sentrypeer:latest ``` 然后您可以在 `http://localhost:8082/ip-addresses` 和 `http://localhost:8082/health-check` 检查它是否正在运行。 #### 环境变量 ``` ENV SENTRYPEER_CONFIG_FILE=/my/location/sentrypeer.toml ENV SENTRYPEER_DB_FILE=/my/location/sentrypeer.db ENV SENTRYPEER_API=1 ENV SENTRYPEER_WEBHOOK=1 ENV SENTRYPEER_WEBHOOK_URL=https://my.webhook.url/events ENV SENTRYPEER_OAUTH2_CLIENT_ID=1234567890 ENV SENTRYPEER_OAUTH2_CLIENT_SECRET=1234567890 ENV SENTRYPEER_SIP_RESPONSIVE=1 ENV SENTRYPEER_SIP_DISABLE=1 ENV SENTRYPEER_SYSLOG=1 ENV SENTRYPEER_PEER_TO_PEER=1 ENV SENTRYPEER_BOOTSTRAP_NODE=mybootstrapnode.com ENV SENTRYPEER_JSON_LOG=1 ENV SENTRYPEER_JSON_LOG_FILE=/my/location/sentrypeer_json.log ENV SENTRYPEER_VERBOSE=1 ENV SENTRYPEER_DEBUG=1 ENV SENTRYPEER_CERT=/my/location/sentrypeer-crt.pem ENV SENTRYPEER_KEY=/my/location/sentrypeer-key.pem ENV SENTRYPEER_TLS_LISTEN_ADDRESS=0.0.0.0:5061 ``` 可以在 Dockerfile 或您的 `Dockerfile.env` 文件或 `docker run` 命令中设置这些。 将其中任何一个设置为 `0` 也会_启用_该功能。我们_不在乎_您将其设置为什么值,只要设置了就行。 #### 配置文件 您也可以使用配置文件来设置某些内容。主要是下面的 TLS 配置。默认位置是 `~/.config/sentrypeer/default-config.toml`,但可以通过 `SENTRYPEER_CONFIG_FILE` 环境变量或 `-g` 命令行选项更改。 #### TLS 配置 要使用您自己的证书,您可以设置相应的环境变量、命令行参数或使用配置文件。例如: ``` cat ~/.config/sentrypeer/default-config.toml cert = "tests/unit_tests/127.0.0.1.pem" key = "tests/unit_tests/127.0.0.1-key.pem" tls_listen_address = "0.0.0.0:5061" ``` 如果您不设置这些,将在 sentrypeer 运行的目录中自动生成一个用于 localhost 的证书,创建 `cert.pem` 和 `key.pem` 文件。 ### 安装说明 Debian 或 Fedora 软件包始终可从 SentryPeer 当前版本的发布页面获取: https://github.com/SentryPeer/SentryPeer/releases #### Homebrew (macOS 或 Linux): 我们有一个[该项目的 Homebrew Tap](https://github.com/SentryPeer/homebrew-sentrypeer)(直到我们更受欢迎): ``` brew tap sentrypeer/sentrypeer brew install sentrypeer ``` #### Alpine Linux: SentryPeer 位于 [Alpine Linux 的测试仓库](https://gitlab.alpinelinux.org/alpine/aports/-/tree/master/testing/sentrypeer)中,因此您可以使用以下命令安装它: ``` apk -U add --no-cache -X https://dl-cdn.alpinelinux.org/alpine/edge/testing sentrypeer ``` #### Ubuntu 软件包 您可以从[我们的 Ubuntu PPA](https://launchpad.net/~gavinhenry/+archive/ubuntu/sentrypeer) 安装 SentryPeer,该 PPA 目前适用于 Ubuntu 20 LTS (Focal Fossa): ``` sudo apt install software-properties-common sudo add-apt-repository ppa:gavinhenry/sentrypeer sudo apt-get update ``` 可以通过手动复制以下行并将其添加到您系统的软件源来添加此 PPA: ``` deb https://ppa.launchpadcontent.net/gavinhenry/sentrypeer/ubuntu focal main deb-src https://ppa.launchpadcontent.net/gavinhenry/sentrypeer/ubuntu focal main ``` 然后您可以安装 SentryPeer: ``` sudo apt-get install sentrypeer ``` #### 从源代码构建 从源代码安装有两种选择。CMake 或 autotools。目前推荐 autotools。发布版本是 autotools 构建的。 如果您是 Fedora 用户,可以通过 [Fedora copr](https://copr.fedorainfracloud.org/coprs/) 安装: [https://copr.fedorainfracloud.org/coprs/ghenry/SentryPeer/](https://copr.fedorainfracloud.org/coprs/ghenry/SentryPeer/) 如果您打算从此存储库构建,则需要安装以下内容: - `git`、`autoconf`、`automake` 和 `autoconf-archive` (Debian/Ubuntu) - `libtool`、`rustc` 和 `cargo` (Fedora) - `libosip2-dev` (Debian/Ubuntu) 或 `libosip2-devel` (Fedora) - `libsqlite3-dev` (Debian/Ubuntu) 或 `sqlite-devel` (Fedora) - `uuid-dev` (Debian/Ubuntu) 或 `libuuid-devel` (Fedora) - `libmicrohttpd-dev` (Debian/Ubuntu) 或 `libmicrohttpd-devel` (Fedora) - `libjansson-dev` (Debian/Ubuntu) 或 `jansson-devel` (Fedora) - `libpcre2-dev` (Debian/Ubuntu) 或 `pcre2-devel` (Fedora) - `libcurl-dev` (Debian/Ubuntu) 或 `libcurl-devel` (Fedora) - `libcmocka-dev` (Debian/Ubuntu) 或 `libcmocka-devel` (Fedora) - 用于单元测试 Debian/Ubuntu: ``` sudo apt-get install git build-essential clang autoconf-archive autoconf \ automake libtool cmake libosip2-dev libsqlite3-dev libcmocka-dev uuid-dev \ libcurl4-openssl-dev libpcre2-dev libjansson-dev libmicrohttpd-dev libclang-dev ``` Fedora: ``` sudo dnf install git clang pkg-config autoconf automake autoconf-archive \ libtool libosip2-devel libsqlite3-devel libcmocka-devel libuuid-devel \ libmicrohttpd-devel jansson-devel libcurl-devel pcre2-devel cmake \ clang-libs clang ``` macOS: ``` brew install git libtool autoconf automake autoconf-archive libosip cmocka \ libmicrohttpd jansson curl pcre2 pkg-config opendht ossp-uuid cmake ``` Rust: ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` 然后(强烈推荐运行 make check): ``` ./bootstrap.sh ./configure make make check make install ``` CMake: ``` cmake -S . -B build -DUNIT_TESTING=ON cmake --build build ctest --test-dir build cmake --install build ``` ### 运行 SentryPeer 构建完成后,您可以这样运行以在**调试模式**下启动、**响应** SIP 探测、启用 **RESTful API**、启用 WebHook 和启用 syslog 日志记录(如果需要 [systemd](https://www.freedesktop.org/wiki/Software/systemd/) 请使用[软件包](https://github.com/SentryPeer/SentryPeer/releases)): ``` ./sentrypeer -draps SentryPeer node id: e5ac3a88-3d52-4e84-b70c-b2ce83992d02 Starting sentrypeer... API mode enabled, starting http daemon... SIP mode enabled... Peer to Peer DHT mode enabled... Starting peer to peer DHT mode using OpenDHT-C lib version '2.4.0'... Configuring local address... Creating sockets... Binding sockets to local address... Listening for incoming UDP connections... SIP responsive mode enabled. Will reply to SIP probes... Listening for incoming TCP connections... Peer to peer DHT mode started. DHT InfoHash for key 'bad_actors' is: 14d30143330e2e0e922ed4028a60ff96a59800ad Bootstrapping the DHT Waiting 5 seconds for bootstrapping to bootstrap.sentrypeer.org... Listening for changes to the bad_actors DHT key ``` 当您收到探测请求时,您可以在终端中看到类似以下的内容: ``` Received (411 bytes): OPTIONS sip:100@XXX.XXX.XXX.XXX SIP/2.0 Via: SIP/2.0/UDP 91.223.3.152:5173;branch=z9hG4bK-515761064;rport Content-Length: 0 From: "sipvicious"
标签:Docker, SIP安全, VoIP防护, 云安全监控, 可视化界面, 威胁情报, 安全扫描, 安全防御评估, 客户端加密, 开发者工具, 恶意IP检测, 时序注入, 服务器保护, 网络安全, 请求拦截, 隐私保护, 静态分析