在 Graylog 中分析日志

NmapBeginner
立即练习

介绍

在本实验中,你将学习如何使用 Graylog,一个强大的开源日志管理平台,来收集和分析日志数据。集中式日志记录是网络安全的一个关键组成部分,它允许你从单一界面监控系统事件、检测异常并调查安全事件。

你将首先使用 Docker Compose 部署整个 Graylog 堆栈,其中包括 MongoDB 和 OpenSearch(Elasticsearch 的现代替代品)。然后,你将配置 Graylog 以接收日志数据,向其发送示例日志,执行搜索查询以过滤信息,最后构建一个可视化仪表板来监控关键指标。在本实验结束时,你将对 Graylog 中的日志分析基本工作流程获得实践经验。

使用 Docker Compose 部署 Graylog

在第一步中,你将部署 Graylog 日志平台。我们将使用 Docker Compose v2,这是一个用于定义和运行多容器 Docker 应用程序的工具。这种方法通过一个配置文件管理所有必需的组件——Graylog、OpenSearch 和 MongoDB——从而简化了设置过程。

首先,让我们准备环境并启动服务。

  1. 设置脚本已为你安装了 Docker Compose v2。你可以通过检查其版本来验证安装。

    docker compose version

    你应该会看到类似以下的输出,显示 Docker Compose 的版本:

    Docker Compose version v2.29.7
  2. 导航到 Graylog 配置的专用目录。这有助于保持项目井然有序。

    cd /home/labex/project/graylog
  3. 接下来,使用 nano 文本编辑器创建 docker-compose.yml 配置文件。此文件告诉 Docker Compose 要运行哪些容器以及如何配置它们。

    nano docker-compose.yml
  4. 将以下 YAML 配置复制并粘贴到 nano 编辑器中。此配置定义了三个服务:

    • mongodb: 存储 Graylog 的配置数据。
    • opensearch: 索引和存储日志消息以进行快速搜索。请注意,OpenSearch 2.12+ 需要初始管理员密码。
    • graylog: 主应用程序,提供 Web 界面和日志处理引擎。
    services:
      mongodb:
        image: mongo:6.0
        container_name: graylog_mongodb
        volumes:
          - mongo_data:/data/db
        networks:
          - graylog_network
        healthcheck:
          test: ["CMD", "mongosh", "--eval", "db.runCommand('ping').ok"]
          interval: 30s
          timeout: 10s
          retries: 3
      opensearch:
        image: opensearchproject/opensearch:2.13.0
        container_name: graylog_opensearch
        environment:
          - discovery.type=single-node
          - plugins.security.disabled=true
          - bootstrap.memory_lock=true
          - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
          - "OPENSEARCH_INITIAL_ADMIN_PASSWORD=StrongPassword123!"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - opensearch_data:/usr/share/opensearch/data
        networks:
          - graylog_network
        healthcheck:
          test:
            [
              "CMD-SHELL",
              "curl -f http://localhost:9200/_cluster/health || exit 1"
            ]
          interval: 30s
          timeout: 10s
          retries: 3
      graylog:
        image: graylog/graylog:6.1
        container_name: graylog_server
        volumes:
          - graylog_data:/usr/share/graylog/data
        environment:
          - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
          - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
          - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
          - GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200
          - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
        depends_on:
          mongodb:
            condition: service_healthy
          opensearch:
            condition: service_healthy
        ports:
          - "9000:9000"
          - "1514:1514"
          - "1514:1514/udp"
          - "12201:12201"
          - "12201:12201/udp"
        networks:
          - graylog_network
    volumes:
      mongo_data:
      opensearch_data:
      graylog_data:
    networks:
      graylog_network:
        driver: bridge

    Ctrl+O,然后按 Enter 保存文件,再按 Ctrl+X 退出 nano

  5. 现在,使用 -d(detached,分离模式)标志在后台启动所有服务。

    docker compose up -d
  6. 所有服务可能需要一到两分钟才能初始化。你可以检查容器的状态以确保它们正在正常运行。

    docker compose ps

    你应该会看到所有三个服务(graylog_servergraylog_opensearchgraylog_mongodb)的状态为 Up

    NAME                 IMAGE                                 COMMAND                  SERVICE      CREATED              STATUS                        PORTS
    graylog_mongodb      mongo:6.0                             "docker-entrypoint.s…"   mongodb      About a minute ago   Up About a minute (healthy)   27017/tcp
    graylog_opensearch   opensearchproject/opensearch:2.13.0   "./opensearch-docker…"   opensearch   About a minute ago   Up About a minute (healthy)   9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp
    graylog_server       graylog/graylog:6.1                   "tini -- /docker-ent…"   graylog      About a minute ago   Up 34 seconds (healthy)       0.0.0.0:1514->1514/tcp, :::1514->1514/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:1514->1514/udp, :::9000->9000/tcp, :::1514->1514/udp, 0.0.0.0:12201->12201/tcp, 0.0.0.0:12201->12201/udp, :::12201->12201/tcp, :::12201->12201/udp

