将 Conserver 日志传输到 Elasticsearch

作者:Fabien Wernli

如果您的组织在内部管理 Linux、AIX、HP-UX 或 Solaris 服务器,那么您的系统管理员很可能至少偶尔需要对这些设备进行底层访问。通常,管理员使用某种串行控制台——例如,传统的串行端口、Serial-over-LAN 或智能平台管理接口 (IPMI)。管理和审计控制台访问并非易事,因此许多组织依赖 Conserver 应用程序在通过串行控制台访问这些服务器时创建会话日志。这些日志可能出于各种原因很有用——例如,维护或故障排除(以回顾某些东西崩溃的原因)、安全(找出是谁做了什么——将连接的用户名与实际用户关联起来)或合规性(以提供详细的会话日志)。

本文涵盖以下内容

  • 如何使用 syslog-ng 开源版 (Balabit) 解析和处理串行控制台日志。

  • 如何将日志发送到 Elasticsearch (Elastic),以便获得完整、可搜索的控制台访问审计跟踪。

  • 如何使用 Riemann 将控制台日志集成到实时监控系统中。

Conserver

Conserver 是一款出色的软件,可让您管理基础设施的串行控制台,无论是旧式硬件串行端口还是最先进的 Serial-over-LAN (SOL) 基板。其分布式设计允许使用安全的 TLS 加密协议进行分散的用户体验。直接的工作流程包括用户连接到任何 conserver 主节点,然后主节点将流量转发到管理您要访问的控制台的节点。由于所有主节点共享相同的配置文件,因此使用配置管理(例如,使用我们在 CC-IN2P3 开发的 Puppet 模块)在服务器之间自动重新分配控制台(如果它们是虚拟 SOL 设备,如 IPMI)非常简单。

那么问题在哪里呢?就我们在国家核物理和粒子物理研究所计算中心 (CC-IN2P3) 而言,日志记录机制可以大大改进,因为 conserver 的设计现在相当古老。例如,它不支持记录到 syslog。从用户的角度来看,日志记录非常棒,因为您可以使用一个按键来访问控制台的日志,并且控制台日志包含完整的会话。但从架构的角度来看,情况并非如此,因为每个 conserver 主节点都将它管理的控制台的日志本地存储在一个文件中。

syslog-ng

这就是 syslog-ng 开源版发挥作用的地方。我们的想法是将 conserver 主节点的日志文件传输到我们最喜欢的事件存储后端,即 Riemann 和 Elasticsearch。它们分别提供强大的实时流处理和长期索引存储功能。此外,使用 syslog-ng,您可以直接将日志发送到 Riemann 和 Elasticsearch;无需任何额外的代理(如 Logstash)。要了解此系统在进入配置细节之前是如何工作的,请观看此视频

视频显示了用户在控制台中执行的操作(在屏幕的右上部分)、其对实时 Riemann-dash 仪表板(右下)的影响以及近实时 Elasticsearch 前端(左侧的 Kibana|Elastic)。

正如您所看到的,会话的用户活动和事件被传输到后端,包括有用的元数据,如 conserver.is_attached: true。这告诉您是否有人连接到控制台(在本例中显然是这种情况)。

要求

要创建演示视频中显示的系统,您需要以下软件

  • syslog-ng 开源版 3.7.2 或更高版本。

  • conserver(已使用 8.2.1 测试)。

  • Riemann(已使用 0.2.10 测试)。

  • Elasticsearch(已使用 1.6.0 测试)。

请注意,本文不涵盖如何安装、配置(一般而言)以及使上述软件正常工作。您可以在网上找到大量相关教程。如果您需要有关这些任务的帮助,请查看您需要帮助的软件的文档、邮件列表或在线论坛。本文的以下部分将解释如何配置此基础设施的组件,以满足我们场景的特定需求作为示例。

配置 Conserver

我们设置中的 conserver 配置没有什么特别之处。它创建了一个统一的日志文件,该文件将作为 conserver 和 syslog-ng 之间的粘合剂。您可以使用以下任一方法激活统一日志文件

1) 使用 -U /var/log/console.log 标志运行 conserver 可执行文件。

2) 在 conserver.cf 中使用以下配置块


<config * { unifiedlog * /var/log/console.log; }

