SassafrasAI/intel471-rs

GitHub: SassafrasAI/intel471-rs

一个覆盖 Intel471 全部 13 个 API 服务的异步 Rust 客户端库,提供强类型访问、流式分页和 Monitor 管理能力。

Stars: 0 | Forks: 0

# intel471-rs 一个用于 [Intel471](https://intel471.com) 网络威胁情报平台的异步 Rust 客户端库。 ## 概述 `intel471-rs` 提供了对 Intel471 API 的强类型、符合人体工程学的访问。它涵盖了所有 13 个 API 服务,支持流式分页、单一资源查询、monitor 的 CRUD 操作,并在适当的情况下支持原始响应处理。 该库使用 HTTP Basic Auth 以及您的 Verity API 应用程序凭证(client ID 和 client secret)进行身份验证,并支持为测试环境配置自定义 base URL。 ## 安装说明 将该 crate 添加到您的 `Cargo.toml` 中: ``` [dependencies] intel471-rs = "0.1" ``` 或者通过 `cargo add` 安装: ``` cargo add intel471-rs ``` ## 身份验证 Intel471 API 使用您的 Verity 应用程序凭证通过 HTTP Basic Auth 进行身份验证。在 Verity Developer Portal 中创建一个应用程序以获取 client ID 和 client secret,然后将它们分别作为用户名和密码传入: ``` use intel471_rs::Intel471Client; let client = Intel471Client::new("client_id", "client_secret"); ``` 要使用自定义的 base URL: ``` let client = Intel471Client::with_base_url("client_id", "client_secret", "https://custom.api.example.com"); ``` ## 快速入门 ``` use intel471_rs::Intel471Client; use intel471_rs::models::actors::ActorStreamRequest; #[tokio::main] async fn main() -> Result<(), Box> { let client = Intel471Client::new("client_id", "client_secret"); // Stream actors matching a search term let mut stream = client.actors().stream(ActorStreamRequest { actor: "Conti".to_string(), from: None, until: None, forum: None, server_type: None, size: Some(10), cursor: None, })?; while let Some(page) = stream.next_page().await? { for actor in &page.actors { println!("{}: {}", actor.id, actor.activity.first_seen_ts); } } Ok(()) } ``` ## API 覆盖范围 | 服务 | Client 访问器 | 主要方法 | |---------|----------------|-------------| | Actors | `client.actors()` | `stream`, `stream_page` | | ASE | `client.ase()` | `list_monitors` | | Brand Exposure | `client.brand_exposure()` | Monitor 的 CRUD、扫描数据 endpoint、配置 endpoint | | Credentials | `client.credentials()` | Credential/set/occurrence 的流式获取和查询 | | Entities | `client.entities()` | `stream`, `stream_page` | | GIRS | `client.girs()` | `tree` | | Indicators | `client.indicators()` | `stream`, `stream_page`, `get_by_id` | | Malware Intel | `client.malware()` | `stream`, `get_by_id`, `list_malware`, `get_malware_family`, `download_file` | | Observables | `client.observables()` | `stream`, `stream_page` | | Reports | `client.reports()` | 用于 FINTel、Breach Alert、Geopol、Info、Spot、Malware、Vulnerability 报告的流式获取/详情 | | Sources | `client.sources()` | 用于 data-leak-site 帖子、论坛帖子/消息、聊天消息的流式获取/详情 | | TPRM | `client.tprm()` | Monitor 的 CRUD、扫描数据 endpoint、配置 endpoint | | Watchers | `client.watchers()` | `alerts_stream`, `update_alert_status`, `watcher_groups`, `watchers` | ## 使用方法 ### 带分页的流式处理 许多 Intel471 endpoint 通过基于游标的 API 返回分页结果。该库提供了两种模式: - **`stream()`** 返回一个 `PaginatedStream`,用于自动的基于游标的分页。 - **`stream_page()`** 获取单页并直接返回响应。 ``` use intel471_rs::Intel471Client; use intel471_rs::models::actors::ActorStreamPage; use intel471_rs::api::actors::ActorStreamRequest; let client = Intel471Client::new("client_id", "client_secret"); // Automatic pagination let mut stream = client.actors().stream(ActorStreamRequest { actor: "Conti".to_string(), from: Some(1700000000), until: None, forum: None, server_type: None, size: Some(10), cursor: None, })?; while let Some(page) = stream.next_page().await? { println!("Page with {} actors", page.actors.len()); } // Collect all pages let all_pages: Vec = client .actors() .stream(ActorStreamRequest { actor: "Conti".to_string(), from: None, until: None, forum: None, server_type: None, size: None, cursor: None, })? .collect_all() .await?; ``` ### 单一资源查询 ``` // Get a credential by ID let credential = client.credentials().get_credential("credential-id").await?; // Get an indicator by ID let indicator = client.indicators().get_by_id("indicator-id").await?; // Get a malware event by ID let event = client.malware().get_by_id("event-id").await?; // Get the GIRS tree let tree = client.girs().tree().await?; for gir in &tree.girs { println!("{}: {}", gir.id.as_deref().unwrap_or("-"), gir.name.as_deref().unwrap_or("-")); } ``` ### Monitor 管理 Brand Exposure 和 TPRM 服务支持完整的 monitor 生命周期操作: ``` use intel471_rs::models::brand_exposure::{ CreateMonitorRequest, EditMonitorRequest, Frequency, Impact, ListMonitorsRequest, }; // Create a monitor let request = CreateMonitorRequest { name: "example.com".to_string(), targets: vec!["example.com".to_string()], labels: vec!["brand-monitor".to_string()], frequency: Frequency::daily, impact: Impact::major, alerts: None, created_at: None, disabled_modules: None, event_types: None, iteration: None, start_at: None, }; let response = client.brand_exposure().create_monitor(&request).await?; // List monitors let monitors = client.brand_exposure().list_monitors(ListMonitorsRequest { last_run_after: None, last_run_before: None, }).await?; // Edit a monitor client.brand_exposure().edit_monitor(&response.id, &EditMonitorRequest { name: "updated-name".to_string(), targets: vec!["example.com".to_string()], labels: vec!["brand-monitor".to_string()], frequency: Frequency::daily, impact: Impact::major, alerts: None, created_at: None, disabled_modules: None, event_types: None, iteration: None, start_at: None, }).await?; // Delete a monitor client.brand_exposure().delete_monitor(&response.id).await?; ``` ### 错误处理 该库提供了一个带有便捷方法的结构化错误类型: ``` use intel471_rs::Error; match client.credentials().get_credential("invalid-id").await { Ok(cred) => println!("{:?}", cred), Err(Error::Api { status: 404, .. }) => println!("Not found"), Err(Error::Api { status: 401, .. }) => println!("Unauthorized"), Err(Error::Api { status: 403, .. }) => println!("Forbidden"), Err(Error::Api { status: 429, .. }) => println!("Rate limited"), Err(e) => println!("Other error: {}", e), } // Convenience methods if let Err(e) = result { if e.is_not_found() { /* handle 404 */ } if e.is_unauthorized() { /* handle 401 */ } if e.is_forbidden() { /* handle 403 */ } if e.is_rate_limited() { /* handle 429/503 */ } } ``` ## Crate 功能特性 该库是基于以下组件构建的: - **reqwest** — 带有原生 TLS 和 JSON 支持的 HTTP 客户端 - **serde** / **serde_json** — 序列化和反序列化 - **chrono** — 带有 Serde 支持的日期和时间处理 - **tokio** — 异步 runtime(用于测试的 dev-dependency) ## 最低支持的 Rust 版本 此 crate 需要 Rust 2024 edition(MSRV 1.85+)。 ## 许可证 基于 [BSD 3-Clause License](LICENSE) 授权。
标签:Rust, 可视化界面, 威胁情报, 开发者工具, 异步编程, 网络客户端, 网络流量审计, 通知系统