现在可以访问 Graylog Web 界面了。你已成功部署了 Graylog 堆栈,并准备好进行配置。

配置 Syslog 输入

Graylog 运行后,下一步是配置一个“Input”。Input 是告诉 Graylog 如何接收日志消息的一个组件。在本实验中,你将创建一个 Syslog UDP Input,这是从网络设备和 Linux/Unix 服务器收集日志的常用标准。

  1. 在浏览器中打开 Graylog Web 界面。你可以通过点击“Web Terminal”选项卡并选择“Desktop”来打开浏览器,或者使用实验环境中的专用浏览器图标。导航到以下 URL:

    http://127.0.0.1:9000

    Graylog web interface
  2. 使用默认凭据登录:

    • 用户名:admin
    • 密码:admin
  3. 登录后,你将创建新的 Input。在顶部导航栏中,点击 System,然后在下拉菜单中选择 Inputs

  4. 在 Inputs 页面,在“Select input”下拉列表中找到“Syslog UDP”输入类型,然后点击旁边的 Launch new input 按钮。

  5. 将出现一个模态窗口。填写以下详细信息来配置 Input:

    • Node: 从下拉列表中选择唯一可用的节点(它将是你的 Graylog 服务器)。
    • Title: Syslog UDP Input(这是你的 Input 的描述性名称)。
    • Bind address: 0.0.0.0(这告诉 Graylog 监听容器所有网络接口上的日志)。
    • Port: 1514(这是 Graylog 监听传入 syslog 消息的端口)。

    将所有其他设置保留为默认值,然后点击 Save

  6. 保存后,你将返回到 Inputs 页面。你的新“Syslog UDP Input”应出现在列表中,并显示绿色的“Running”状态,表示它已激活并准备好接收数据。

  7. 为了测试 Input,请返回你的终端,并使用 netcat (nc) 工具发送一个示例日志消息。此命令构建一个基本的 syslog 消息,并将其发送到本地机器的 UDP 端口 1514

    echo "<14>$(date +'%b %d %H:%M:%S') localhost labex: Test syslog message" | nc -w1 -u 127.0.0.1 1514

你现在已成功配置 Graylog 来接收日志。在下一步中,你将发送更结构化的日志,并学习如何在 Graylog 界面中查看它们。

发送和查看示例日志

