ELK Stack 日志分析:从运维转行安全运维的核心工具教程

在这里插入图片描述

引言

我从运维转行安全运维时,第一次处理服务器入侵事件 —— 面对海量日志,不知道该从哪查起;后来用了 ELK Stack,把分散的日志集中到 Kibana,用可视化图表筛选 “SSH 登录失败” 的 IP,10 分钟就定位到攻击者。ELK Stack 是 “日志分析神器”,由 Elasticsearch(存储)、Logstash(收集)、Kibana(可视化)组成,是安全运维的 “核心工具”。本文从 “环境搭建 - 日志收集 - 分析实战” 讲解,附安全分析案例,运维转行生跟着做就能上手。

一、先搞懂:ELK Stack 是什么?为什么安全运维必须会?

1. 组件分工(3 个组件缺一不可)

组件 英文 核心作用 通俗比喻
Elasticsearch ES 存储日志数据,支持快速检索(如按 IP、时间筛选) 日志 “数据库”
Logstash LS 收集分散的日志(如 Linux 系统日志、Apache 访问日志),处理后传给 ES 日志 “搬运工”
Kibana KB 可视化展示 ES 中的日志(图表、表格),支持筛选、分析 日志 “仪表盘”

2. 安全运维场景(转行生必知)

  • 入侵检测:分析 SSH 登录日志,找 “多次登录失败的 IP”(暴力破解);

  • 攻击溯源:分析 Web 访问日志,找 “包含 SQL 注入、XSS payload 的请求”(Web 攻击);

  • 故障排查:分析系统日志,找 “服务器崩溃前的错误信息”(如内存溢出);

  • 合规审计:保存 6 个月以上日志(等保 2.0 要求),随时可查。

二、第一步:ELK Stack 环境搭建(Docker 版,新手推荐)

手动装 ELK 需配置 JDK、改多份配置文件,新手易出错,推荐用 Docker 快速搭建:

1. 环境准备

  • 安装 Docker 和 docker-compose(Windows/Mac 装 Docker Desktop,自带 docker-compose;Linux 需手动装 docker-compose);

  • 硬件要求:至少 4GB 内存(ES 占用内存较高,内存不足会启动失败)。

2. 搭建步骤

  1. 下载 ELK Docker 配置文件:
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
  1. (可选)修改 ES 内存限制(避免内存不足):
  • 打开docker-compose.yml,找到 “elasticsearch” 部分,修改ES_JAVA_OPTS: “-Xms512m -Xmx512m”(将内存设为 512M,根据电脑内存调整,不超过总内存的一半);
  1. 启动 ELK:
docker-compose up -d  # 后台启动,首次启动约5-10分钟
  1. 验证启动:
  • ES:访问http://localhost:9200,显示 JSON 信息(包含 version),说明 ES 启动成功;

  • Kibana:访问http://localhost:5601,进入 Kibana 界面(首次加载慢,耐心等),说明 KB 启动成功;

  • Logstash:执行docker ps,看到docker-elk-logstash-1状态为 “Up”,说明 LS 启动成功。

三、核心流程 1:用 Logstash 收集 Linux 系统日志

以收集 Linux 服务器的/var/log/secure日志(SSH 登录日志)为例,步骤如下:

1. 配置 Logstash 输入(收集日志)

  1. 进入 Logstash 容器命令行:
docker exec -it docker-elk-logstash-1 /bin/bash
  1. 创建日志收集配置文件/usr/share/logstash/pipeline/secure.conf:
input {
  # 收集本地文件日志(这里假设Linux服务器和ELK在同一台机器,若不在同一台,需用filebeat传输,下文讲)
  file {
    path => "/var/log/secure"  # 日志文件路径(Linux系统的SSH登录日志)
    start_position => "beginning"  # 从文件开头开始收集
    sincedb_path => "/dev/null"  # 每次重启都重新收集(新手方便测试)
  }
}

filter {
  # 解析日志(将日志字符串拆成字段,如IP、时间、事件)
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:log_time} %{HOSTNAME:host} sshd\[%{NUMBER:pid}\]: %{DATA:event} %{DATA:user} from %{IPV4:src_ip}" }
  }
  # 转换时间格式(方便Kibana按时间筛选)
  date {
    match => [ "log_time", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    target => "@timestamp"
  }
}

output {
  # 将处理后的日志传给ES
  elasticsearch {
    hosts => ["elasticsearch:9200"]  # ES地址(Docker内部地址,不用改)
    index => "ssh-secure-%{+YYYY.MM.dd}"  # ES索引名(按日期分,如ssh-secure-2025.11.26)
  }
  # 同时输出到控制台(方便调试,可选)
  stdout { codec => rubydebug }
}
  1. 重启 Logstash 容器:
docker restart docker-elk-logstash-1

