ElasticStack日志采集监控搭建实践案例

2022-09-29 19:21:29 浏览数 (1)

[TOC]

Beats 收集、解析和发送组件

winlogbeat - 简述与使用

描述: 我们可以利用 Winlogbeat 来进行 Windows 日志监视,大致流程是在要监视的每个系统上安装Winlogbeat指定日志文件的位置将日志数据解析为字段并发送到Elasticsearch可视化Kibana中的日志数据。

下载地址: https://www.elastic.co/downloads/beats/winlogbeat 帮助文档: https://www.elastic.co/guide/en/beats/winlogbeat/current/winlogbeat-installation-configuration.html

Tips: 你需要进行提前准备Elasticsearch来存储和搜索你的数据和Kibana来可视化和管理它。

安装流程:

Step 1.从下载页面下载Winlogbeat zip文件,并解压至任意目录此处我解压到d:logs目录之中然后再重命名winlogbeat-<version>目录为Winlogbeat.

Step 2.以管理员身份打开PowerShell提示(右键单击PowerShell图标并选择以管理员身份运行). 切换路径并运行以下命令安装服务。

代码语言:javascript复制
PS C:UsersAdministrator> cd 'd:logsWinlogbeat'
PS d:logsWinlogbeat> .install-service-winlogbeat.ps1

# - 如果系统上禁用了脚本执行,则需要为当前会话设置执行策略以允许脚本运行。
PowerShell.exe -ExecutionPolicy UnRestricted -File .install-service-winlogbeat.ps1.

Step 3.在winlogbeat.yml中设置elasticsearch、kibana连接信息

代码语言:javascript复制
# 需要连接到Elasticsearch和Kibana才能设置Winlogbeat
# - elasticsearch
output.elasticsearch:
  hosts: ["myEShost:9200"]
  username: "winlogbeat_internal"
  password: "YOUR_PASSWORD"

# - kibana
setup.kibana:
  host: "mykibanahost:5601" 
  username: "my_kibana_user"  
  password: "{pwd}"

Tips : 我们可以将敏感值存储在secrets密钥库中参考地址。

代码语言:javascript复制
# Create a keystore
winlogbeat keystore create

# Add keys (When prompted enter a value for the key.)
winlogbeat keystore add ES_PWD   
winlogbeat keystore add ES_PWD --force  # To overwrite an existing key’s value
cat /file/containing/setting/value | winlogbeat keystore add ES_PWD --stdin --force
  # Successfully updated the keystore
  
# List keysedit
winlogbeat keystore list

# Remove keysedit
winlogbeat keystore remove ES_PWD

# 例如,假设keystore包含一个名为ES_PWD的密钥,其值为 yourelasticsearchpassword
In the configuration file, use output.elasticsearch.password: "${ES_PWD}"
On the command line, use: -E "output.elasticsearch.password=${ES_PWD}"

Step 4.配置Winlogbeatedit在winlogbeat.yml中配置要监视的事件日志。 描述: 在 winlogbeat.event_log下指定要监视的事件日志列表, 默认情况下 Winlogbeat 监视应用程序、安全性和系统日志。

代码语言:javascript复制
# - 1.在winlogbeat.event_log下指定要监视的事件日志列表,默认监控 application, security, and system logs 我们可以根据需要进行添加相应事件
winlogbeat.event_logs:
  - name: Application
  - name: Security
  - name: System

# - 2.(可选)设置日志选项以将Winlogbeat日志写入文件:
logging.to_files: true
logging.files:
  path: C:ProgramDatawinlogbeatLogs
logging.level: info

Tips: 我们还可获取可用事件日志的列表 Get-EventLog * 命令

代码语言:javascript复制
Get-EventLog * | Select-Object Log,LogDisplayName
  # Log                    LogDisplayName
  # ---                    --------------
  # Application            应用程序
  # HardwareEvents         硬件事件
  # Internet Explorer      Internet Explorer
  # Key Management Service 密钥管理服务
  # OAlerts                Microsoft Office Alerts
  # Security
  # System                 系统
  # Windows PowerShell     Windows PowerShell

