dynacop/threat-feed-examples
GitHub: dynacop/threat-feed-examples
该项目提供 Dynacop Threat Feed API 的示例代码,帮助用户将自有 Windows 终端上观察到的第一方攻击源 IP 提取并集成到防火墙、SIEM 和自动化脚本中。
Stars: 0 | Forks: 0
# Dynacop Threat Feed — 示例
**Dynacop Threat Feed API** 的示例客户端 —— 获取来自您自有 Windows 终端的第一方攻击者数据,可直接用于防火墙、SIEM 或脚本。
[Dynacop](https://dynacop.com) 为 Windows 控制台和 RDP 登录添加了基于个人的 MFA,并自动封禁暴力破解的攻击者 IP。Threat Feed 让您能够将工作区中的攻击者信号提取出来,并在其他任何地方采取应对措施。
## 获取 API 密钥
在面板中,打开 **Integrations → Create API key** 并选择作用域:
- **workspace** — 仅限当前工作区的数据
- **provider** — 使用单个密钥涵盖您的整个 MSP 作用域(您自身及所管理的客户)
该密钥必须具有攻击读取权限 (`audit.view`)。完整的密钥(`dyn_live_…`)仅在创建时显示**一次** —— 请立即妥善保存。请将其保存在环境变量中,切勿存放在源代码控制系统中(参见 [`examples/.env.example`](examples/.env.example)):
```
export DYNACOP_API_KEY="dyn_live_XXXXXXXX"
```
## 身份验证
请将密钥放入 `Authorization` header 中发送(切勿放在 URL 中 —— 以免泄露到代理或访问日志中):
```
curl --fail-with-body --show-error --silent \
-H "Authorization: Bearer $DYNACOP_API_KEY" \
"https://api.dynacop.com/api/v1/attacks"
```
## Endpoint
`GET https://api.dynacop.com/api/v1/attacks` — 获取针对您终端的攻击源 IP,包含尝试次数、服务、首次/最后一次出现时间以及封禁状态。
| 参数 | 含义 |
| --- | --- |
| `days` / `since` | `days=1..30`(默认为 7)或 ISO 8601 格式的 `since` 时间戳。如果同时提供,则以 `since` 为准。 |
| `min_attempts` | 仅返回达到或超过此尝试次数的来源 |
| `blocked` | `true` / `false` — 仅返回当前处于活动状态的封禁(或仅未封禁的)来源 |
| `format` | `json`(默认)或 `text` — 纯文本 IP 列表,每行一个,供防火墙导入(`Accept: text/plain` 也会选择此项) |
| `comments` | `true`(仅限文本)— 在开头添加包含生成时间和数量的 `#` header 行 |
响应包含 **ETag**;发送 `If-None-Match` 即可在数据未更改时快速获取 `304 Not Modified`(`304` 不消耗速率限制)。每个密钥的速率限制为每分钟 60 次请求(超出时返回 `429` 和 `Retry-After`) —— 请合理控制请求频率。
### JSON 结构
```
{
"generatedAt": "2026-07-20T18:00:00.000Z",
"window": { "since": "2026-07-13T18:00:00.000Z" },
"count": 2,
"attacks": [
{
"ip": "203.0.113.10",
"attempts": 128,
"firstSeenAt": "2026-07-19T02:11:00.000Z",
"lastSeenAt": "2026-07-20T17:52:00.000Z",
"resources": ["APP-SRV01"],
"customers": ["Acme"],
"blocked": true,
"services": { "rdp": 120, "ssh": 8 },
"geo": { "country": "US", "city": "Ashburn", "isp": "Example ISP" }
}
]
}
```
`customers` 仅在 **provider** 作用域的密钥中出现。`services` 仅包含非零的统计项。`geo` 可能为 `null`。每个源 IP 仅出现一次(已在您的各个资源中进行汇总)。
## 示例
| 文件 | 功能 |
| --- | --- |
| [`examples/curl.sh`](examples/curl.sh) | 常见请求:过滤器、纯文本列表、ETag/304 轮询 |
| [`examples/fetch_threat_feed.py`](examples/fetch_threat_feed.py) | 获取 JSON 并打印被封禁的源(仅使用标准库,防御性编程) |
| [`examples/Update-DynacopFirewall.ps1`](examples/Update-DynacopFirewall.ps1) | 在 Windows 防火墙中封禁 Feed 中的 IP(原子操作,可计划任务执行) |
| [`examples/threat_feed_to_ipset.sh`](examples/threat_feed_to_ipset.sh) | 将 Feed 导入 Linux `ipset`(下载 → 验证 → 原子替换) |
## Feed 中包含(及不包含)的内容
Feed 的**作用域仅限于您的密钥**:workspace 密钥只能查看该工作区的数据;provider 密钥可以查看您所管理的客户数据。对于每个攻击者 IP,它都会返回**您自己的资源名称** —— 如果是 provider 密钥,还会返回您的**客户工作区名称** —— 这样您就能分辨出某个 IP 攻击了*您的*哪台机器。这些是您为自己资产定义的名称,且仅会返回给您具有相应作用域的密钥。
它**不**包含攻击者尝试使用的用户名(这些保留在面板中)或任何内部数据库标识符。可以通过任何资源的 **API export** 策略开关将其从所有 API 输出中排除(例如,域控制器) —— 排除设置在所有位置均具有最高优先级。
## 常见问题解答
**这是一个全球性的威胁情报 Feed 吗?**
不是。它包含的是针对您自己导出的 Dynacop 资源所观察到的第一方攻击源 —— 而不是共享的或第三方的拦截列表。
**Feed 是否包含攻击者尝试使用的用户名?**
不包含。这些信息仅在面板中可见。
**Dynacop 会将 Windows 密码发送到 Feed 中吗?**
不会。Windows 密码绝不会成为 Threat Feed API 的一部分。
**Feed 是否包含我的机器或客户的名称?**
是的 —— 包含您自己的资源名称,以及(对于 provider 密钥)您的客户工作区名称,以便您将 IP 归因于特定的机器。它们仅会返回给您具有相应作用域的密钥。
**纯文本 (`format=text`) 响应是完整的快照吗?**
是的 —— 它是与您的过滤器匹配的当前源 IP 集合,每行一个,已去重。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。© 2026 Forty2 LLC。
文档:
标签:AI合规, API, PE 加载器, 威胁情报, 应用安全, 开发者工具, 逆向工具, 防火墙