BaseMax/SIEMGraphQLTS
GitHub: BaseMax/SIEMGraphQLTS
基于 GraphQL 和 TypeScript 构建的轻量级 SIEM 系统,提供安全事件的实时监控、查询分析和告警功能。
Stars: 2 | Forks: 2
# 基于 GraphQL 的 SIEM 项目 (TypeScript)
欢迎使用 SIEM(安全信息和事件管理)基于 GraphQL 的项目!该项目旨在通过利用 GraphQL 和 TypeScript 的功能,提供强大而灵活的安全监控解决方案。SIEM 系统从各种来源收集、分析和关联安全事件,帮助您深入了解潜在的安全威胁和漏洞。
## 界面截图
#### 实时事件监控

#### 基于 Redis 的发布/订阅通信和实时功能

#### 获取所有安全事件

#### 用户登录

#### 根据源 IP 地址获取安全事件

#### 根据严重程度获取安全事件

#### 获取特定数据源在时间范围内的安全事件

## 功能特性
- 用于查询和管理安全事件的 GraphQL API。
- 实时事件监控和告警。
- 集成各种数据源和安全工具。
- 用户认证和授权。
- 基于角色的访问控制 (RBAC) 以增强安全性。
- 可定制的仪表板和可视化。
- 基于规则的事件关联,用于识别复杂的攻击模式。
- 可扩展的架构以支持未来的增强功能。
## 技术栈
该 SIEM 项目使用以下技术构建:
- **GraphQL**:提供强大且高效的 API 用于查询和管理数据。
- **TypeScript**:确保项目的类型安全和可扩展性。
- **Node.js**:服务端 JavaScript 运行环境。
- **NestJs**:Node.js 的 Web 应用框架。
- **Prisma**:基于 TypeScript 的 ORM(对象关系映射)库,用于数据库交互。
- **PostgreSQL**:用于存储安全事件数据的关系型数据库。
- **WebSocket**:支持实时事件监控和告警。
- **Redis**:内存数据结构存储,用于发布/订阅通信和实时事件分发。
- **JWT (JSON Web Tokens)**:用于用户认证和授权。
- **Docker**:用于轻松部署和扩展的容器化技术。
## 扩展数据库
### ElasticSearch
当作为 SIEM(安全信息和事件管理)系统的一部分使用时,Elasticsearch 提供了若干优势。SIEM 系统用于从各种来源收集、分析和管理安全相关数据,以识别和响应安全事件。以下是在 SIEM 环境中使用 Elasticsearch 的一些优势:
- **快速数据检索**:Elasticsearch 专为高速数据检索和搜索而设计,非常适合实时查询和分析大量安全数据。这种速度对于及时检测和响应安全威胁至关重要。
- **可扩展性**:Elasticsearch 支持水平扩展,这意味着随着数据量的增加,您可以轻松地向集群添加更多节点。这使其适合处理由各种安全设备和应用程序生成的不断增长的数据。
- **全文搜索**:Elasticsearch 提供强大的全文搜索功能,使您能够对日志、事件和其他安全数据执行复杂搜索。这对于发现数据中的模式和异常至关重要。
- **实时分析**:Elasticsearch 支持实时数据索引和分析。这使得安全分析师能够在事件和告警发生时对其进行监控,从而缩短对潜在威胁的响应时间。
- **聚合与可视化**:Elasticsearch 可以与 Kibana 等工具集成以进行数据可视化和探索。这有助于安全团队创建仪表板、图表和安全数据的视觉表示,有助于了解趋势和识别潜在威胁。
- **机器学习**:Elasticsearch 提供机器学习功能,可用于构建异常检测模型。这些模型可以帮助自动识别数据中的异常模式,这可能表明存在安全漏洞。
- **结构化和非结构化数据**:Elasticsearch 可以处理结构化和非结构化数据,使其适合收集和分析多种类型的安全信息,包括日志、事件、网络流量等。
- **开源社区**:Elasticsearch 是开源的,这意味着有一个活跃的社区在开发插件、扩展和集成。这可以为您提供广泛的选择来增强和定制您的 SIEM 解决方案。
- **数据丰富**:Elasticsearch 可用于通过额外的上下文(如 GeoIP 信息、威胁情报源和用户信息)来丰富您的安全数据。这有助于提高威胁检测和事件响应的准确性。
- **告警和通知**:Elasticsearch 可以配置为基于预定义的条件或模式触发告警和通知。这确保安全团队能及时获知潜在的安全事件。
需要注意的是,虽然 Elasticsearch 提供了许多优势,但实施 SIEM 解决方案不仅仅涉及选择正确的技术。适当的架构、数据规范化、与各种数据源的集成以及安全分析师的专业知识也是构建有效 SIEM 系统的关键因素。
## 快速开始
要开始使用 SIEM 项目,请按照以下步骤操作:
- 克隆仓库:`git clone https://github.com/BaseMax/SIEMGraphQLTS.git`
- 进入项目目录:`cd SIEMGraphQLTS`
- 安装依赖项:`npm install`
- 构建项目:`npm run build`
- 运行数据库迁移:`npm run migrations`
- 启动服务器:`npm start`
- SIEM GraphQL 服务器现在应该在 `http://localhost:3000` 上启动并运行。
## 测试
要运行测试,请使用以下命令:
```
npm run test:e2e
```
这将执行测试套件并提供测试结果。
## Docker
您也可以运行 docker compose 并启动所有服务(Elasticsearch、Postgressql、Redis 和 SIEM):
```
docker compose up
```
## 配置
在运行项目之前,您需要在 .env 文件中配置以下设置:
- `DATABASE_URL`:这是 PostgreSQL 数据库的连接 URL。请将 postgres 替换为您的数据库用户名和密码,并将 `localhost:5432/student?schema=public` 替换为您的数据库主机和端口。
- `ELASTIC_URL`:这是 Elasticsearch 数据库的连接 URL。例如:`http://localhost:9200`
- `JWT_SECRET_KEY`:将其设置为您的应用程序的安全密钥。
- `REDIS_HOST`:Redis 连接主机。
- `REDIS_PORT`:Redis 连接端口。
- `MAIL_HOST`:邮件服务器的主机名或 IP 地址。
- `MAIL_PORT`:邮件服务器的端口号。
- `MAIL_USER`:用于向邮件服务器进行身份验证的用户名或电子邮件地址。
- `MAIL_PASSWORD`:用于邮件服务器身份验证的密码。
## 使用方法
服务器运行后,您可以使用 GraphQL 查询和变更与 SIEM 系统进行交互。请参阅 API 文档或浏览 GraphQL playground(通常可在 `http://localhost:3000/graphql` 访问)以了解可用的查询和变更。
这是一个简单的 GraphQL 查询示例:
```
query {
events {
id
timestamp
sourceIP
destinationIP
eventType
severity
}
}
```
请记得在需要时使用 JWT 令牌对您的 GraphQL 请求进行认证和授权。
## GraphQL
### 查询:
- 获取所有安全事件的列表。
- 根据 ID 获取特定的安全事件。
- 获取安全事件的总数。
- 获取指定时间范围内的安全事件。
- 根据源 IP 地址获取安全事件。
- 根据目标 IP 地址获取安全事件。
- 根据事件类型获取安全事件(例如:登录、入侵尝试)
- 根据严重程度获取安全事件(例如:低、中、高)。
- 获取按时间戳升序排列的安全事件。
- 获取按严重程度降序排列的安全事件。
- 获取与特定用户关联的安全事件。
- 获取来自特定数据源的安全事件(例如:防火墙、防病毒软件)。
- 获取匹配特定关键字或模式的安全事件。
- 获取前 N 个最频繁的安全事件。
- 获取按事件类型分组的安全事件计数。
- 获取按严重程度分组的安全事件计数。
- 获取每个数据源的安全事件计数。
- 获取每个用户的安全事件计数。
- 获取每个 IP 地址的安全事件计数。
- 获取每小时的安全事件计数。
- 获取安全事件数量最多的前 N 个用户。
- 获取匹配特定正则表达式模式的安全事件。
- 获取特定用户在时间范围内的安全事件。
- 获取特定数据源在时间范围内的安全事件。
- 获取由特定进程或应用程序生成的安全事件。
- 获取由特定恶意软件或病毒引起的安全事件。
- 获取过去 24 小时内最常见的攻击类型。
- 获取过去 7 天内最少见的事件类型。
- 获取过去一小时内每个数据源的已阻止事件数。
- 获取每个用户的平均安全事件严重级别。
- 获取按事件类别(例如:身份验证、网络)分组的安全事件计数。
- 获取成功登录次数最多的前 N 个用户。
- 获取所有数据源的列表。
- 根据 ID 获取特定的数据源。
- 获取所有规则的列表。
- 根据 ID 获取特定的规则。
- 获取特定数据源的安全事件。
- 获取特定规则的安全事件。
- 获取特定用户和数据源的安全事件。
### 变更:
- 创建具有指定属性的新安全事件。
- 更新现有安全事件的详细信息。
- 根据 ID 删除安全事件。
- 向 SIEM 系统添加新的数据源。
- 更新数据源的设置。
- 从 SIEM 系统中移除数据源。
- 使用身份验证凭据创建新的用户账户。
- 更新现有用户账户的详细信息。
- 根据 ID 删除用户账户。
- 更改用户账户的密码。
- 为用户分配角色(例如:管理员、分析师、审计员)。
- 撤销用户的角色。
- 添加用于事件关联的新安全规则。
- 更新现有安全规则的设置。
- 从 SIEM 系统中移除安全规则。
- 启用或禁用实时事件监控。
- 订阅实时安全事件通知。
- 取消订阅实时安全事件通知。
- 确认某种安全事件类型的告警。
- 忽略某种安全事件类型的告警。
- 创建新的数据源映射,以将外部事件字段转换为 SIEM schema。
- 更新现有数据源映射的设置。
- 从 SIEM 系统中移除数据源映射。
- 确认特定用户的所有告警。
- 忽略特定用户的所有告警。
- 暂时暂停实时监控以进行维护。
- 维护后恢复实时监控。
- 添加具有特定权限的新用户组。
- 更新现有用户组的权限。
- 从 SIEM 系统中移除用户组。
## 订阅
SIEM 项目中的订阅允许您在安全事件或其他相关数据发生变化时接收实时更新。此功能对于在安全事件发生时进行监控并立即采取行动特别有用。以下是如何在 GraphQL API 中设置和使用订阅的示例。
### 实时安全事件通知
您可以使用 GraphQL 订阅来订阅实时安全事件通知。每当创建新的安全事件时,您的客户端将收到包含相关事件详细信息的通知。
订阅实时安全事件通知:
- 使用以下订阅查询来接收新安全事件的实时通知:
```
subscription {
newSecurityEvent {
id
timestamp
sourceIP
destinationIP
eventType
severity
}
}
```
## GraphQL Schema
```
type User {
id: ID!
username: String!
# You might not want to expose the password field in the schema,
# as it should only be accessible for mutations, not queries.
# password: String!
# Add other user-specific fields like name, role, etc.
}
type SecurityEvent {
id: ID!
timestamp: String!
sourceIP: String!
destinationIP: String!
eventType: String!
severity: String!
# Add other security event fields as required.
}
type DataSource {
id: ID!
name: String!
description: String
# Add other fields relevant to the data source.
}
type Rule {
id: ID!
name: String!
description: String
# Add other fields relevant to the rule.
}
type Query {
users: [User!]!
securityEvents: [SecurityEvent!]!
# Additional queries go here...
}
type Mutation {
createUser(username: String!, password: String!): User!
createDataSource(name: String!, description: String): DataSource!
updateDataSource(id: ID!, name: String!, description: String): DataSource!
deleteDataSource(id: ID!): Boolean!
createRule(name: String!, description: String): Rule!
updateRule(id: ID!, name: String!, description: String): Rule!
deleteRule(id: ID!): Boolean!
securityEventsForUserAndDataSource(userId: ID!, dataSourceId: ID!): [SecurityEvent!]!
createSecurityEvent(
timestamp: String!
sourceIP: String!
destinationIP: String!
eventType: String!
severity: String!
): SecurityEvent!
# Additional mutations go here...
}
```
## 贡献
欢迎对 SIEM 项目做出贡献!如果您发现任何问题或有改进建议,请开启一个 issue 或提交 pull request。请确保您遵循项目的编码标准和准则。
## 许可证
该基于 GraphQL 的 SIEM 项目是开源的,并在 GPL-3.0 许可证下发布。请根据许可证条款随意使用、修改和分发它。
版权所有 2023, Max Base
标签:AMSI绕过, API安全, CISA项目, GraphQL, IP 地址批量处理, JSON输出, MITM代理, OISF, PE 加载器, RBAC, Redis, TypeScript, 事件关联, 发布订阅, 威胁检测, 安全事件分析, 安全仪表盘, 安全信息与事件管理, 安全插件, 密码管理, 搜索引擎查询, 搜索引擎爬取, 日志管理, 测试用例, 漏洞分析, 网络安全, 自动化攻击, 角色访问控制, 请求拦截, 路径探测, 隐私保护