您还可以设置服务器的通用日志文件(conserver 在其中存储与单个控制台无关的全局消息)——例如,设置为 /var/log/conserver.log

/var/log/conserver.log/var/log/console.log 都将是 syslog-ng 的输入。您可能需要特别注意这些文件的日志轮换。由于您正在将它们发送到 Elasticsearch,因此无需将它们保留太长时间。

配置 syslog-ng 开源版

您需要在每个 conserver 主节点和中央主机(即您的日志服务器)上本地安装 syslog-ng,中央主机将收集来自 conserver 主机的所有事件。本地实例将解析、处理和丰富控制台输出,而中央主机将收集它们并将它们发送到两个后端系统 Riemann 和 Elasticsearch。请注意,您可以使用仅本地实例获得相同的结果,但大多数人出于各种原因更喜欢首先集中化。

在 Conserver 主机上配置 syslog-ng

以下是在 conserver 主机上运行 syslog-ng 的示例配置文件。正如您所看到的,它有三个来源

  • s_internal 跟踪 syslog-ng 的内部消息(对于故障排除非常方便,仅在本地存储)。

  • s_console 读取单个控制台的日志。

  • s_conserver 读取 conserver 主节点的全局消息。

s_consoles_conserver 源处理 conserver 的统一日志文件。由于控制台和 conserver 消息的格式不同,我们必须配置 syslog-ng 以不同的方式解析它们,然后将它们转发到中央 syslog-ng 服务器(您可以根据需要为您的环境添加任何其他来源)


@version: 3.7

@include scl.conf

options {
    threaded(yes);
};

source s_conserver {
  channel {
    source {
      file(
        '/var/log/conserver.log',
        flags(no-parse)
      );
    };
    parser {
      csv-parser(
        columns(tmp.date,PROGRAM,PID,MESSAGE)
        delimiters(' :')
        quote-pairs('[]()')
        flags(greedy)
      );
    };
    rewrite {
      set('$(strip $MESSAGE)', value(MESSAGE));
    };
  };
};