Step 5.保存配置文件后,使用以下命令对其进行测试,并Winlogbeat加载附带用于解析、索引和可视化数据的预定义资产。

代码语言:javascript复制
# 解析验证配置文件
PS d:logsWinlogbeat> .winlogbeat.exe test config -c .winlogbeat.yml -e

# 加载推荐的索引模板以写入Elasticsearch,并部署示例仪表板以可视化Kibana中的数据。
PS > .winlogbeat.exe setup -e
  # Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.
  # Index setup finished.
  # Loading dashboards (Kibana must be running and reachable)
  # Loaded dashboards

Step 6.启动服务或者停止服务,然后观察Kibana中主机数据的变化。

代码语言:javascript复制
Start-Service winlogbeat
Stop-Service winlogbeat

winlogbeat 常用命令 描述: 除了上述的相关命令外,winlogbeat语法参数如下:

代码语言:javascript复制
# - 索引模板加载
PS D:Pro> Expand-Archive -Path .winlogbeat-7.14.1-windows-x86_64.zip -DestinationPath .

winlogbeat.yml 语法 参考地址: https://www.elastic.co/guide/en/beats/winlogbeat/current/configuration-winlogbeat-options.html#configuration-winlogbeat-options-event_logs-name

代码语言:javascript复制
# ==== Winlogbeat specific option ====
# - 存储重新启动后用于恢复监视的信息的文件名,作为windows服务运行时建议您将该值设置为c:/ProgramData/winlogbeat/.winlogbeat.yml
winlogbeat.registry_file: C:/ProgramData/winlogbeat/.winlogbeat.yml
# - 关闭时等待所有事件发布的时间量 (默认情况下没有关闭超时)
winlogbeat.shutdown_timeout: 30s
# - 条目列表(称为词典指定要监视的事件日志)。
winlogbeat.event_logs:
  - name: Application   # - 要监视的事件日志的名称
    ignore_older: 72h   # - 如果指定了此选项将筛选早于指定时间量的事件,当您开始监视包含要忽略的旧记录的事件日志时此选项非常有用。
    provider:           # - 要包含的提供程序(源名称)的列表(即日志来源)
      - Application Error
      - Application Hang
      - Windows Error Reporting
      - EMET
  - name: System
    batch_read_size: 1000  # - 在单个批处理中从Windows API读取的最大事件日志记录数, 默认100一定要小于1024否则保存
    event_id: 6005,6006,7001,7002
  - name: Security
    processors:                     # - 要应用于事件日志生成的数据的处理器列表(主要解决windows系统限制超过22个)。
      - drop_event.when.not.or:     # - 使用drop_event(不存在则丢弃)处理器进行筛选解决此Windows限制问题。
        - equals.winlog.event_id: 903
        - equals.winlog.event_id: 1024
        - equals.winlog.event_id: 4624
    level: critical, error, warning, info ,verbose
  - name: ForwardedEvents       # - 指示日志仅包含使用Windows事件收集器从远程主机收集的事件。
    api: wineventlog-experimental # - 将选择用于从Windows API读取事件的事件日志读取器实现。(只应在测试实验功能时设置此选项)
    tags: [forwarded]           # - 标记使得在Kibana中选择特定事件或Logstash中的applyconditional过滤变得容易标记将被附加到常规配置中指定的标签列表中。 
  - name: Windows PowerShell       # - 必须在配置文件中指定通道的全名。
    event_id: 400, 403, 600, -800, # - 包含和排除(阻止)事件ID的列表, 排除事件ID为800的事件
  - name: Microsoft-Windows-PowerShell/Operational
    event_id: 4103, 4104, 4105, 4106
  - name: Microsoft-Windows-Windows Defender/Operational
    include_xml: true              # - 用于控制事件的原始XML表示是否包含在由Winlogbeat发送的数据中。默认值为false
  - name: CustomLog
    tags: ["web"]
    fields:         # - 您可以指定用于向输出添加附加信息的可选字段
      customer_id: 51415432 
    fields_under_root: true # - 如果此选项设置为true,则自定义领域存储为输出文档中的顶级字段,而不是分组到fields小词典。
    index: "%{[agent.name]}-myindex-%{ yyyy.MM.dd}"  # 可能会扩展到 “winlogbeat-myindex-2019.12.13”
    # 如果存在,此格式化字符串将覆盖此事件日志中事件的索引(对于elasticsearch输出),或设置raw_index事件的元数据字段(用于其他输出)
    keep_null: true # 如果此选项设置为true,则字段null值将在输出文档中发布。默认情况下,保持空值设置为false no_more_events  # 当事件日志读取器从Windows接收到没有其他事件可读取的信号时应执行的操作。也可以wait为了编写更多的事件(默认行为),或者停止. 当所有单个事件日志读取器都停止时,overallWinlogbeat进程将停止。