现在你的 Syslog Input 已准备就绪,是时候生成并发送一批示例日志了。这将用数据填充 Graylog,使你能够练习搜索和分析。你将创建一个简单的 shell 脚本来模拟应用程序的日志消息。

  1. 首先,在终端中导航回你的项目根目录。

    cd /home/labex/project
  2. 使用 nano 编辑器创建一个名为 generate_logs.sh 的新 shell 脚本。

    nano generate_logs.sh
  3. 将以下脚本复制并粘贴到编辑器中。此脚本在循环中生成 10 条日志消息。每条消息都有一个随机的严重级别、一个时间戳和一个简单的消息正文。然后,它使用 nc 将每条日志发送到你配置的 Graylog Input。

    #!/bin/bash
    for i in {1..10}; do
      severity=$(((RANDOM % 8)))
      timestamp=$(date +'%b %d %H:%M:%S')
      echo "<$((severity + 8))>$timestamp localhost sample_app[$i]: Sample log message $i with severity $severity" | nc -w1 -u 127.0.0.1 1514
      echo "Sent log message $i"
      sleep 1
    done

    Ctrl+OEnterCtrl+X 保存并退出。

  4. 使用 chmod 命令使脚本可执行。

    chmod +x generate_logs.sh
  5. 运行脚本将日志发送到 Graylog。

    ./generate_logs.sh

    你将在终端中看到每条日志发送时的输出。

    Sent log message 1
    Sent log message 2
    ...
    Sent log message 10
  6. 现在,让我们在 Graylog 中查看这些日志。回到浏览器中的 Graylog Web 界面(http://127.0.0.1:9000)。

  7. 点击顶部导航栏中的 Search 选项卡。你应该会在“Messages”列表中看到你刚刚发送的日志消息。它们可能需要几秒钟才能被索引和显示。

    你可以看到 Graylog 如何自动解析消息,将其分解为 timestampsourceapplication_nameseverity 等字段。这种结构化数据是有效日志分析的关键。

查询和分析日志数据

随着日志流入 Graylog,你现在可以学习如何搜索和过滤它们。Graylog 的搜索功能非常强大,可以让你快速定位特定事件。这对于故障排除或调查安全事件至关重要。

  1. 在 Graylog Web 界面中转到 Search 页面。搜索栏位于页面顶部。

  2. 让我们从一个简单的查询开始。要查找来自你的模拟应用程序的所有日志,请在搜索栏中键入以下内容并按 Enter

    application_name:sample_app

    这将过滤结果,仅显示 application_name 字段精确等于 sample_app 的日志。

  3. 现在,尝试一些其他查询来探索不同的过滤功能:

    • 查找具有特定严重级别(例如,级别 4)的日志:
      severity:4
    • 查找严重级别大于 5 的日志(警告、错误等):
      severity:>5
    • 在日志消息中搜索短语:
      message:"log message 5"
    • 使用 AND 组合过滤器:
      application_name:sample_app AND severity:<3
  4. 你还可以控制搜索的时间范围。默认情况下,Graylog 显示“Last 5 minutes”的日志。点击搜索栏左侧的时间范围选择器,将其更改为 Last 30 minutes,以确保所有生成的日志都包含在搜索结果中。

  5. 要使常用查询易于访问,你可以将其保存。让我们保存一个用于高严重性事件的搜索。

    • 运行查询:severity:>4
    • 在搜索栏的右侧,点击软盘图标(Save Search)。
    • 在“Save Search”对话框中,输入一个 Title,例如 High Severity Events
    • 点击 Save

    你现在可以随时从左侧边栏的“Saved Searches”列表中访问此已保存的搜索,从而可以快速检查关键事件。

构建监控仪表板

虽然搜索页面非常适合主动调查,但仪表板可以让你一目了然地了解日志数据。在最后一步中,你将创建一个仪表板,其中包含多个小部件,用于可视化日志中的关键指标。

  1. 在 Graylog Web 界面中,从顶部菜单导航到 Dashboards 部分。

  2. 点击 Create dashboard 按钮。

    • 输入 TitleApplication Health Dashboard
    • 输入 DescriptionMonitors the health and activity of sample_app.
    • 点击 Create
  3. 现在你有一个空的仪表板。让我们向其中添加一些小部件。点击 Unlock / Edit 按钮进入编辑模式。

  4. **添加“Log Count”小部件:**此小部件将显示随时间推移的日志消息总数。

    • 点击 Create Widget for Dashboard
    • 选择 Aggregation 作为小部件类型。
    • 在配置窗口中:
      • TitleTotal Log Volume
      • 在“Rows”下,选择 timestamp 作为字段。
      • 选择 Bar Chart 作为可视化类型。
    • 点击 Create
  5. **添加“Severity Distribution”小部件:**此小部件将显示按严重级别划分的日志细分。

    • 再次点击 Create Widget for Dashboard
    • 选择 Aggregation 作为小部件类型。
    • 在配置窗口中:
      • TitleLog Severity Distribution
      • 在“Rows”下,选择 severity 作为字段。
      • 选择 Pie Chart 作为可视化类型。
    • 点击 Create
  6. **添加“Recent Messages”小部件:**此小部件将显示最近日志消息的列表。

    • 点击 Create Widget for Dashboard
    • 选择 Messages 作为小部件类型。
    • 在配置窗口中:
      • TitleRecent Log Messages
      • 在“Streams”字段中,确保选择了 All messages
    • 点击 Create
  7. 添加完小部件后,你可以通过拖放来排列布局。你还可以通过拖动其角落来调整它们的大小。以易于阅读的方式排列它们。

  8. 对布局满意后,点击右上角的 Lock / Save 按钮来保存你的仪表板。

你现在已经创建了一个基本的监控仪表板。在实际场景中,像这样的仪表板对于密切关注系统健康和安全态势非常有价值。

总结

在本实验中,你获得了使用 Graylog 进行日志管理和分析的核心功能的实践经验。你首先使用 Docker Compose 部署了一个完整的 Graylog 环境,其中包括 Graylog 服务器、OpenSearch 和 MongoDB。

然后,你配置了一个 Syslog input 来启用日志收集,并使用脚本发送了示例日志数据,模拟了真实世界的应用程序日志。你学习了如何使用 Graylog 强大的搜索和查询语言来过滤和查找日志中的特定信息。最后,你通过构建一个包含各种小部件的自定义仪表板来可视化日志指标,从而一目了然地了解系统活动,将所有内容整合在一起。这些技能为你将在网络安全监控和运营智能中使用 Graylog 打下了坚实的基础。