零成本学安全:用开源工具搭 SIEM 系统,转行面试有话说

在这里插入图片描述

“想入行安全运营,却听说 SIEM 系统动辄几十万;自学时找不到实战环境,只能看理论文档;面试时被问‘怎么监控企业服务器安全’,只能说‘用 Burp 扫漏洞’,讲不出持续监控逻辑”—— 这是多数转行用户接触 SIEM(安全信息与事件管理)时的困境。

其实企业级 SIEM 的核心能力,用开源工具 + 本地环境就能零成本复刻。本文用 ELK Stack(日志存储分析)+Filebeat(日志采集)+Wazuh(入侵检测)搭建完整 SIEM 系统,全程基于 Docker 部署(新手 1 小时可上手),无需付费授权,最终产出 “实时监控仪表盘 + 攻击检测告警案例”,面试时能讲清 “从日志收集到安全响应” 的闭环,比单纯 “背 SIEM 概念” 更有竞争力。

一、为什么选开源工具搭 SIEM?(零成本 + 高适配)

对转行用户来说,开源 SIEM 有 3 个不可替代的优势:

  1. 零成本落地:所有工具(ELK、Filebeat、Wazuh)均为开源免费,无需采购商业软件(如 Splunk、IBM QRadar),本地电脑 + Docker 即可部署;

  2. 企业级适配:ELK、Wazuh 是企业安全运营的 “标配工具”(据 2025 年安全工具报告,60% 中小企业用 ELK 做日志分析),学会后直接匹配岗位需求;

  3. 技能复用性强:若你有运维经验(懂 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:

  • Windows/macOS:直接装Docker Desktop(自带 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 日志)
  1. 左侧菜单→Stack Management→Index Patterns→Create index pattern;

  2. 输入索引模式linux_auth-*(匹配 Linux 系统日志索引),点击 Next step;

  3. 时间字段选择@timestamp(日志时间),点击 Create index pattern。

  • 同理,创建wazuh_alert-*和apache_access-*索引模式。
(2)制作核心图表(体现安全监控能力)
  1. 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”。

  1. SSH 登录结果趋势图(看攻击时间分布):
  • Create visualization→选择 “Line”;

  • X 轴选 “Date Histogram”,字段选@timestamp,间隔选 “10 分钟”;

  • 拆分系列:选 “Terms”,字段选login_result.keyword(区分成功 / 失败);

  • 筛选条件:log_type: “linux_auth”;

  • 保存图表,命名为 “SSH 登录结果每 10 分钟趋势”。

  1. 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 次时,自动发送邮件(面试时讲 “告警响应”,体现闭环能力):

  1. 左侧菜单→Stack Management→Alerts and Insights→Rules→Create rule;

  2. 选择规则类型 “Index threshold”(索引阈值告警);

  3. 配置规则:

  • 索引模式:linux_auth-*;

  • 时间窗口:“Last 5 minutes”(5 分钟内);

  • 阈值条件:“Count of documents” > 5(登录失败次数超过 5 次);

  • 筛选条件:log_type: "linux_auth"且login_result: “failed”;

  1. 配置动作(发送邮件):
  • Add action→选择 “Email”;

  • 填写 SMTP 服务器(如 QQ 邮箱 SMTP:smtp.qq.com,需开启授权码);

  • 收件人邮箱:填写自己的邮箱;

  • 邮件内容:【SIEM告警】SSH暴力破解检测:IP {{src_ip}} 在5分钟内登录失败{{count}}次,请及时处理!;

  1. 保存规则,命名为 “SSH 登录失败超限告警”。
  • 测试:再次执行模拟攻击命令(20 次登录失败),5 分钟内会收到告警邮件,实现 “攻击检测→自动告警”。

四、面试怎么讲这个项目?(突出转行优势 + 实战成果)

转行用户讲 SIEM 项目,关键不是 “讲工具原理”,而是 “讲你用工具解决了什么问题、复用了什么旧技能、产出了什么成果”,参考话术:

“我用开源工具搭了一套企业级 SIEM 系统,核心是解决‘中小企业服务器安全监控’的痛点 —— 很多小公司没有预算买商业 SIEM,但又需要实时监控攻击,这套方案零成本就能落地。

具体做了 3 件事:

  1. 环境搭建:用 Docker Compose 部署 ELK+Filebeat+Wazuh,1 小时启动全套服务 —— 我之前做运维时经常用 Docker 部署应用,这个过程完全复用了 Docker 经验,比如配置数据卷持久化日志,避免重启丢失数据;

  2. 日志治理:针对 Linux 系统日志、Apache 访问日志做了过滤,比如用 Logstash 提取 SSH 登录日志的‘攻击 IP’和‘登录结果’—— 这和我之前处理应用日志时‘提取关键字段’的逻辑一致,只是把‘业务字段’换成了‘安全字段’;

  3. 实战检测:做了 SSH 暴力破解的监控场景,制作了仪表盘(能看到攻击 IP TOP10 和登录趋势),还配置了邮件告警 —— 上周测试时,模拟 20 次登录失败,3 分钟内就收到了告警邮件,真正实现‘发现攻击→及时响应’。

这套系统现在能监控 5 台 Linux 服务器,日志查询延迟不超过 10 秒,告警准确率 90% 以上 —— 对中小企业来说,完全能满足日常安全运营需求。而且我用的 ELK、Wazuh 都是企业常用工具,入职后不需要重新学新工具,能快速上手工作。”

五、避坑指南(新手常踩的 4 个问题)

1. 问题 1:Kibana 打不开,或提示 “无法连接 Elasticsearch”

  • 原因:ES 未启动成功,或内存不足导致 ES 崩溃;

  • 解决

  1. 执行docker logs es-siem查看 ES 日志,若有 “Java heap space” 报错,修改docker-compose.yml中 ES 的ES_JAVA_OPTS(如从 512m 减到 256m);

  2. 执行docker-compose restart elasticsearch kibana,等待 2 分钟后再访问 Kibana。

2. 问题 2:Filebeat 采集不到日志,Logstash 无输出

  • 原因

  • Filebeat 配置文件路径错误(如/var/log/auth.log在宿主机不存在);

  • Filebeat 无读取日志的权限(容器内用户不是 root);

  • 解决

  1. 确认宿主机有对应日志文件(如ls /var/log/auth.log),无则手动创建(sudo touch /var/log/auth.log);

  2. 确保docker-compose.yml中 Filebeat 的user: root配置未删除,重启 Filebeat:docker-compose restart filebeat。

3. 问题 3:Logstash 过滤后无字段(如src_ip未提取)

  • 原因:Grok 匹配规则与日志格式不匹配(不同系统的auth.log格式可能有差异);

  • 解决

  1. 执行docker logs logstash-siem查看 Logstash 日志,若有 “_grokparsefailure” 报错,说明匹配失败;

  2. 用 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;

  • 解决

  1. 在宿主机安装 Wazuh Agent(对接 Manager):参考Wazuh 官方文档

  2. 执行sudo systemctl start wazuh-agent启动 Agent,等待 5 分钟后,Wazuh 告警日志会被 Filebeat 采集。

六、总结:零成本 SIEM 的核心价值(转行视角)

对转行用户来说,这套开源 SIEM 项目的价值不止于 “学会一个工具”,更在于:

  1. 填补项目空白:简历上有 “可落地的安全运营项目”,比 “熟悉 SIEM 概念” 更有说服力;

  2. 匹配岗位需求:企业安全运营岗常要求 “会用 ELK 做日志分析、会配置告警”,你完全能满足;

  3. 建立安全思维:从 “被动扫漏洞” 转向 “主动监控 + 实时响应”,理解安全运营的核心逻辑 —— 这是面试时区分 “新手” 和 “可培养人才” 的关键。

后续你还可以扩展场景:比如采集 Windows 系统日志、监控 Web 应用的 SQL 注入请求、对接防火墙日志 —— 每多一个场景,面试时就多一个 “可讲的案例”。零成本不是 “简陋”,而是 “用有限资源做出有价值的成果”—— 这正是转行用户需要向面试官传递的核心能力。

网络安全学习资料分享

为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~

在这里插入图片描述

在这里插入图片描述

Logo

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

更多推荐