Docker-compose部署开源EFK与winlogbeat收集分析Window日志
概念以及架构原理
Elasticsearch + Fluentd + Kibana 简称EFK,是一套开源的日志搜索与可视化方案。其中ELasticsearch 负责日志分析和存储,Fluentd 负责日志收集,Kibana 负责界面展示。基本工作原理:Fluentd实时读取日志文件的方式获取日志内容,将日志发送至Elasticsearch,并通过Kibana展示。

简单原理架构图
环境需求介绍
此处为单点演示,CentOS主机需要预先安装docker与docker-compose
Host | OS | IP |
---|---|---|
Elasticsearch | CentOS 7.8 | 172.16.252.66 |
Fluentd | CentOS 7.8 | 172.16.252.66 |
Kibana | CentOS 7.8 | 172.16.252.66 |
DC (演示被监控) | Windows 2012R2 | 172.16.252.110 |
目录结构准备
# 目录结构
efk
├── data
├── docker-compose.yml
└── fluentd
├── conf
│ └── fluent.conf
└── Dockerfile
# 创建目录结构
sudo mkdir -p /app/efk/{data,fluentd/conf}
# 给data目录777权限,否则Elasticsearch无法启动
sudo chmod 777 /app/efk/data
开始部署
# Dockerfile文件
sudo vim /efk/fluentd/Dockerfile
# 写入如下内容
FROM fluent/fluentd:v1.9.1-debian-1.0
User root
RUN gem install fluent-plugin-elasticsearch
User fluent
# 构建fluentd镜像
sudo docker build -t custom-fluentd:latest ./
fluentd 配置
# 编写fluentd配置文件
sudo vim /efk/fluentd/conf/fluent.conf
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match *.**>
@type copy
<store>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y%m%d
include_tag_key true
type_name access_log
tag_key @log_name
flush_interval 1s
</store>
<store>
@type stdout
</store>
</match>
docker-compose.yml文件编写
version: '2'
services:
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- '8001:80'
links:
- fluentd
logging:
driver: 'fluentd'
options:
fluentd-address: localhost:24224
tag: nginx
fluentd:
image: custom-fluentd
container_name: fluentd
restart: always
volumes:
- ./fluentd/conf:/fluentd/etc
links:
- 'elasticsearch'
ports:
- '24224:24224'
- '24224:24224/udp'
elasticsearch:
image: elasticsearch:7.8.1
container_name: elasticsearch
restart: always
ports:
- '9200:9200'
environment:
- 'discovery.type=single-node'
- 'cluster.name=docker-cluster'
- 'bootstrap.memory_lock=true'
- 'ES_JAVA_OPTS=-Xms1g -Xmx1g' #此处资源限制建议大于等于1g内存,否则elasticsearch容器会启动失败
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data:/usr/share/elasticsearch/data
kibana:
image: kibana:7.8.1
container_name: kibana
restart: always
links:
- 'elasticsearch'
ports:
- '5601:5601'
服务端启动
# 在efk目录通过docker-comopose.yml文件启动
sudo docker-compose up -d
密码设置
# Elasticsearch 7.8
# 进入es容器内部
docker exec -it elasticsearch /bin/bash
# 修改es配置文件elasticsearch.yml
vi /usr/share/elasticsearch/config/elasticsearch.yml
# 添加以下内容
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
# 保存后退出docker容器
exit
# 重启elasticsearch
docker restart elasticsearch
# 重启后进入es容器中
docker exec -it elasticsearch /bin/bash
# 进入es 名录目录
cd /usr/share/elastic/bin
# 执行命令,交互式设置密码(注意保存好全部密码)
./elasticsearch-setup-passwords interactive
# Kibana 7.8
#进入Kibana容器内部
docker exec -it kibana /bin/bash
# 修改kibana配置文件kibana.yml
vi /usr/share/kibana/config/kibana.yml
#添加以下内容
i8n.locale: "zh-CN" # 修改页面显示语言为中文简体(按喜好修改)
elasticsearch.username: "kibana"
elasticsearch.password: "passwd1!"
# 保存后退出docker容器
exit
# 重启kibana
docker restart kibana
# 容器启动后通过浏览器https://172.16.252.66:5601可进入前端查看页面
Windows winlogbeat安装
下载Winlogbeat
地址:https://www.elastic.co/downloads/beats/winlogbeat
# 编辑winlogbeat.yml
... ....
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
host: "172.168.252.66:5601" # 修改为Kibana服务端ip与端口
... ...
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["172.16.252.66:9200"] # 修改elasticsearch 服务端地址与端口
# Protocol - either `http` (default) or `https`.
#protocol: "https"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
username: "elastic" # 如有配置用户,添加用户
password: "passwd1!" # 如有配置密码,添加密码
... ...
Windows 启用winlogbeat
# 将下载的winlogbeat解压到需要查看日志的服务端,使用powershell 管理员模式进入目录执行
.\install-service-winlogbeat.ps1 # 执行服务安装脚本,如提示脚本未进行
set-ExecutionPolicy RemoteSigned # 提示未进行签名验证,关掉验证重启服务器再执行安装脚本
./winlogbeat -c winlogbeat.yml -e # 测试查看
./winlogbeat setup -e # 加载 Kibana 仪表板
Start-Service winlogbeat # 启动服务
winlogbeat服务安装

winlogbeat服务安装

Windows 启用winlogbeat
Kibana前端配置
新增日志索引

新增日志索引
添加winlogbeat索引

添加winlogbeat索引
按时间戳创建winlogbeat索引

按时间戳创建索引
确认索引内容

确认内容
查看索引中日志

查看索引中的日志
按自己喜好筛选显示字段

筛选重要字段保存模板
查看日志

日志查看
按主机查看事件与统计

SIEM查看
数据类型选择

数据选择
检查并应用数据

应用数据
选择主机并查看数据

选择主机查看数据
根据喜好查看自己关心的数据类型

数据查看
EFK使用winlogbeat监控windows搭建以及基础操作基本完工,另可以在运行EFK容器的主机上跑一个Nginx做代理,一般企业环境自建DNS,可以新建一个A记录与CNAME别名解析记录,内网域名或公网域名访问,根据Nginx代理转发到Kibana容器上,这样在内部或者外部就不需要通过ip:端口的方式访问,直接使用域名访问,比较容易记,关于EFK其他功能操作后续摸索即可。