本文目录导读:

搭建一个完整的SIEM(安全信息与事件管理)系统是一个复杂的工程,通常需要多个组件的协同工作,并涉及从数据采集到最终告警响应的全流程。
下面是一个通用且从零开始的搭建指南,涵盖了架构设计、核心组件选型、部署步骤和常见挑战,由于商业SIEM(如Splunk、IBM QRadar、ArcSight)成本高昂且配置复杂,这里以开源的ELK/Elastic Stack(Elasticsearch, Logstash, Kibana)结合Wazuh或Security Onion为例,介绍如何搭建一个基础但功能完整的SIEM环境。
第一步:明确需求与规划
在动手搭建之前,需要明确几个关键问题:
- 数据源有哪些? 服务器(Windows/Linux)、防火墙、路由器、交换机、云服务(AWS/Azure/阿里云)、应用日志、终端(EDR)等,这决定了采集器的部署位置。
- 需要满足什么合规要求? 如等保2.0、GDPR、PCI DSS,这决定了日志需要保留多长时间(如6个月)以及需要监控哪些特定事件。
- 预算与资源如何? 是使用纯开源方案(ELK + Wazuh),还是采购商业方案(Splunk、QRadar),或者使用MSSP(托管安全服务提供商)服务。
第二步:核心架构设计
一个标准SIEM通常由以下四层组成:
- 数据采集层:收集来自各种设备和应用的日志,常用工具:Filebeat(轻量级日志采集器)、Syslog-ng、Winlogbeat(Windows事件日志)、Wazuh Agent。
- 数据处理与解析层:将非结构化的原始日志解析成结构化的字段,并做标准化处理(如时间戳统一、IP提取),常用工具:Logstash(功能强大但较重)、Fluentd、Wazuh Server。
- 存储与索引层:存储海量结构化数据,并支持快速检索,核心组件:Elasticsearch,这是SIEM的大脑。
- 分析与可视化层:提供仪表盘、报表、图表(Dashboards),并执行关联规则(Correlation Rules)以产生告警,核心组件:Kibana + ElastAlert/Wazuh Manager。
第三步:开源自建方案部署步骤(以ELK + Wazuh为例)
这是目前社区最流行、成本最低、扩展性较好的方案,Wazuh本身集成了安全分析、入侵检测、合规检查和告警功能,并深度集成Elastic Stack。
环境准备
- 服务器硬件:
- 建议至少 2台机器(分离数据和引擎)。
- Master/Data Node:CPU 8核+,内存 32GB+,SSD硬盘(IOPS要高)。
- Wazuh Manager / Logstash:CPU 4核+,内存 16GB+。
- 操作系统:Ubuntu 20.04/22.04 LTS 或 CentOS 7/8(推荐Ubuntu)。
- 网络:确保所有Agent(被监控机器)能够访问Manager(端口 1514/1515),Manager和Elasticsearch集群内部互联。
安装Elastic Stack
这是存储和搜索的底层数据库。
# 在所有ES节点上安装(以Debian系为例) # 1. 导入GPG Key wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg # 2. 添加APT源 echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list # 3. 安装Elasticsearch(生产环境需要配置集群,此处为单节点示例) sudo apt update && sudo apt install elasticsearch # 4. 配置 /etc/elasticsearch/elasticsearch.yml # 修改:discovery.type: single-node(单节点测试) # 生产环境需要配置 cluster.name, node.name, network.host, discovery.seed_hosts # 5. 启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service sudo systemctl start elasticsearch.service # 6. 验证(默认密码在启动日志中,或执行 elasticsearch-reset-password -u elastic) curl -u elastic:your_password https://localhost:9200 # 7. 安装Kibana(通常放在独立服务器上,或与ES同机) sudo apt install kibana # 配置 /etc/kibana/kibana.yml # 修改:server.host: "0.0.0.0" (允许外部访问) # 修改:elasticsearch.hosts: ["https://localhost:9200"] # 修改:elasticsearch.username: "kibana_system" (需要在ES中创建此用户) sudo systemctl enable kibana sudo systemctl start kibana
安装Wazuh Manager(数据处理与告警引擎)
Wazuh替代了Logstash的部分解析功能,并自带丰富的安全规则。
- 推荐使用All-in-One安装脚本(这会在新服务器上安装Wazuh Manager、Filebeat等):
curl -sO https://packages.wazuh.com/4.x/wazuh-install.sh sudo bash wazuh-install.sh -a
- 安装成功后,会输出 Wazuh Dashboard(其实就是Kibana的Wazuh插件版) 的IP和密码。
- 访问
https://<Wazuh-Manager-IP>即可看到Wazuh界面。
部署Agent(采集数据)
在需要监控的Windows、Linux、Mac等终端或服务器上安装Wazuh Agent。
- Windows Agent:
- 下载安装包(Wazuh官方下载)。
- 安装时填写Wazuh Manager的IP地址和密钥(安装前在Manager上生成)。
- Linux Agent:
# 在Wazuh Manager上注册客户端 sudo /var/ossec/bin/manage_agents -f -n <客户端名称> -i <客户端IP> -p any
在被监控的Linux上安装Agent
sudo apt install wazuh-agent
配置 /var/ossec/etc/ossec.conf 中的 Manager IP
sudo /var/ossec/bin/agent-auth -m
#### 5. 配置日志源(非Agent采集)
- **Syslog(网络设备、Linux系统日志)**:
- 在 `/var/ossec/etc/ossec.conf` 中配置 `<remote>` 部分,开启Syslog监听。
- 配置路由器/防火墙,将Syslog发送到Wazuh Manager的514端口(UDP)。
- **Windows Event Log(标准)**:Wazuh Agent默认已集成,无需额外配置。
- **特定应用日志(Web服务器、数据库)**:
- 在 `ossec.conf` 中配置 `<localfile>`,指定日志文件路径(如 `/var/log/nginx/access.log`)。
#### 6. 编写分析规则与告警
- **默认规则**:Wazuh自带数千条规则(位于 `/var/ossec/ruleset/rules/`),覆盖了常见的MITRE ATT&CK攻击、端口扫描、暴力破解、恶意软件等。
- **自定义规则**:
- 在 `/var/ossec/etc/rules/local_rules.xml` 中添加规则。
- 检测连续5次SSH登录失败并触发告警。
- **告警通知**:
- **邮件**:配置 `/etc/postfix/main.cf` 或使用SMTP。
- **飞书/微信/Slack**:通过Wazuh的 `custom-integrator` 功能,编写脚本发送Webhook。
- **ElastAlert**:作为一个更强大的告警框架,运行在Kibana之上,可以进行更复杂的聚合和时间序列告警。
### 第四步:核心配置与优化(关键)
1. **日志标准化**:不同设备(防火墙、服务器、交换机)的日志格式千差万别。**必须**在Logstash或Wazuh里编写Grok/Regex规则,将它们解析成统一的字段(如 `source_ip`, `dest_port`, `action`),这是最费时但最关键的一步。
2. **数据脱敏**:确保不将密码、身份证号等敏感信息直接存储到Elasticsearch中,可以在Logstash或Wazuh中使用 `anonymize` 或 `mask` 过滤器。
3. **索引生命周期(ILM)管理**:日志数据量巨大,必须配置ILM。
- **热阶段**(7天):SSD,高性能。
- **温阶段**(30天):普通机械盘,可查询。
- **冷阶段**(90天):压缩存储,低查询频率。
- **删除阶段**(>180天):自动删除,这能有效控制磁盘成本。
4. **关联规则**:单个事件(如一次登录失败)不一定是攻击,但“10秒内从同一IP尝试SSH登录失败10次”就可能是暴力破解。
- 使用Wazuh的 `<rule>` 中的 `frequency` 和 `timeframe` 属性进行事件聚合关联。
### 第五步:团队与运维
SIEM系统搭建完成只是一个开始,真正的价值在于**持续运营**(SOC运营):
1. **定义告警优先级**:不是所有告警都要去处理,将告警分为Critical、High、Medium、Low、Info等级别,过滤掉大量误报(False Positive)。
2. **事件响应流程(Playbook)**:针对高优先级告警(如勒索软件检测到、管理员账号被锁),定义明确的响应步骤(如:立即禁用账号、隔离主机、取证、上报)。
3. **日常巡检**:检查Agent是否掉线(Unhealty Agent)、日志是否中断、磁盘是否爆满。
4. **规则优化**:每周/月分析告警报表,调整误报规则,新增攻击手法规则(例如响应最新的CVE漏洞)。
### 总结与建议
- **小规模(<100台设备)**:直接使用 **Wazuh All-in-One** 方案,在一台16G内存、4核CPU的服务器上搞定,或者使用 **Security Onion**(集成了ELK、Wazuh、Suricata、Zeek等,开箱即用,非常适合初级SOC)。
- **中等规模(100-500台)**:需要**拆分架构**:一台Wazuh Manager,2-3个Elasticsearch Node(集群),一台Kibana。
- **大规模(>500台或日志量>10TB/天)**:建议考虑商业SIEM(Splunk、QRadar)或云原生日志服务(如阿里云SLS + 威胁分析、AWS Security Hub + OpenSearch),自建成本(服务器、运维人力、网络带宽)会非常高。
**一个常见的误区**:试图把所有日志“原封不动”全量保存。**建议精简日志量**:只保留合规要求必须留的(如登录、权限变更、网络连接)和调试用的(按概率保留),对于 debug/trace级别的日志,只在特定时期开启。
**最终建议**:如果你是第一次搭建,**先在虚拟机里使用 Security Onion 或 Wazuh 等集成方案快速跑通一个Demo**(采集2-3台机器的日志,模拟一次扫描攻击,看到Kibana仪表盘和告警邮件),这样做能让你对SIEM有一个直观的理解,再以此为基础去优化架构。