weisshorn-cyd/gocti
GitHub: weisshorn-cyd/gocti
GoCTI 是一个非官方的 OpenCTI Go 语言客户端库,让 Go 开发者能够便捷地与 OpenCTI 威胁情报平台进行数据交互和系统管理。
Stars: 14 | Forks: 1
# GoCTI
非官方的 [OpenCTI](https://github.com/OpenCTI-Platform/opencti) Go 客户端。GoCTI 目前正在开发中,因此在发布 1.0.0 版本之前,预计可能会有破坏性更新。
GoCTI 目前兼容 OpenCTI 版本 7.260326.0 - 7.260401.0。
与 [pycti](https://github.com/OpenCTI-Platform/client-python) 类似,GoCTI 支持的 OpenCTI 平台版本应与您的 OpenCTI 实例版本完全匹配。
无法保证向后或向前的兼容性。
欢迎通过 Github issues 提供反馈和建议。
## 快速开始
```
go get github.com/weisshorn-cyd/gocti
```
### 创建新 Client
```
// The client supports additional options: See api/options.go
client, err := gocti.NewOpenCTIAPIClient(
"http://localhost:8080",
"my_secret_token",
gocti.WithHealthCheck(),
)
```
### 与平台数据交互
客户端包含一个基础的 `Query` 方法,用于向 OpenCTI 发送任何 GraphQl 查询:
```
func (client *OpenCTIAPIClient) Query(
ctx context.Context,
query string,
variables any,
) (map[string]any, error)
```
实体拥有各自用于创建、删除、列出和读取的方法。这些方法返回表示目标实体的结构体(或其列表)。
这些也是由客户端持有的方法。
例如,要创建一个恶意软件实体:
```
malware, err := client.CreateMalware(ctx, "", entity.MalwareAddInput{
Name: "Example Malware",
Description: "An example of a very malicious malware.",
})
```
每个方法都有一个 `customAttributes` 字段,用于指定底层查询应返回哪些 GraphQL 属性。
对于返回特定 Go 类型的方法(例如上面的 `CreateMalware` 方法),这表示返回值的哪些字段将被设置。如果为 `customAttributes` 提供空字符串作为值,那么这些方法将设置默认属性。这些默认属性是为每种类型分别定义的。
List 方法具有一个布尔参数 `getAll`。如果设置为 `true`,该方法将返回平台中与底层查询匹配的所有内容。如果查询返回大量数据,建议将其设置为 `false`,并改用分页列表的方式。
用于列出、读取、创建和删除数据的通用和结构化方法可在 `api` 包中找到。这些方法可以即时使用,以补充 GoCTI 在您特定用例中缺失的功能。
### 实体
已实现的实体可以在 [entity](./entity) 文件夹下找到。它们或多或少与 [pycti](https://github.com/OpenCTI-Platform/client-python) 中提供的实体相匹配。
### 系统管理
平台管理已实现了额外的实体。其中一些附带了特殊方法来执行特定任务(参见 [system/utils.go](system/utils.go))。
## 示例
[examples](./examples/) 文件夹中提供了相关示例:
- `entity_creation` 展示了 GoCTI 的常见用法
- `list_report_ips` 重点介绍了目前的限制,以及如何通过即时自定义 GoCTI 来规避这些限制
- `system_management` 是 GoCTI 系统管理功能的示例
- `pagination` 展示了如何使用分页列出数据
- `custom_struct_parsing` 展示了如何使用自定义结构体和自动解析来准确查询您需要从服务器获取的数据
- `decode_graphql_interface` 展示了如何将 GraphQL interface 类型的字段转换为具体实现以及如何反向操作
## GoCTI 设计原则
GoCTI 的代码部分是通过 GraphQL introspection 生成的。
其目标是开箱即用地提供最常用的功能,即用户在大多数用例中无需编写 GraphQL 查询,也无需了解特定的 GraphQL 类型或接口。对于给定对象支持哪些字段,不应存在任何歧义。
同时,GoCTI 可以即时扩展,以满足更小众或更精确的使用场景。
GoCTI 不直接基于 [STIX](https://www.oasis-open.org/standard/stix-version-2-1/) 进行逻辑处理,它只考虑 OpenCTI 中实现的数据模式。
## 开发
[makefile](./Makefile) 提供了对开发有用的目标。
### 更新日志
每个 pull request 都必须更新 [更新日志](./CHANGELOG.md) 中的 `[Unreleased]` 条目。
### 更新支持的 OpenCTI 版本
更新支持的 OpenCTI 版本时:
- 更新 [docker-compose](./docker-compose.yml) 文件
- 更新 [project.toml](./tools/gocti_type_generator/pyproject.toml) 中的 pycti 版本
- 使用以下内容更新 [更新日志](./CHANGELOG.md):`- Support OpenCTI version X.Y.Z`
- 更新 [readme](./README.md) 中的版本信息
- 通过 `make generate` 重新生成文件
### 发布 GoCTI 的新版本
GoCTI 版本的唯一事实来源是[更新日志文件](./CHANGELOG.md)。
要创建一个发布版本,请发起一个 pull request:
- 将 [更新日志](./CHANGELOG.md) 中的 `[Unreleased]` 部分更改为相应的版本 `[X.Y.Z] - YYYY-MM-DD`
- 相应地更新 [gocti.go](./gocti.go) 和 [project.toml](./tools/gocti_type_generator/pyproject.toml) 中的版本信息
- 为该 pull request 分配 `release` 标签
- 合并后,将由 [发布 action](./.github/workflows/create-release.yml) 自动创建新的发布版本
标签:API客户端, EVTX分析, Golang, Go开发, GraphQ客户端, OpenCTI, STIX, 威胁情报, 安全编程, 开发工具包, 开发者工具, 日志审计, 第三方库, 网络威胁分析, 网络安全, 请求拦截, 隐私保护