2. 验证日志收集(ES 中查看)

  1. 访问http://localhost:9200/ssh-secure-2025.11.26/_search?q=*(替换日期为当天,如 2025.11.26);

  2. 若返回包含 “ssh” 关键字的 JSON 数据(示例如下),说明日志已成功收集到 ES:

"hits": {
  "total": {"value": 10, "relation": "eq"},
  "hits": [
    {
      "_source": {
        "message": "Nov 26 15:30:00 localhost sshd[1234]: Failed password for root from 192.168.1.109 port 54321 ssh2",
        "log_time": "Nov 26 15:30:00",
        "host": "localhost",
        "pid": "1234",
        "event": "Failed password for",
        "user": "root",
        "src_ip": "192.168.1.109"
      }
    }
  ]
}
  1. 若未返回数据:检查 Logstash 配置文件路径是否正确(需放在/usr/share/logstash/pipeline/目录),或重启 Logstash 容器(docker restart docker-elk-logstash-1)。

四、核心流程 2:用 Kibana 可视化分析日志(安全运维实战)

Kibana 是 ELK 的 “可视化界面”,通过它能直观筛选、分析日志,下面以 “分析 SSH 暴力破解行为” 为例,讲解核心操作。

1. 步骤 1:创建 Kibana 索引模式(关联 ES 日志)