Tips : 如果指定的事件ID超过22个要包含或排除的事件ID超过22个,Windows将阻止Winlogbeat读取事件日志,因为它限制了事件日志查询中可以使用的条件数。 解决办法:

代码语言:javascript复制
winlogbeat.event_logs:
  - name: Security
    processors:
      - drop_event.when.not.or:
        - equals.winlog.event_id: 903
        - equals.winlog.event_id: 1024
        - equals.winlog.event_id: 4624

Filebeat - 简述与使用

描述: Filebeat 是一个轻量级的传送器,用于转发和集中日志数据, 该模块收集并解析常见 Unix/Linux 分发的系统日志服务创建的日志。

参考地址: https://www.elastic.co/guide/en/beats/filebeat/current/index.html

Filebeat 工作原理:

  • (1) 当您启动 Filebeat 时,它会查看您指定的日志数据位置。
  • (2) Filebeat 定位到的每个日志,Filebeat 都会启动一个采集进程。
  • (3) 每个 Harvester 读取新内容的单个日志并将新日志数据发送到Fliebeat Spooler(后台服务),并将将聚合数据发送到输出你为 Filebeat 配置的es中。

Filebeat-工作流程

Tips: Filebeat is an Elastic Beat. It’s based on the libbeat framework.

Filebeat 安装: 描述: 此处以Linux平台为例进行安装 Filebeat, 如您是其它平台或者采用其它方式(APT/YUM/Docker)则参考以下地址。 参考地址: https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation-configuration.html

http://openjdk.java.net/

for i in {78..83};do ssh -p 20211 10.4.4.{i} ‘wget http://10.4.4.21:8000/filebeatInstall.sh -O /tmp/filebeatInstall.sh && chmod x /tmp/filebeatInstall.sh && cd /tmp/ && bash -c /tmp/filebeatInstall.sh’donefor i in {16..20};do ssh -p 20211 10.41.40.

代码语言:javascript复制
#!/bin/bash
# Filebeat 快速下载安装部署
SRCNAME="filebeat-7.14.1"
SRCDIR="/usr/local/${SRCNAME}"
export SRCDIR
# 第 1 步:filebeat 下载&安装
# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.1-linux-x86_64.tar.gz
curl -L -O http://192.168.12.31/${SRCNAME}-linux-x86_64.tar.gz
tar xzf ${SRCNAME}-linux-x86_64.tar.gz -C /usr/local
mv /usr/local/${SRCNAME}-linux-x86_64 ${SRCDIR}
cd ${SRCDIR}


# 第 2 步:filebeat 安全配置
${SRCDIR}/filebeat keystore create
echo "weiyigeek-2021.1" | ${SRCDIR}/filebeat keystore add AUTH --stdin --force
${SRCDIR}/filebeat keystore list


# 第 3 步:filebeat 配置&验证
sed -i -e 's|#host: "localhost:5601"|host: "log.weiyigeek.top:5601"|g' 
-e 's|localhost:9200|log.weiyigeek.top:9200|g' 
-e 's|#username: "elastic"|username: "elastic"|g' 
-e 's|#password: "changeme"|password: "${AUTH}"|g' 
${SRCDIR}/filebeat.yml
${SRCDIR}/filebeat test config -e ${SRCDIR}/filebeat.yml

