ELK Stack 日志分析:从运维转行安全运维的核心工具教程
ELK Stack日志分析教程摘要 本文介绍ELK Stack(Elasticsearch+Logstash+Kibana)作为安全运维核心工具的应用。ELK能集中分析分散日志,快速定位安全事件。教程包含: 组件分工:Elasticsearch存储日志、Logstash收集处理、Kibana可视化分析 Docker快速搭建ELK环境,适合新手入门 实战演示收集Linux系统日志(如/var/log
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. 搭建步骤
- 下载 ELK Docker 配置文件:
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
- (可选)修改 ES 内存限制(避免内存不足):
- 打开docker-compose.yml,找到 “elasticsearch” 部分,修改ES_JAVA_OPTS: “-Xms512m -Xmx512m”(将内存设为 512M,根据电脑内存调整,不超过总内存的一半);
- 启动 ELK:
docker-compose up -d # 后台启动,首次启动约5-10分钟
- 验证启动:
-
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 输入(收集日志)
- 进入 Logstash 容器命令行:
docker exec -it docker-elk-logstash-1 /bin/bash
- 创建日志收集配置文件/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 }
}
- 重启 Logstash 容器:
docker restart docker-elk-logstash-1
2. 验证日志收集(ES 中查看)
-
访问http://localhost:9200/ssh-secure-2025.11.26/_search?q=*(替换日期为当天,如 2025.11.26);
-
若返回包含 “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"
}
}
]
}
- 若未返回数据:检查 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-*),才能读取日志数据:
-
访问 Kibana(http://localhost:5601),点击左侧 “Management”→“Stack Management”→“Kibana”→“Index Patterns”;
-
点击 “Create index pattern”,输入索引名ssh-secure-*(*表示匹配所有日期的 SSH 日志索引),点击 “Next step”;
-
选择 “Time field”(时间字段):下拉选择@timestamp(Logstash 处理后的时间字段),点击 “Create index pattern”;
-
创建成功后,点击左侧 “Discover”,在顶部索引下拉框选择ssh-secure-*,即可看到 ES 中的 SSH 日志列表。
2. 步骤 2:筛选 “SSH 登录失败” 日志(找暴力破解 IP)
- 在 “Discover” 页面,点击 “Add filter”→“Edit query DSL”,输入筛选条件(筛选 “登录失败” 的日志):
{
"match": {
"event": "Failed password for"
}
}
-
点击 “Update”,页面会显示所有 “SSH 登录失败” 的日志,可看到src_ip(攻击 IP)、user(被攻击用户名)、@timestamp(时间);
-
排序分析:点击src_ip字段旁的 “▼”,按 IP 分组排序,若某 IP(如 192.168.1.109)的登录失败次数超过 10 次,基本可判断为暴力破解 IP。
3. 步骤 3:制作可视化图表(直观展示攻击情况)
用 “饼图” 展示 “各 IP 的登录失败次数”,方便向领导汇报:
-
点击左侧 “Visualize Library”→“Create visualization”→选择 “Pie chart”;
-
索引选择ssh-secure-*,点击 “Add”→“Buckets”→“Split slices”→“Aggregation” 选择 “Terms”→“Field” 选择src_ip.keyword→“Size” 设为 10(显示前 10 个 IP);
-
点击 “Metrics”→“Aggregation” 选择 “Count”(统计次数),点击 “Run”;
-
图表会显示各 IP 的登录失败次数占比,192.168.1.109 若占比 50%,说明该 IP 是主要攻击源;
-
保存图表:点击右上角 “Save”,命名为 “SSH 登录失败 IP 分布”。
4. 步骤 4:创建 Dashboard(整合多个图表)
若需同时展示 “登录失败次数趋势”“被攻击用户名分布”,可创建 Dashboard:
-
点击左侧 “Dashboards”→“Create dashboard”→“Add an existing visualization”;
-
选择之前保存的 “SSH 登录失败 IP 分布” 饼图,再添加 “折线图”(展示时间趋势)、“柱状图”(展示用户名分布);
-
调整图表位置和大小,点击 “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
- 下载 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
- 配置 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 数据
-
进入 Logstash 容器:docker exec -it docker-elk-logstash-1 /bin/bash;
-
创建配置文件/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 }
}
- 重启 Logstash:docker restart docker-elk-logstash-1。
4. 步骤 3:启动 Filebeat 并验证
- 在远程服务器启动 Filebeat:
./filebeat -e -c filebeat.yml # -e表示输出日志到控制台,方便调试
- 验证:在 Kibana 创建nginx-access-*索引模式,进入 “Discover” 查看 —— 若能看到 Nginx 访问日志(含client_ip、method、status_code字段),说明远程日志收集成功。
六、新手避坑:3 个常见 ELK 问题解决
- ES 启动失败,日志提示 “insufficient memory”:
-
原因:ES 默认占用 2GB 内存,本地内存不足;
-
解决:修改docker-compose.yml中 ES 的内存配置,如ES_JAVA_OPTS: “-Xms512m -Xmx512m”(设为 512MB,不超过总内存的一半),重启 ELK(docker-compose down && docker-compose up -d)。
- Kibana 看不到日志,提示 “no results found”:
-
原因 1:索引模式未创建,或索引名不匹配(如 ES 索引是ssh-secure-2025.11.26,Kibana 索引模式是ssh-*则匹配,是nginx-*则不匹配);
-
原因 2:时间范围筛选错误(Kibana 默认筛选 “最近 15 分钟”,若日志是 1 小时前的,需调整右上角时间范围为 “Last 1 hour”);
-
解决:重新创建正确的索引模式,调整时间范围。
- 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 配置中遇到的问题,帮你排查!
网络安全学习资料分享
为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~


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