35个版本
0.7.0 | 2024年1月21日 |
---|---|
0.5.5 | 2023年8月3日 |
0.5.4 | 2023年7月23日 |
0.4.1 | 2023年3月6日 |
0.0.36 |
|
#117 in 网络编程
每月125次下载
用于 18 crate
1MB
12K SLoC
uSIEM
允许构建自定义SIEM的框架定义。就像编写自己的网页一样编写自己的SIEM代码。
动机
我多次看到规则的更新破坏了某些功能,或者效率低下的正则表达式会减慢整个SIEM的运行。使用uSIEM方法,对SIEM的所有更改都可以被追踪,并可以使用像GIT这样的版本控制系统进行撤销。您还可以在另一个存储库中设计团队使用SIGMA的规则,并使用像Jenkins这样的CI/CD工具将SIEM代码和规则结合起来,这些工具可以运行集成测试以检查新更改是否破坏了系统,然后部署新版本。
一些基准(单线程)
日志来源 | 事件/秒 |
---|---|
Suricata(JSON) | 261780 |
OpnSense防火墙 | 750127 |
您可以在以下位置查看更详细的文档:https://github.com/u-siem/parser-benchmarks
架构
|---------------|
|----> | GatheringNode |------------------>|
| |---------------| |
| |
|---------| |------------| |------------------| |--------------| |
|InputNode| ----> | ParsingNode| ----> | Enrichment Node | ----> | IndexingNode | |
|---------| |------------| |------------------| | |--------------| |
| |
| |----------| |--------------| |----------|
--> | RuleNode | ----> | AlertingNode | ----> | SoarNode |
|----------| |--------------| |----------|
注意:它已经发生了很大的变化,并且仍在变化中。
节点类型
内核
内核将在单个线程中高优先级执行,并将负责在检测到元素中的拥塞时扩展每种类型的节点数量。它还将路由节点之间的消息。
指挥官
此组件将接受来自用户的命令并将其发送到内核进行路由,以便特定节点。
输入节点
它消费日志并处理它们。我们可以支持类似elasticsearch类型的API(如API-REST)或syslog。
解析节点
此节点将是最重要的,并将能够解析由输入节点发送给它的日志。将有一个特别设计的节点来处理类似MySQL或Linux的多行日志。
增强节点
它添加了有关IP的信息,如果它在黑名单中,如果是AmazonWebServices/Azure/GoogleCloud IP,如果该IP从未见过,它将联系GatheringNode以获取该IP的信息。在这种情况下,它会添加标签“never_seen_ip”。它使用数据集以非阻塞方式访问信息。请参阅https://1drv.ms/p/s!AvHbai5ZA14wjV9J4rbBlSWyIw0t?e=AgBWNf
GatheringNode
咨询AbuseIP/Virus total等源或数据库,以了解IP是否为恶意或不是,对域和哈希也是如此。然后,它更新适当的数据集以丰富未来的日志。
IndexingNode
将日志发送到数据库(elasticsearch/SQLite/Postgres...)进行索引,并在需要时查询它们。
RuleNode
为日志设置条件,并在条件匹配时触发警报。如果规则经过实战测试,则可以告诉SOAR节点进行操作。https://github.com/Neo23x0/sigma/tree/master/rules/windows
AlertNode
创建警报并将它们发送到另一个SIEM或将其存储在本地以使用本地UI。使用模板创建警报。
SoarNode
自动执行操作,如阻止IP、域等。OpnSense支持使用简单的API-REST调用阻止IP,Cortex XDR也是如此。对于PaloAlto:https://panos.pan.dev/docs/apis/panos_dag_qs正在进行中:定义一个可由通用组件使用的自定义特性,以简化设计。因此,我们只需要导入一个定义要执行的操作(如API调用)并在任何自定义SOAR组件中工作的库。
一个想法:像DarkTrace那样应用多个简单规则(如计算与事件关联的威胁分数。该分数将添加到一段时间内(分割窗口)用户总分数中。它将默认在24小时后通过redis实现ScoreSet中的用户分数进行实现。
Datasets
数据集类似于QRadar参考集。它们存储有关IP、IOC等信息,并且可以从日志中提取的信息几乎实时填充。
内部事件
每个组件都像一个单个实体一样工作。它可以接收特定的命令,如STOP_COMPONENT、ISOLATE_IP、LOG_QUERY或仅适用于该组件的特定命令;对收到的命令发送响应;处理日志;发送通知(uSIEM的日志系统);接收数据集更新或触发警报。请参阅:https://github.com/u-siem/u-siem-core/blob/main/src/components/common.rs
规范化
为了简化设计和强制执行做事的共同方式,设计了一个包含日志基本信息的对象,并将事件映射到规范化字段:https://github.com/u-siem/u-siem-core/blob/main/src/events/mod.rs#L26
pub fn set_event(&mut self, event: SiemEvent) {
match &event {
SiemEvent::Firewall(fw) => {
self.add_field(field_dictionary::SOURCE_IP, SiemField::IP(fw.source_ip().clone()));
self.add_field(field_dictionary::DESTINATION_IP, SiemField::IP(fw.destination_ip().clone()));
self.add_field(field_dictionary::SOURCE_PORT, SiemField::U32(fw.source_port as u32));
self.add_field(field_dictionary::DESTINATION_PORT, SiemField::U32(fw.destination_port as u32));
self.add_field(field_dictionary::EVENT_OUTCOME, SiemField::Text(Cow::Owned(fw.outcome().to_string())));
self.add_field(field_dictionary::IN_INTERFACE, SiemField::Text(Cow::Owned(fw.in_interface().to_string())));
self.add_field(field_dictionary::OUT_INTERFACE, SiemField::Text(Cow::Owned(fw.out_interface().to_string())));
self.add_field(field_dictionary::SOURCE_BYTES, SiemField::U32(fw.out_bytes));
self.add_field(field_dictionary::DESTINATION_BYTES, SiemField::U32(fw.in_bytes));
self.add_field(field_dictionary::NETWORK_TRANSPORT, SiemField::Text(Cow::Owned(fw.network_protocol().to_string())));
},
另一个有趣的规范化方面是在WebProxys的分类中:https://github.com/u-siem/u-siem-core/blob/main/src/events/webproxy.rs#L85
因此,不同制造商的所有类别将简化为以下内容
pub enum WebProxyRuleCategory {
Abortion,
MatureContent,
Alcohol,
AlternativeSpirituality,
ArtCulture,
Auctions,
AudioVideoClips,
Trading,
Economy,
Charitable,
...
待办事项列表
- 日志结构
- 具有本地水平可伸缩性的组件设计:内核必须能够在事件队列出现拥塞时增加分配给组件的线程数量。
- Prometheus度量:每种类型的处理事件、错误、连接的用户、查询数...
- 具有字段的事件类型。
- 自定义错误系统
- 组件和内核接口。组件必须在内核中注册,但内核的另一个实例必须能够知道它们的存在。
- SIEM内核通道,允许水平扩展(Redis通道)。取决于内核实现。
- 允许实时日志增强的数据集。
- 用户角色设计。灵感来自 PaloAlto Cortex XDR
- 行为引擎组件:从Darktrace获取灵感,使用许多小规则为事件生成威胁评分,并增加用户的总分。
- Active Directory集成,用于丰富与用户相关的日志。
- 设计轻量级组件,作为代理从云相关源获取日志 代理摄取组件
- SIGMA规则支持。
- 强制存储架构用于日志。每个来源提取多个字段,具有不同的名称。在Elasticsearch中,不建议有超过1000个字段。此外,它必须允许重命名字段,因为ECS在字段名称中使用点,但大多数数据库不能。
- GDPR包含日志:分析师不需要了解有关用户的信息,例如他们访问的网站或收到的电子邮件。集成到存储架构中,例如,与WebProxy事件相关的字段必须以加密方式存储,或者对于邮件事件,必须存储email.subject、email.files或email.source.user.name。
- 维护日历。用于禁用与设备配置相关的事件警报,例如FortiSIEM所做的那样。
- 文本国际化。
- 用户登录和第三方集成。
依赖关系
~4–6.5MB
~114K SLoC