Kibana 需先关联 ES 的索引(如ssh-secure-*),才能读取日志数据:

  1. 访问 Kibana(http://localhost:5601),点击左侧 “Management”→“Stack Management”→“Kibana”→“Index Patterns”;

  2. 点击 “Create index pattern”,输入索引名ssh-secure-*(*表示匹配所有日期的 SSH 日志索引),点击 “Next step”;

  3. 选择 “Time field”(时间字段):下拉选择@timestamp(Logstash 处理后的时间字段),点击 “Create index pattern”;

  4. 创建成功后,点击左侧 “Discover”,在顶部索引下拉框选择ssh-secure-*,即可看到 ES 中的 SSH 日志列表。

2. 步骤 2:筛选 “SSH 登录失败” 日志(找暴力破解 IP)

  1. 在 “Discover” 页面,点击 “Add filter”→“Edit query DSL”,输入筛选条件(筛选 “登录失败” 的日志):
{
  "match": {
    "event": "Failed password for"
  }
}
  1. 点击 “Update”,页面会显示所有 “SSH 登录失败” 的日志,可看到src_ip(攻击 IP)、user(被攻击用户名)、@timestamp(时间);

  2. 排序分析:点击src_ip字段旁的 “▼”,按 IP 分组排序,若某 IP(如 192.168.1.109)的登录失败次数超过 10 次,基本可判断为暴力破解 IP。

3. 步骤 3:制作可视化图表(直观展示攻击情况)

用 “饼图” 展示 “各 IP 的登录失败次数”,方便向领导汇报:

  1. 点击左侧 “Visualize Library”→“Create visualization”→选择 “Pie chart”;

  2. 索引选择ssh-secure-*,点击 “Add”→“Buckets”→“Split slices”→“Aggregation” 选择 “Terms”→“Field” 选择src_ip.keyword→“Size” 设为 10(显示前 10 个 IP);

  3. 点击 “Metrics”→“Aggregation” 选择 “Count”(统计次数),点击 “Run”;

  4. 图表会显示各 IP 的登录失败次数占比,192.168.1.109 若占比 50%,说明该 IP 是主要攻击源;

  5. 保存图表:点击右上角 “Save”,命名为 “SSH 登录失败 IP 分布”。

4. 步骤 4:创建 Dashboard(整合多个图表)

若需同时展示 “登录失败次数趋势”“被攻击用户名分布”,可创建 Dashboard:

  1. 点击左侧 “Dashboards”→“Create dashboard”→“Add an existing visualization”;

  2. 选择之前保存的 “SSH 登录失败 IP 分布” 饼图,再添加 “折线图”(展示时间趋势)、“柱状图”(展示用户名分布);

  3. 调整图表位置和大小,点击 “Save”,命名为 “SSH 安全分析面板”—— 后续打开 Dashboard 就能实时查看 SSH 登录安全状态。

五、进阶实战:用 Filebeat 收集远程服务器日志

实际工作中,ELK 常部署在单独服务器,需收集其他远程服务器(如 Web 服务器、数据库服务器)的日志,此时需用 Filebeat(轻量级日志收集工具,部署在远程服务器上,比 Logstash 更节省资源)。

1. 环境准备

  • ELK 服务器:IP 192.168.1.110(已部署 ELK,Logstash 端口 5044 开放,用于接收 Filebeat 数据);

  • 远程服务器:IP 192.168.1.111(需收集/var/log/nginx/access.log(Nginx 访问日志),部署 Filebeat)。

2. 步骤 1:在远程服务器安装 Filebeat

  1. 下载 Filebeat(对应系统版本,以 Linux 为例):
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.10.0-linux-x86_64.tar.gz
tar xzvf filebeat-8.10.0-linux-x86_64.tar.gz
cd filebeat-8.10.0-linux-x86_64
  1. 配置 Filebeat:打开filebeat.yml,修改核心配置(其他默认):
filebeat.inputs:
- type: filestream
  paths:
    - /var/log/nginx/access.log  # 要收集的Nginx日志路径
  fields:
    log_type: nginx_access  # 自定义字段,标记日志类型

output.logstash:
  hosts: ["192.168.1.110:5044"]  # ELK服务器的Logstash地址和端口(5044是默认端口)

3. 步骤 2:在 ELK 服务器配置 Logstash 接收 Filebeat 数据

  1. 进入 Logstash 容器:docker exec -it docker-elk-logstash-1 /bin/bash;

  2. 创建配置文件/usr/share/logstash/pipeline/filebeat-nginx.conf:

input {
  beats {
    port => 5044  # 监听5044端口,接收Filebeat数据
  }
}

filter {
  # 解析Nginx访问日志(格式:192.168.1.112 - - [26/Nov/2025:16:00:00 +0800] "GET /index.html HTTP/1.1" 200 1234)
  grok {
    match => { "message" => "%{IPV4:client_ip} - %{DATA:user} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATH:path} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:bytes}" }
  }
  date {
    match => [ "log_time", "dd/MMM/yyyy:H:m:s Z" ]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"  # 输出到ES的索引名
  }
  stdout { codec => rubydebug }
}
  1. 重启 Logstash:docker restart docker-elk-logstash-1。

4. 步骤 3:启动 Filebeat 并验证

  1. 在远程服务器启动 Filebeat:
./filebeat -e -c filebeat.yml  # -e表示输出日志到控制台,方便调试
  1. 验证:在 Kibana 创建nginx-access-*索引模式,进入 “Discover” 查看 —— 若能看到 Nginx 访问日志(含client_ip、method、status_code字段),说明远程日志收集成功。

六、新手避坑:3 个常见 ELK 问题解决

  1. ES 启动失败,日志提示 “insufficient memory”:
  • 原因:ES 默认占用 2GB 内存,本地内存不足;

  • 解决:修改docker-compose.yml中 ES 的内存配置,如ES_JAVA_OPTS: “-Xms512m -Xmx512m”(设为 512MB,不超过总内存的一半),重启 ELK(docker-compose down && docker-compose up -d)。

  1. Kibana 看不到日志,提示 “no results found”:
  • 原因 1:索引模式未创建,或索引名不匹配(如 ES 索引是ssh-secure-2025.11.26,Kibana 索引模式是ssh-*则匹配,是nginx-*则不匹配);

  • 原因 2:时间范围筛选错误(Kibana 默认筛选 “最近 15 分钟”,若日志是 1 小时前的,需调整右上角时间范围为 “Last 1 hour”);

  • 解决:重新创建正确的索引模式,调整时间范围。

  1. Logstash 解析日志报错 “_grokparsefailure”:
  • 原因:grok 表达式与日志格式不匹配(如日志是 “Nov 26 16:30:00”,grok 用 “MM-dd HH:mm:ss” 解析,格式不对应);

  • 解决:用 Kibana 的 “Grok Debugger” 调试(“Management”→“Dev Tools”→“Grok Debugger”),输入日志示例和 grok 表达式,直到解析成功(如 “%{MONTH:month} %{MONTHDAY:day} %{TIME:time}” 匹配 “Nov 26 16:30:00”)。

七、转行应用:简历怎么写 ELK 技能?

  • 技能栏:“熟练使用 ELK Stack(Elasticsearch+Logstash+Kibana)进行日志分析,能部署 Filebeat 收集远程服务器日志,制作 SSH 登录安全、Nginx 访问分析等 Dashboard,可检测暴力破解、Web 攻击行为”;

  • 项目经验:“使用 ELK Stack 搭建企业日志分析平台,通过 Filebeat 收集 3 台 Web 服务器的 Nginx 日志,用 Logstash 解析日志字段,在 Kibana 创建‘Web 攻击分析面板’,成功识别出 2 个 SQL 注入攻击 IP,协助安全团队拉黑处理”。

总结

ELK Stack 入门的核心是 “搭建环境→收集日志→Kibana 可视化→实战分析”,运维转行生可从 “SSH 日志分析”“Nginx 日志分析” 等熟悉场景入手,逐步掌握远程日志收集、攻击检测等技能。建议每天花 1 小时实操(如制作 1 个可视化图表、解决 1 个配置问题),1 个月就能熟练应对安全运维岗位的日志分析需求。评论区说说你在 ELK 配置中遇到的问题,帮你排查!

网络安全学习资料分享

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

在这里插入图片描述

在这里插入图片描述

Logo

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

更多推荐