#安全 #SIEM #日志

u-siem-kernel

uSIEM 内核。用于构建自定义 SIEM 的库

10 个版本

0.3.0 2023 年 8 月 3 日
0.2.2 2023 年 3 月 6 日
0.0.9 2022 年 4 月 24 日
0.0.8 2022 年 3 月 26 日
0.0.4 2021 年 10 月 28 日

解析器实现 中排名 #1158

每月下载 29

MIT 许可证

60KB
1.5K SLoC

µSIEM 内核

Documentation crates.io

用于 uSIEM 的基本内核

内核负责连接组件,扩展组件以吸收负载,并在它们之间路由消息和命令。

指标

此内核允许使用 Prometheus 指标

let encoder = prometheus::TextEncoder::new();
let mut buffer = Vec::new();
if let Err(e) = encoder.encode(&(usiem_kernel::REGISTRY).gather(), &mut buffer) {
    eprintln!("could not encode custom metrics: {}", e);
};

工作原理

内核已配置了一组组件,它将使用这些组件在新的线程中实例化和运行。

let component1 : SiemComponent = InputComponent1::new(param1,param2);
let component2 : SiemComponent = ParserComponent1::new(param1,param2);
let mut kernel = SiemBasicKernel::new(1000, 4, 5000);
kernel.register_input_component(component1);
kernel.register_parser_component(component2);
...
kernel.run()

输入组件将接收日志(syslog、类似 Elastic,从文件...)并将它们添加到解析队列。解析组件将处理日志,添加字段和日志类型,以 SiemEvent 的形式(防火墙、DHCP、DNS...)。 enricher 组件将提取有用信息以丰富其他类型的日志或规则。这些信息将存储在动态填充的数据集中。

这些数据集在整个线程间共享,无需使用 Mutex。这是通过使用 crossbeam_channels 实现的,组件将从其本地通道接收到 DatasetManager 组件需要的更新,并且它还可以使用此 DatasetManager 的通道提交更新。

组件将接收到一个 SiemDataset 枚举,它具有固定数量的类型。其中我们将找到一个 SyncDataset,它包含一个使用 Arc 在所有线程间共享的引用和一个用于向 DatasetManager 发送更新的通道

#[derive(Serialize, Debug)]
pub enum UpdateTextSet {
    Add(Cow<'static, str>),
    Remove(Cow<'static, str>),
    Replace(TextSetDataset),
}
#[derive(Debug, Clone)]
pub struct TextSetSynDataset {
    dataset: Arc<TextSetDataset>,
    comm: Sender<UpdateTextSet>,
}
#[derive(Serialize, Debug)]
pub struct TextSetDataset {
    data: BTreeSet<Cow<'static, str>>
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum SiemDataset {
    /// Map IP to country, city, latitude and longitude
    GeoIp(GeoIpSynDataset),
    /// IP associated with a hostname
    IpHost(IpMapSynDataset),
    /// IP associated with a MAC address
    IpMac(IpMapSynDataset),
    /// IP associated with a resolved domain
    IpDNS(IpMapListSynDataset),
    /// MAC address associated with a Hostname
    MacHost(TextMapSynDataset),
    /// Hostname associated with a username
    HostUser(TextMapSynDataset),
    /// List of IPs in the block list
...

使用通道而不是 Mutex 允许更高的读取数量,并且可以用于集群(但只有当内核和 DatasetManager 被设计为这样时)。每秒的写入次数也比 Mutex 高,因为我们可以在同一时间提交多个更新,以避免每次更新都实例化一个新的数据集。

依赖关系

~10–25MB
~316K SLoC