零成本学安全:用开源工具搭 SIEM 系统,转行面试有话说
本文介绍如何利用开源工具零成本搭建SIEM(安全信息与事件管理)系统,帮助转行安全运营的新手快速掌握企业级安全监控技能。通过ELK Stack(Elasticsearch、Logstash、Kibana)实现日志存储分析,结合Filebeat采集日志和Wazuh进行入侵检测,使用Docker Compose一键部署完整环境,无需商业软件授权。文章详细讲解了各组件功能与配置方法,包括日志采集、过滤转
零成本学安全:用开源工具搭 SIEM 系统,转行面试有话说

“想入行安全运营,却听说 SIEM 系统动辄几十万;自学时找不到实战环境,只能看理论文档;面试时被问‘怎么监控企业服务器安全’,只能说‘用 Burp 扫漏洞’,讲不出持续监控逻辑”—— 这是多数转行用户接触 SIEM(安全信息与事件管理)时的困境。
其实企业级 SIEM 的核心能力,用开源工具 + 本地环境就能零成本复刻。本文用 ELK Stack(日志存储分析)+Filebeat(日志采集)+Wazuh(入侵检测)搭建完整 SIEM 系统,全程基于 Docker 部署(新手 1 小时可上手),无需付费授权,最终产出 “实时监控仪表盘 + 攻击检测告警案例”,面试时能讲清 “从日志收集到安全响应” 的闭环,比单纯 “背 SIEM 概念” 更有竞争力。
一、为什么选开源工具搭 SIEM?(零成本 + 高适配)
对转行用户来说,开源 SIEM 有 3 个不可替代的优势:
-
零成本落地:所有工具(ELK、Filebeat、Wazuh)均为开源免费,无需采购商业软件(如 Splunk、IBM QRadar),本地电脑 + Docker 即可部署;
-
企业级适配:ELK、Wazuh 是企业安全运营的 “标配工具”(据 2025 年安全工具报告,60% 中小企业用 ELK 做日志分析),学会后直接匹配岗位需求;
-
技能复用性强:若你有运维经验(懂 Linux、Docker),或开发经验(懂配置文件、日志过滤),能快速上手 —— 比如 Docker 部署 ELK,运维每天都在做;Logstash 字段过滤,和开发处理数据格式逻辑一致。
核心工具选型(各司其职,缺一不可):
| 工具 | 作用 | 核心价值(转行视角) |
|---|---|---|
| Filebeat | 日志采集(轻量代理) | 无需编写复杂脚本,配置文件即可收集多源日志(系统日志、Web 日志、安全告警) |
| Logstash | 日志过滤与转换 | 清洗日志(提取 IP、时间、事件类型),把 “杂乱日志” 变成 “可分析数据”,复用数据处理思维 |
| Elasticsearch | 日志存储与检索 | 快速查询海量日志(如 “5 分钟内 SSH 登录失败记录”),理解 “分布式存储” 在安全中的应用 |
| Kibana | 可视化与仪表盘 | 制作直观图表(攻击 IP TOP10、登录失败趋势),面试时可直接展示成果 |
| Wazuh | 入侵检测与合规检查 | 自动检测异常行为(如挖矿进程、文件篡改),补充 “威胁检测” 能力,让 SIEM 不止于日志分析 |
二、环境搭建:Docker Compose 一键部署(1 小时上手)
新手避开 “手动装依赖、配环境变量” 的坑,用 Docker Compose 实现 “一行命令启动全套 SIEM”,步骤如下:
1. 前置准备(3 分钟)
-
安装 Docker 与 Docker Compose:
-
Linux:执行命令sudo apt install docker.io docker-compose -y(Ubuntu 示例)。
-
验证:执行docker -v和docker-compose -v,能显示版本即成功。
2. 编写 Docker Compose 文件(可直接复制)
新建文件夹open-source-siem,在文件夹内创建docker-compose.yml,内容如下(注释已标清各服务作用):
version: '3.8'
services:
# 1. Elasticsearch:存储日志(核心)
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
container_name: es-siem
environment:
- discovery.type=single-node # 单节点模式(新手友好,无需集群)
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 限制内存(避免卡顿,根据电脑配置调整)
- xpack.security.enabled=false # 关闭安全认证(简化配置,生产环境需开启)
ports:
- "9200:9200" # 对外端口(日志写入与查询)
volumes:
- es-data:/usr/share/elasticsearch/data # 数据持久化(重启不丢失日志)
networks:
- siem-network
# 2. Kibana:可视化仪表盘(对接ES)
kibana:
image: docker.elastic.co/kibana/kibana:7.17.0
container_name: kibana-siem
depends_on:
- elasticsearch # 依赖ES,启动顺序后于ES
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 对接ES地址
ports:
- "5601:5601" # Web访问端口(浏览器打开)
networks:
- siem-network
# 3. Logstash:日志过滤(对接Filebeat与ES)
logstash:
image: docker.elastic.co/logstash/logstash:7.17.0
container_name: logstash-siem
depends_on:
- elasticsearch
volumes:
# 挂载Logstash配置文件(后续会写,用于过滤日志)
- ./logstash/pipeline:/usr/share/logstash/pipeline
environment:
- "LS_JAVA_OPTS=-Xms256m -Xmx256m"
networks:
- siem-network
# 4. Filebeat:日志采集代理(部署在被监控机器,此处先起容器演示)
filebeat:
image: docker.elastic.co/beats/filebeat:7.17.0
container_name: filebeat-siem
user: root # 需root权限读取系统日志
depends_on:
- logstash
volumes:
# 挂载Filebeat配置文件(采集日志规则)
- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
# 采集Linux系统日志(宿主机日志挂载到容器)
- /var/log:/var/log:ro
# 采集Docker容器日志(监控其他容器)
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- siem-network
# 5. Wazuh:入侵检测(补充威胁检测能力)
wazuh-manager:
image: wazuh/wazuh-manager:4.4.0
container_name: wazuh-manager
ports:
- "1514:1514/udp" # 接收Agent日志
- "1515:1515/tcp" # 通信端口
- "55000:55000/tcp" # API端口(对接Kibana)
volumes:
- wazuh-data:/var/ossec/data
environment:
- INDEXER_URL=http://elasticsearch:9200
- INDEXER_USERNAME=elastic # 简化配置,与ES一致
- INDEXER_PASSWORD= # 无密码(生产环境需设置)
depends_on:
- elasticsearch
networks:
- siem-network
networks:
siem-network:
driver: bridge # 桥接网络,各服务互通
volumes:
es-data:
wazuh-data:
3. 编写核心配置文件(日志采集与过滤)
(1)Logstash 过滤配置(提取关键字段)
在open-source-siem文件夹内新建logstash/pipeline文件夹,创建logstash.conf(作用:把 Filebeat 采集的 “原始日志” 过滤成 “结构化数据”,如提取 IP、事件类型):
# 输入:接收Filebeat的日志
input {
beats {
port => 5044 # Filebeat默认输出端口
}
}
# 过滤:按日志类型处理(系统日志、Wazuh告警、Apache日志)
filter {
# 1. 处理Linux系统日志(/var/log/auth.log,SSH登录日志)
if [log][file][path] == "/var/log/auth.log" {
grok {
# 匹配auth.log格式,提取字段:时间、主机、进程、登录IP、登录结果
match => { "message" => "%{SYSLOGTIMESTAMP:log_time} %{HOSTNAME:host} %{DATA:process}\[%{NUMBER:pid}\]: %{DATA:action} .* from %{IPV4:src_ip} port %{NUMBER:port} .* %{DATA:login_result}" }
}
# 统一登录结果(成功=success,失败=failed)
mutate {
gsub => [ "login_result", "Accepted", "success" ]
gsub => [ "login_result", "Failed", "failed" ]
}
# 标记日志类型(方便后续筛选)
mutate {
add_field => { "log_type" => "linux_auth" }
}
}
# 2. 处理Wazuh告警日志(标记威胁等级)
if [agent][type] == "wazuh" {
mutate {
add_field => { "log_type" => "wazuh_alert" }
# 提取Wazuh威胁等级(1-10,越高越危险)
rename => { "[wazuh][alert][level]" => "threat_level" }
}
}
# 3. 处理Apache访问日志(提取请求IP、URL、状态码)
if [log][file][path] == "/var/log/apache2/access.log" {
grok {
match => { "message" => "%{IPV4:src_ip} - - \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATH:url}(?:\?%{URIPARAM:query})? HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:bytes_sent}" }
}
mutate {
add_field => { "log_type" => "apache_access" }
}
}
}
# 输出:把过滤后的日志写入ES(按日志类型分索引)
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
# 按日志类型+日期建索引(方便查询,如linux_auth-2025.11.20)
index => "%{[log_type]}-%{+YYYY.MM.dd}"
}
# 控制台打印(调试用,可选)
stdout { codec => rubydebug }
}
(2)Filebeat 采集配置(指定采集哪些日志)
在open-source-siem文件夹内新建filebeat文件夹,创建filebeat.yml(作用:告诉 Filebeat“采集什么日志、发给谁”):
filebeat.inputs:
# 1. 采集Linux系统日志(auth.log:SSH登录日志,关键安全日志)
- type: filestream
paths:
- /var/log/auth.log
fields:
log_source: "linux_server" # 标记日志来源(多服务器时区分)
# 2. 采集Apache访问日志(若宿主机装了Apache,可开启)
- type: filestream
paths:
- /var/log/apache2/access.log
fields:
log_source: "apache_server"
# 3. 采集Wazuh Agent日志(对接入侵检测)
- type: filestream
paths:
- /var/ossec/logs/alerts/alerts.json # Wazuh告警日志路径
fields:
log_source: "wazuh_agent"
# 输出:发给Logstash(不直接发ES,需过滤)
output.logstash:
hosts: ["logstash:5044"]
# 禁用无关模块(简化配置)
setup.template.enabled: false
setup.ilm.enabled: false
4. 启动 SIEM 系统(1 行命令)
在open-source-siem文件夹内执行:
docker-compose up -d
-
验证启动:执行docker-compose ps,所有服务状态为Up即成功;
-
访问 Kibana:浏览器打开http://localhost:5601,首次加载需 1-2 分钟,进入 Kibana 主页即部署完成。
三、实战:用 SIEM 系统做 “SSH 暴力破解检测”(面试核心案例)
搭建好 SIEM 后,必须落地一个 “真实安全场景”—— 以 “SSH 暴力破解检测” 为例,覆盖 “日志采集→分析→可视化→告警” 全流程,形成可量化的成果。
1. 模拟攻击:生成 SSH 暴力破解日志
在宿主机(或另一台 Linux 机器)执行命令,模拟攻击者尝试暴力破解 SSH:
# 用循环模拟多次登录失败(生成测试日志)
for i in {1..20}; do ssh root@localhost -o StrictHostKeyChecking=no <<< "exit"; done
- 作用:生成 20 条 “SSH 登录失败” 日志,这些日志会被 Filebeat 采集,经 Logstash 过滤后写入 Elasticsearch。
2. Kibana 可视化:制作 “SSH 安全监控仪表盘”
进入 Kibana(http://localhost:5601),按步骤制作仪表盘(面试时可直接展示屏幕):
(1)创建索引模式(让 Kibana 识别 ES 日志)
-
左侧菜单→Stack Management→Index Patterns→Create index pattern;
-
输入索引模式linux_auth-*(匹配 Linux 系统日志索引),点击 Next step;
-
时间字段选择@timestamp(日志时间),点击 Create index pattern。
- 同理,创建wazuh_alert-*和apache_access-*索引模式。
(2)制作核心图表(体现安全监控能力)
- SSH 登录失败 TOP10 IP(定位攻击源):
-
左侧菜单→Visualize Library→Create visualization→选择 “Horizontal Bar”;
-
聚合方式:Y 轴选 “Terms”,字段选src_ip.keyword(攻击 IP),排序选 “Count” 降序;
-
筛选条件:添加过滤器log_type: "linux_auth"和login_result: “failed”;
-
保存图表,命名为 “SSH 登录失败 IP TOP10”。
- SSH 登录结果趋势图(看攻击时间分布):
-
Create visualization→选择 “Line”;
-
X 轴选 “Date Histogram”,字段选@timestamp,间隔选 “10 分钟”;
-
拆分系列:选 “Terms”,字段选login_result.keyword(区分成功 / 失败);
-
筛选条件:log_type: “linux_auth”;
-
保存图表,命名为 “SSH 登录结果每 10 分钟趋势”。
- Wazuh 威胁告警统计(补充入侵检测):
-
Create visualization→选择 “Pie”;
-
聚合方式:“Terms”,字段选threat_level(威胁等级 1-10);
-
筛选条件:log_type: “wazuh_alert”;
-
保存图表,命名为 “Wazuh 威胁等级分布”。
(3)组合仪表盘(面试展示核心)
-
左侧菜单→Dashboard→Create dashboard→Add→选择上述 3 个图表;
-
调整布局,保存仪表盘为 “Linux 服务器安全监控面板”—— 最终效果:能直观看到 “谁在攻击(TOP10 IP)、攻击趋势(失败次数增长)、是否有高危威胁(Wazuh 告警)”。
3. 配置告警:攻击发生时自动通知
SIEM 不止于 “看日志”,更要 “主动告警”—— 配置 Kibana 告警,当 SSH 登录失败超过 5 次时,自动发送邮件(面试时讲 “告警响应”,体现闭环能力):
-
左侧菜单→Stack Management→Alerts and Insights→Rules→Create rule;
-
选择规则类型 “Index threshold”(索引阈值告警);
-
配置规则:
-
索引模式:linux_auth-*;
-
时间窗口:“Last 5 minutes”(5 分钟内);
-
阈值条件:“Count of documents” > 5(登录失败次数超过 5 次);
-
筛选条件:log_type: "linux_auth"且login_result: “failed”;
- 配置动作(发送邮件):
-
Add action→选择 “Email”;
-
填写 SMTP 服务器(如 QQ 邮箱 SMTP:smtp.qq.com,需开启授权码);
-
收件人邮箱:填写自己的邮箱;
-
邮件内容:【SIEM告警】SSH暴力破解检测:IP {{src_ip}} 在5分钟内登录失败{{count}}次,请及时处理!;
- 保存规则,命名为 “SSH 登录失败超限告警”。
- 测试:再次执行模拟攻击命令(20 次登录失败),5 分钟内会收到告警邮件,实现 “攻击检测→自动告警”。
四、面试怎么讲这个项目?(突出转行优势 + 实战成果)
转行用户讲 SIEM 项目,关键不是 “讲工具原理”,而是 “讲你用工具解决了什么问题、复用了什么旧技能、产出了什么成果”,参考话术:
“我用开源工具搭了一套企业级 SIEM 系统,核心是解决‘中小企业服务器安全监控’的痛点 —— 很多小公司没有预算买商业 SIEM,但又需要实时监控攻击,这套方案零成本就能落地。
具体做了 3 件事:
-
环境搭建:用 Docker Compose 部署 ELK+Filebeat+Wazuh,1 小时启动全套服务 —— 我之前做运维时经常用 Docker 部署应用,这个过程完全复用了 Docker 经验,比如配置数据卷持久化日志,避免重启丢失数据;
-
日志治理:针对 Linux 系统日志、Apache 访问日志做了过滤,比如用 Logstash 提取 SSH 登录日志的‘攻击 IP’和‘登录结果’—— 这和我之前处理应用日志时‘提取关键字段’的逻辑一致,只是把‘业务字段’换成了‘安全字段’;
-
实战检测:做了 SSH 暴力破解的监控场景,制作了仪表盘(能看到攻击 IP TOP10 和登录趋势),还配置了邮件告警 —— 上周测试时,模拟 20 次登录失败,3 分钟内就收到了告警邮件,真正实现‘发现攻击→及时响应’。
这套系统现在能监控 5 台 Linux 服务器,日志查询延迟不超过 10 秒,告警准确率 90% 以上 —— 对中小企业来说,完全能满足日常安全运营需求。而且我用的 ELK、Wazuh 都是企业常用工具,入职后不需要重新学新工具,能快速上手工作。”
五、避坑指南(新手常踩的 4 个问题)
1. 问题 1:Kibana 打不开,或提示 “无法连接 Elasticsearch”
-
原因:ES 未启动成功,或内存不足导致 ES 崩溃;
-
解决:
-
执行docker logs es-siem查看 ES 日志,若有 “Java heap space” 报错,修改docker-compose.yml中 ES 的ES_JAVA_OPTS(如从 512m 减到 256m);
-
执行docker-compose restart elasticsearch kibana,等待 2 分钟后再访问 Kibana。
2. 问题 2:Filebeat 采集不到日志,Logstash 无输出
-
原因:
-
Filebeat 配置文件路径错误(如/var/log/auth.log在宿主机不存在);
-
Filebeat 无读取日志的权限(容器内用户不是 root);
-
解决:
-
确认宿主机有对应日志文件(如ls /var/log/auth.log),无则手动创建(sudo touch /var/log/auth.log);
-
确保docker-compose.yml中 Filebeat 的user: root配置未删除,重启 Filebeat:docker-compose restart filebeat。
3. 问题 3:Logstash 过滤后无字段(如src_ip未提取)
-
原因:Grok 匹配规则与日志格式不匹配(不同系统的auth.log格式可能有差异);
-
解决:
-
执行docker logs logstash-siem查看 Logstash 日志,若有 “_grokparsefailure” 报错,说明匹配失败;
-
用 Kibana 的 Grok Debugger 调试:左侧菜单→Dev Tools→Grok Debugger,输入原始日志(如Nov 20 10:00:00 ubuntu sshd[1234]: Failed password for root from 192.168.1.100 port 5678 ssh2),调整 Grok 表达式直到匹配成功。
4. 问题 4:Wazuh 无告警日志,或 Kibana 看不到 Wazuh 数据
-
原因:Wazuh Agent 未安装,或未连接到 Wazuh Manager;
-
解决:
-
在宿主机安装 Wazuh Agent(对接 Manager):参考Wazuh 官方文档;
-
执行sudo systemctl start wazuh-agent启动 Agent,等待 5 分钟后,Wazuh 告警日志会被 Filebeat 采集。
六、总结:零成本 SIEM 的核心价值(转行视角)
对转行用户来说,这套开源 SIEM 项目的价值不止于 “学会一个工具”,更在于:
-
填补项目空白:简历上有 “可落地的安全运营项目”,比 “熟悉 SIEM 概念” 更有说服力;
-
匹配岗位需求:企业安全运营岗常要求 “会用 ELK 做日志分析、会配置告警”,你完全能满足;
-
建立安全思维:从 “被动扫漏洞” 转向 “主动监控 + 实时响应”,理解安全运营的核心逻辑 —— 这是面试时区分 “新手” 和 “可培养人才” 的关键。
后续你还可以扩展场景:比如采集 Windows 系统日志、监控 Web 应用的 SQL 注入请求、对接防火墙日志 —— 每多一个场景,面试时就多一个 “可讲的案例”。零成本不是 “简陋”,而是 “用有限资源做出有价值的成果”—— 这正是转行用户需要向面试官传递的核心能力。
网络安全学习资料分享
为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~


火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)