# 第 4 步:设置采集的资产
# Filebeat 带有预定义的资产,用于解析、索引和 可视化您的数据。 
# 查看可用模块:${SRCDIR}/filebeat modules list
sudo ${SRCDIR}/filebeat modules enable system
sudo chown root ${SRCDIR}/filebeat.yml 
sudo chown root ${SRCDIR}/modules.d/system.yml 
sudo ${SRCDIR}/filebeat setup


# 第 5 步:设置自启与启动 Filebeat
sudo tee /usr/lib/systemd/system/filebeat.service <<'EOF'
[Unit]
Description=Elastic kibana Filebeat Service
Documentation=https://elastic.co
After=network.target

[Service]
Type=simple
StandardError=journal
ExecStart=SRCDIR/filebeat -c SRCDIR/filebeat.yml
Restart=on-failure
RestartSec=3s

[Install]
WantedBy=multi-user.target
EOF
sed -i "s#SRCDIR#${SRCDIR}#g" /usr/lib/systemd/system/filebeat.service 
systemctl daemon-reload
systemctl start filebeat.service

# 第 6 步:在 Kibana 查看您的数据
# Filebeat 带有预构建的 Kibana 仪表板和用于可视化日志的 UI 数据。
systemctl status filebeat.service
echo -e "e[32m* 请启动 Kibana 并打开仪表板 -> 发现 -> 要查看 Filebeat 数据,请执行 确保预定义 filebeat-* 索引模式被选中e[0m"

入坑出坑

问题1.Kibana无法登陆且在登陆时显示糟糕!错误请重试,后台日志报index ... blocked by: [TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete block]

错误日志: TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete block

代码语言:javascript复制
{"type":"log","@timestamp":"2021-10-09T08:01:04 00:00","tags":["error","plugins","security","session","index"],"pid":1213,"message":"Failed to create s
ession value: cluster_block_exception: [cluster_block_exception] Reason: index [.kibana_security_session_1] blocked by: [TOO_MANY_REQUESTS/12/disk usag
e exceeded flood-stage watermark, index has read-only-allow-delete block];"}

错误原因: 由于ES存储的data磁盘空间使用率已达到95%则将索引设置成为只读模式。

解决办法:

代码语言:javascript复制
# 1.增加磁盘空间大小(操作前注意数据迁移备份)或者删除无用的日志文件
root@elk:~# ls /app/
 elastic   kibana  '#recycle'
root@elk:~# df -Th /app/
Filesystem                  Type  Size  Used Avail Use% Mounted on
192.168.2.1:/volume1/share nfs    19T  3.1T   16T  16% /app

# 2.临时在在elasticsearch.yml文件末尾添加以下内容,等等开了进去Kibana后删除无用索引。
# 控制洪水阶段水印最大百分比
cluster.routing.allocation.disk.watermark.flood_stage: 98%
# 根据磁盘使用情况来决定是否继续分配shard
cluster.routing.allocation.disk.threshold_enabled: false

curl -H "Content-Type:application/json" 
    -XPUT -u elastic:weiyigeek 'http://log.weiyigeek.top:9200/_cluster/_settings'  
    -d '{"transient": {"cluster.routing.allocation.disk.watermark.flood_stage": "99%"}}'

# 3.临时解锁指定Kibana的索引的读写权限(其它索引被锁类似)
curl -H "Content-Type:application/json" -XPUT -u elastic:weiyigeek 'http://log.weiyigeek.top:9200/.kibana_7.14.1_001/_settings' -d '{ "index.blocks.read_only_allow_delete" : null }'
curl -H "Content-Type:application/json" -XPUT -u elastic:weiyigeek 'http://log.weiyigeek.top:9200/.kibana_security_session_1/_settings' -d '{ "index.blocks.read_only_allow_delete" : null }'

0 人点赞