将 Conserver 日志传输到 Elasticsearch
如果您的组织在内部管理 Linux、AIX、HP-UX 或 Solaris 服务器,那么您的系统管理员很可能至少偶尔需要对这些设备进行底层访问。通常,管理员使用某种串行控制台——例如,传统的串行端口、Serial-over-LAN 或智能平台管理接口 (IPMI)。管理和审计控制台访问并非易事,因此许多组织依赖 Conserver 应用程序在通过串行控制台访问这些服务器时创建会话日志。这些日志可能出于各种原因很有用——例如,维护或故障排除(以回顾某些东西崩溃的原因)、安全(找出是谁做了什么——将连接的用户名与实际用户关联起来)或合规性(以提供详细的会话日志)。
本文涵盖以下内容
-
如何使用 syslog-ng 开源版 (Balabit) 解析和处理串行控制台日志。
-
如何将日志发送到 Elasticsearch (Elastic),以便获得完整、可搜索的控制台访问审计跟踪。
-
如何使用 Riemann 将控制台日志集成到实时监控系统中。
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,因此无需将它们保留太长时间。
您需要在每个 conserver 主节点和中央主机(即您的日志服务器)上本地安装 syslog-ng,中央主机将收集来自 conserver 主机的所有事件。本地实例将解析、处理和丰富控制台输出,而中央主机将收集它们并将它们发送到两个后端系统 Riemann 和 Elasticsearch。请注意,您可以使用仅本地实例获得相同的结果,但大多数人出于各种原因更喜欢首先集中化。
在 Conserver 主机上配置 syslog-ng
以下是在 conserver 主机上运行 syslog-ng 的示例配置文件。正如您所看到的,它有三个来源
-
s_internal
跟踪 syslog-ng 的内部消息(对于故障排除非常方便,仅在本地存储)。 -
s_console
读取单个控制台的日志。 -
s_conserver
读取 conserver 主节点的全局消息。
s_console
和 s_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_conserver
和 s_console
部分可能有点吓人。为了更好地理解它们的工作原理,请查看 conserver 生成的示例消息
[Thu Sep 3 22:29:52 2015] conserver (13550):
↪[node42] automatic reinitialization
相关的源定义包含三个块
-
source
:文件路径和no-parse
标志,它告诉 syslog-ng 读取日志文件,但不解析它,作为 syslog 消息(因为它不完全是 syslog 格式)。 -
parser
:csv-parser
在冒号 (:) 处拆分消息,并提取以下字段:tmp.date
、PROGRAM
、PID
和MESSAGE
。解析器的其他选项确保正确解析字段值。 -
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
)生成的消息,控制台名称后附加了 *(星号)字符。我们将使用此提示来生成额外的元数据。源再次由三个部分组成
-
source
:文件路径,这次没有标志。这样,syslog-ng 将尝试使用符号模式%{PROGRAM}: %{MESSAGE}
解析消息。因此,node03
和node66*
将被解析为PROGRAM
键。 -
junction
:一个构造,带有两个互斥的(因此有final
和fallback
标志)通道(类似于 Python 中的 try: except 结构)。这两个通道对应于示例中的两种情况:第一个通道用于有人连接到控制台时的消息(因此,PROGRAM
字段包含星号字符),第二个通道用于没有任何人连接时的消息。为了轻松区分一种情况与另一种情况(例如,在 Elasticsearch 中查看消息时),此信息存储在.SDATA.console.is_attached
键中。 -
rewrite
:重写PROGRAM
和HOST
字段为它们的合理内容: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 守护程序,允许您收集日志数据以及更多功能——例如
-
灵活地收集、解析、分类和关联来自各种来源的日志。
-
将日志数据发送到消息队列,包括 AMQP、STOMP 或 Apache Kafka。
-
将您的日志数据存储在纯文本文件、HDFS、SQL 数据库或 MongoDB 中。
-
将您的日志数据转发到监控工具,如 Riemann、Redis 或 Graphite。
-
处理 CSV、JSON 或纯文本消息。
-
重写、重新格式化和转换您的日志消息。
-
您可以使用 C、Java 或 Python 编写自己的模块。
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