source s_console {
  channel {
    source {
      file('/var/log/console.log');
    };
    junction {
      channel {
        filter{
          program('\*/div>);
        };
        rewrite {
          subst('\*/div>, '', value(PROGRAM));
          set(
            'true',
            value('.SDATA.console.is_attached')
          );
        };
        flags(final);
      };
      channel {
        rewrite {
          set(
            'false',
            value('.SDATA.console.is_attached')
          );
        };
        flags(fallback);
      };
    };
    rewrite {
      set('$PROGRAM', value(HOST));
      set('console', value(PROGRAM));
    };
  };
};

source s_internal {
  internal();
};

destination d_remote {
  network(
      "",
      transport(tcp),
      port(514),
      flags(syslog-protocol)
  );
};

destination d_internal {
  file("/var/log/syslog-ng.log");
};

log {
  source(s_console);
  source(s_conserver);
  destination(d_remote);
};

log {
  source(s_internal);
  destination(d_internal);
};

全局 Conserver 日志—s_conserver

如果您不熟悉 syslog-ng,则 s_conservers_console 部分可能有点吓人。为了更好地理解它们的工作原理,请查看 conserver 生成的示例消息


[Thu Sep  3 22:29:52 2015] conserver (13550): 
 ↪[node42] automatic reinitialization

相关的源定义包含三个块

  1. source:文件路径和 no-parse 标志,它告诉 syslog-ng 读取日志文件,但不解析它,作为 syslog 消息(因为它不完全是 syslog 格式)。

  2. parsercsv-parser 在冒号 (:) 处拆分消息,并提取以下字段:tmp.datePROGRAMPIDMESSAGE。解析器的其他选项确保正确解析字段值。

  3. rewrite:定义重写规则以删除 MESSAGE 键的开头和结尾空格。(如果您找到使用 2. 省略此点的方法,请告诉我。)

此配置将上面的示例消息解析为以下结构化数据


tmp.date: Thu Sep  3 22:29:52 2015
PROGRAM: conserver
PID: 13550
MESSAGE: [node42] automatic reinitialization

控制台日志—s_console

以下是来自两个不同控制台的两个示例消息


node03: ACPI: No handler for Region [POWR] 
 ↪(ffff8808248bb150) [IPMI]

node66*: node66 login: root

第一个是无人值守的消息,可能是由 ACPI 信号产生的。第二个,顾名思义,由附加到控制台的人员(使用 console node66)生成的消息,控制台名称后附加了 *(星号)字符。我们将使用此提示来生成额外的元数据。源再次由三个部分组成

  1. source:文件路径,这次没有标志。这样,syslog-ng 将尝试使用符号模式 %{PROGRAM}: %{MESSAGE} 解析消息。因此,node03node66* 将被解析为 PROGRAM 键。

  2. junction:一个构造,带有两个互斥的(因此有 finalfallback 标志)通道(类似于 Python 中的 try: except 结构)。这两个通道对应于示例中的两种情况:第一个通道用于有人连接到控制台时的消息(因此,PROGRAM 字段包含星号字符),第二个通道用于没有任何人连接时的消息。为了轻松区分一种情况与另一种情况(例如,在 Elasticsearch 中查看消息时),此信息存储在 .SDATA.console.is_attached 键中。

  3. rewrite:重写 PROGRAMHOST 字段为它们的合理内容:console 和控制台的名称。

因此,在上面的示例中,消息被解析为以下结构化数据


PROGRAM: console
HOST: node03
MESSAGE: ACPI: No handler for Region [POWR] 
 ↪(ffff8808248bb150) [IPMI]
.SDATA.console.is_attached: false

PROGRAM: console
HOST: node66
MESSAGE: node66 login: root
.SDATA.console.is_attached: true

将日志转发到中央 syslog-ng 服务器,d_remote

syslog-ng 配置的其余部分很简单:我们只是使用 syslog IETF RFC5424 协议(因此有 syslog-protocol 标志)将结构化负载发送到中央 syslog-ng 服务器。所有 RFC5424 键,包括 .SDATA.*,都会自动发送到中央 syslog-ng 服务器。我们从 conserver 日志中解析的唯一未传输到中央服务器的部分是 tmp.date 字段。相反,我们将使用 syslog-ng 处理消息的时间(这对于当前日志来说是一个很好的近似值)。如果您绝对想要使用来自 tmp.date 的值(例如,因为您想要将旧的 conserver 日志发送到远程服务器),您可以使用 syslog-ng-incubator 项目中的日期解析器。

在中央日志服务器上配置 syslog-ng

在中央 syslog-ng 服务器上,我们必须将从 conserver 主机接收的控制台和 conserver 消息路由到 Riemann 和 Elasticsearch 后端。以下 syslog-ng 配置完全实现了这一点;唯一的调整是它删除了字段中的 .SDATA. 前缀,因此它们更易于阅读


@version: 3.7

@include scl.conf

options {
  threaded(yes);
};

block destination realtime (
  host()
  port(5555)
  type("udp")
  throttle(0)
  flush-lines(1)
)
{
  riemann(
    flush-lines(`flush-lines`)
    throttle(`throttle`)
    server(`host`)
    port(`port`)
    type(`type`)
    ttl("${ttl:-300}")
    host("$HOST")
    description("$MESSAGE")
    attributes(
      scope(all-nv-pairs)
      key(".SDATA.*"
        rekey( shift(7) )
      )
    )
  );
};

source s_remote_tcp {
  channel {
    source {
      network(
        transport(tcp)
        port(514)
        flags(syslog-protocol)
        tags("syslog")
        so-rcvbuf(8388608)
      );
    };
  };
};

source s_internal {
  internal();
};

destination d_elasticsearch {
  elasticsearch(
    index("syslog-${YEAR}.${MONTH}.${DAY}"),
    type("syslog"),
    flush-limit(1),
    template("$(format-json -s all-nv-pairs --rekey 
     ↪.SDATA.* --shift 7 --key ISODATE)")
    cluster("elasticsearch")
    port(9300)
    server("localhost")
    client_mode("transport")
    time-zone("UTC")
  );
};

destination d_internal {
  file("/var/log/syslog-ng.log");
};

destination d_riemann {
  realtime(
    host("riemann"),
  );
};

log {
  source(s_remote_tcp);
  destination(d_riemann);
  destination(d_elasticsearch);
};

log {
  source(s_internal);
  destination(d_internal);
};
结论

从本文中,您学习了如何创建一个系统,该系统允许您实时查看串行控制台日志,并使它们可以在现代用户界面上进行自由文本搜索。这对于维护和故障排除目的以及满足审计和合规性要求非常有用。为了实现这些目标,可以将 conserver 与 Riemann 和 Elasticsearch 集成。为了集成这些服务,您可以使用 syslog-ng 开源版,这是一款灵活的日志收集和处理应用程序,可以收集和解析日志消息并将它们转发到 Riemann Elasticsearch 后端。

改进

syslog-ng 应用程序非常灵活,并具有强大的消息处理功能。如果您稍微了解一下它的可能性,您可以找到几种方法来改进本文中描述的配置。以下是您可以使用 syslog-ng 执行的一些想法

  • 编写更智能的解析器以从服务器消息(如果可用)中提取控制台名称。

  • 关联控制台消息和服务器消息,从服务器消息中提取用户名,并将它们添加到控制台消息中。这样,控制台事件就包含附加用户的名称,这使得故障排除和审计更容易。

  • 为连接时间过长的控制台配置警报。

  • 使用来自 syslog-ng incubator 项目的日期解析器来使用 conserver 添加到消息的时间戳。

有用的 syslog-ng 功能

syslog-ng 开源版应用程序是一个 syslog 守护程序,允许您收集日志数据以及更多功能——例如

  • 灵活地收集、解析、分类和关联来自各种来源的日志。

  • 将日志数据发送到消息队列,包括 AMQP、STOMP 或 Apache Kafka。

  • 将您的日志数据存储在纯文本文件、HDFS、SQL 数据库或 MongoDB 中。

  • 将您的日志数据转发到监控工具,如 Riemann、Redis 或 Graphite。

  • 处理 CSV、JSON 或纯文本消息。

  • 重写、重新格式化和转换您的日志消息。

  • 您可以使用 C、Java 或 Python 编写自己的模块。

使用 Riemann 进行实时监控

Riemann 帮助您监控分布式系统。它聚合来自您的服务器和应用程序的事件,并允许您使用强大的流处理语言组合和处理这些事件。您可以查询事件并在仪表板上可视化这些查询的结果。为了及时获得通知,您还可以触发警报(例如,通过电子邮件或短信)。由于客户端主动将数据推送到 Riemann 中,因此您的仪表板会显示最新的信息(与其他每隔几分钟才拉取事件数据的系统相比)。如果您使用集成的 WebSocket 服务器,您甚至可以实现完全同步的事件处理,从事件源一直到浏览器。

资源

演示视频:https://webcast.in2p3.fr/videos-syslog_ng_conserver

Conserver:http://www.conserver.com

Serial-over-LAN (SOL):https://en.wikipedia.org/wiki/Serial_over_LAN

智能平台管理接口 (IPMI):https://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface

CC-IN2P3 开发的 Conserver Puppet 模块:http://github.com/ccin2p3/puppet-conserver

CC-IN2P3:http://cc.in2p3.fr

使用按键访问 Conserver 日志:http://conserver.com/docs/console.man.html

syslog-ng 开源版:http://www.syslog-ng.org

Riemann:http://riemann.io

Elasticsearch:https://elastic.ac.cn/products/elasticsearch

Riemann-dash:http://riemann.io/dashboard.html

Kibana:https://elastic.ac.cn/products/kibana

syslog IETF RFC5424 协议:https://tools.ietf.org/html/rfc5424

来自 syslog-ng-incubator 项目的日期解析器:https://github.com/balabit/syslog-ng-incubator/tree/master/modules/date

在 syslog-ng 中使用关联:https://www.balabit.com/sites/default/files/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/patterndb-correlation.html

为连接时间过长的控制台发出警报:https://www.balabit.com/sites/default/files/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/patterndb-actions-correlation.html

Fabien Wernli(GitHub、Twitter 和 Freenode 上的 faxm0dem/faxmodem)在国家核物理和粒子物理研究所计算中心 (CC-IN2P3) 管理 Linux 集群已有 15 年。除其他外,他是性能数据监控和基础设施管理方面的专家。

加载 Disqus 评论