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 2021年3月28日

#117 in 网络编程

Download history 40/week @ 2024-03-11 41/week @ 2024-03-18 36/week @ 2024-03-25 106/week @ 2024-04-01 32/week @ 2024-04-08 23/week @ 2024-04-15 40/week @ 2024-04-22 235/week @ 2024-04-29 18/week @ 2024-05-06 37/week @ 2024-05-13 18/week @ 2024-05-20 47/week @ 2024-05-27 31/week @ 2024-06-03 32/week @ 2024-06-10 18/week @ 2024-06-17 43/week @ 2024-06-24

每月125次下载
用于 18 crate

MIT许可

1MB
12K SLoC

uSIEM

crates.io documentation MIT License Rust

允许构建自定义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