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 次
60KB
1.5K SLoC
µSIEM 内核
用于 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