SIEM架构解析:从日志采集到威胁响应

📅 2026/6/18 16:35:08
SIEM架构解析:从日志采集到威胁响应
安全信息与事件管理SIEM是一种平台用于收集、标准化、关联并分析企业基础设施中的安全日志数据以检测威胁并支持事件响应。架构总览第一层 — 数据来源来源类型示例日志格式终端设备Windows、Linux、macOSWindows Event Log、Syslog网络设备防火墙、路由器、交换机NetFlow、Syslog、SNMP Trap云 / 应用AWS、Azure、Web 服务器JSON、CEF、厂商 API身份系统Active Directory、LDAP、SSOKerberos、LDAP 审计日志威胁情报MISP、VirusTotal、ISACSTIX 2.x / TAXII 2.x第二层 — 采集层日志通过以下四种机制传输到 SIEM代理程序Agent— 安装在终端上的轻量级软件如 Elastic Beats、Splunk UF无代理Agentless— SIEM 通过 SNMP、WMI 或 SSH 主动轮询设备API 拉取— 定时调用云服务商的日志接口转发器 / 消息中间件— Fluentd、Logstash、Kafka 等用于缓冲和路由高并发日志流C 代码示例 — 通过 UDP 发送 Syslog 消息RFC 5424#includestdio.h#includestring.h#includetime.h#includesys/socket.h#includearpa/inet.h#includeunistd.h#defineSIEM_HOST192.168.1.100/* SIEM 采集器 IP */#defineSIEM_PORT514/* 标准 Syslog 端口 *//* 构建并发送一条 RFC-5424 格式的 Syslog 消息 */intsend_syslog_event(constchar*hostname,constchar*app_name,constchar*message){intsock;structsockaddr_indest;charbuf[1024];time_tnowtime(NULL);structtm*tgmtime(now);/* PRI (facility * 8) severity14*86 118信息级别 */intpri118;snprintf(buf,sizeof(buf),%d1 %04d-%02d-%02dT%02d:%02d:%02dZ %s %s - - - %s,pri,t-tm_year1900,t-tm_mon1,t-tm_mday,t-tm_hour,t-tm_min,t-tm_sec,hostname,app_name,message);socksocket(AF_INET,SOCK_DGRAM,0);if(sock0){perror(socket);return-1;}memset(dest,0,sizeof(dest));dest.sin_familyAF_INET;dest.sin_porthtons(SIEM_PORT);dest.sin_addr.s_addrinet_addr(SIEM_HOST);sendto(sock,buf,strlen(buf),0,(structsockaddr*)dest,sizeof(dest));close(sock);return0;}intmain(void){/* 模拟两条来自 Web 服务器的安全日志 */send_syslog_event(web-server-01,nginx,User login failed: useradmin src10.0.0.55);send_syslog_event(web-server-01,nginx,File read: /etc/passwd src10.0.0.55);return0;}第三层 — 处理层3a. 标准化与解析不同来源的原始日志格式各异SIEM 需将所有字段映射到统一模式如 CEF 通用事件格式或厂商自定义的 Splunk CIM。#includestdio.h#includestring.h#includestdlib.h/* CEF 通用事件格式字段定义 */typedefstruct{chartimestamp[32];charsrc_ip[16];chardst_ip[16];intsrc_port;intdst_port;charaction[32];/* 例如ALLOW、DENY */charseverity[8];/* LOW、MED、HIGH */charmessage[256];}CefEvent;/* 将一行防火墙 Syslog 解析为 CEF 结构体 */intparse_firewall_log(constchar*raw,CefEvent*out){memset(out,0,sizeof(*out));/* 原始日志示例 2024-06-15T12:01:05Z DENY src10.0.0.5:4432 dst192.168.1.1:22 msgSSH_attempt */if(sscanf(raw,%31s %31s src%15[^:]:%d dst%15[^:]:%d msg%255s,out-timestamp,out-action,out-src_ip,out-src_port,out-dst_ip,out-dst_port,out-message)7){/* 根据目标端口判断严重程度 */if(out-dst_port22||out-dst_port3389)strcpy(out-severity,HIGH);elsestrcpy(out-severity,LOW);return0;}return-1;/* 解析失败 */}intmain(void){constchar*raw2024-06-15T12:01:05Z DENY src10.0.0.5:4432 dst192.168.1.1:22 msgSSH_attempt;CefEvent ev;if(parse_firewall_log(raw,ev)0){printf(时间戳 : %s\n,ev.timestamp);printf(动作 : %s\n,ev.action);printf(源地址 : %s:%d\n,ev.src_ip,ev.src_port);printf(目标地址: %s:%d\n,ev.dst_ip,ev.dst_port);printf(严重程度: %s\n,ev.severity);printf(消息 : %s\n,ev.message);}return0;}3b. 事件富化解析后SIEM 会为事件附加上下文信息地理位置GeoIP、资产归属、用户部门、漏洞评分等。#includestdio.h#includestring.h/* 地理位置记录 */typedefstruct{charip[16];charcountry[32];charcity[32];}GeoRecord;/* 资产记录 */typedefstruct{charip[16];charowner[64];charrole[32];}AssetRecord;/* 简化的内存查找表生产环境应使用真实数据库或 API */staticGeoRecord geo_db[]{{10.0.0.5,内部网络,总部},{203.0.113.5,马来西亚,吉隆坡},};staticAssetRecord asset_db[]{{192.168.1.1,IT 部门,网关路由器},{192.168.1.50,财务部,工作站},};constchar*geo_lookup(constchar*ip,char*city_out){for(inti0;i2;i){if(strcmp(geo_db[i].ip,ip)0){strcpy(city_out,geo_db[i].city);returngeo_db[i].country;}}strcpy(city_out,未知);return未知;}constchar*asset_lookup(constchar*ip){for(inti0;i2;i)if(strcmp(asset_db[i].ip,ip)0)returnasset_db[i].role;return未知资产;}intmain(void){constchar*src203.0.113.5;constchar*dst192.168.1.1;charcity[32];printf(源 GeoIP : %s%s\n,geo_lookup(src,city),city);printf(目标资产 : %s\n,asset_lookup(dst));return0;}第四层 — 分析引擎4a. 关联规则当事件序列或计数在时间窗口内匹配某种模式时规则触发告警。#includestdio.h#includestring.h#includetime.h#defineMAX_EVENTS1024#defineBRUTE_THRESHOLD5/* 失败登录次数阈值 */#defineWINDOW_SECONDS60/* 时间窗口60 秒 */typedefstruct{time_tts;charsrc_ip[16];charevent_type[32];/* LOGIN_FAIL、LOGIN_OK 等 */}LogEvent;staticLogEvent event_store[MAX_EVENTS];staticintevent_count0;voidingest_event(time_tts,constchar*src,constchar*type){if(event_countMAX_EVENTS)return;event_store[event_count].tsts;strncpy(event_store[event_count].src_ip,src,15);strncpy(event_store[event_count].event_type,type,31);event_count;}/* 规则暴力破解 — 同一 IP 在 T 秒内出现 N 次 LOGIN_FAIL */voidrun_brute_force_rule(time_tnow){charseen[64][16];intseen_count0;for(inti0;ievent_count;i){LogEvent*eevent_store[i];if(strcmp(e-event_type,LOGIN_FAIL)!0)continue;if((now-e-ts)WINDOW_SECONDS)continue;intfailures0;for(intj0;jevent_count;j){if(strcmp(event_store[j].event_type,LOGIN_FAIL)0strcmp(event_store[j].src_ip,e-src_ip)0(now-event_store[j].ts)WINDOW_SECONDS)failures;}intalready0;for(intk0;kseen_count;k)if(strcmp(seen[k],e-src_ip)0){already1;break;}if(failuresBRUTE_THRESHOLD!already){printf([告警] 检测到暴力破解src%s 失败次数%d\n,e-src_ip,failures);strncpy(seen[seen_count],e-src_ip,15);}}}intmain(void){time_tbasetime(NULL);ingest_event(base,10.0.0.5,LOGIN_FAIL);ingest_event(base5,10.0.0.5,LOGIN_FAIL);ingest_event(base10,10.0.0.5,LOGIN_FAIL);ingest_event(base15,10.0.0.5,LOGIN_FAIL);ingest_event(base20,10.0.0.5,LOGIN_FAIL);ingest_event(base25,10.0.0.5,LOGIN_OK);run_brute_force_rule(base30);return0;}4b. UEBA — 用户与实体行为分析UEBA 为每个用户 / 实体建立统计基线并对偏差发出告警例如异常时段登录。#includestdio.h#includemath.h#includestring.h/* 基于 Z 分数的登录时段异常检测 */typedefstruct{charuser[32];doublemean_hour;/* 平均登录时段0–23 */doublestd_hour;/* 标准差 */}UserBaseline;staticUserBaseline baselines[]{{alice,9.0,1.2},{bob,8.5,0.9},};doublez_score(doublevalue,doublemean,doublestd){if(std0.01)return0.0;returnfabs((value-mean)/std);}voidcheck_login(constchar*user,inthour){for(inti0;i2;i){if(strcmp(baselines[i].user,user)0){doublezz_score(hour,baselines[i].mean_hour,baselines[i].std_hour);printf(用户%-8s 时段%02d:00 z%.2f %s\n,user,hour,z,z3.0?[告警] 登录时段异常:正常);return;}}printf(用户%-8s [告警] 未知用户\n,user);}intmain(void){check_login(alice,9);/* 正常 */check_login(alice,23);/* 异常 */check_login(bob,8);/* 正常 */check_login(mallory,2);/* 未知用户 */return0;}/* 编译gcc ueba.c -lm -o ueba */第五层 — 存储层级保留期限查询速度用途热层Hot0–30 天快速RAM/SSD实时调查、仪表盘暖层Warm30–90 天适中事件复盘冷层Cold90 天 – 7 年较慢对象存储合规留存、取证第六层 — 响应层SOAR 联动C 风格伪代码#includestdio.h#includestring.htypedefenum{SEV_LOW,SEV_MED,SEV_HIGH,SEV_CRITICAL}Severity;typedefstruct{charrule_name[64];charsrc_ip[16];Severity severity;}Alert;/* 模拟 SOAR 动作 */voidblock_ip(constchar*ip){printf( [SOAR] 防火墙已添加规则阻断 %s\n,ip);}voidisolate_host(constchar*ip){printf( [SOAR] 主机 %s 已从网络隔离\n,ip);}voidcreate_ticket(constchar*rule,constchar*ip){printf( [SOAR] 工单已创建规则%s 来源%s\n,rule,ip);}voidnotify_soc(constchar*msg){printf( [SOAR] 已通知 SOC%s\n,msg);}/* SOAR 剧本调度器 */voidrun_playbook(constAlert*a){printf(执行剧本告警%s\n,a-rule_name);switch(a-severity){caseSEV_CRITICAL:isolate_host(a-src_ip);block_ip(a-src_ip);create_ticket(a-rule_name,a-src_ip);notify_soc(严重告警 — 主机已隔离);break;caseSEV_HIGH:block_ip(a-src_ip);create_ticket(a-rule_name,a-src_ip);break;caseSEV_MED:create_ticket(a-rule_name,a-src_ip);break;default:printf( [SOAR] 仅记录日志低严重程度\n);}}intmain(void){Alert a1{暴力破解-SSH,10.0.0.5,SEV_HIGH};Alert a2{勒索软件-C2,203.0.113.5,SEV_CRITICAL};run_playbook(a1);putchar(\n);run_playbook(a2);return0;}关键标准与框架标准用途CEF通用事件格式ArcSight 日志模式LEEF日志事件扩展格式IBM QRadar 日志模式STIX / TAXII威胁情报共享MITRE ATTCK攻击战术 / 技术映射PCI DSS支付卡合规要求部署 SIEMISO/IEC 27001信息安全管理体系主流 SIEM 产品产品厂商备注Splunk Enterprise SecuritySplunk市场领导者SPL 查询语言强大Microsoft SentinelMicrosoft云原生深度集成 AzureIBM QRadarIBM本地/云部署关联引擎强Elastic SIEMElastic基于开源 ELK灵活扩展ChronicleGooglePB 级规模按量定价