如何集中使用rsyslog现在,Logstash和Elasticsearch日志在Ubuntu 14.04

rsyslog现在,Elasticsearch和Logstash提供传输,转换和存储日志数据的工具。在本教程中,您将学习如何创建一个集中的服务器rsyslog现在存储日志从多个系统文件,然后使用Logstash送他们到Elasticsearch服务器。从那里,你可以决定如何最好地分析数据。

来自第弹性

介绍

了解组织生成的数百万条日志行可能是一个艰巨的挑战。 一方面,这些日志行提供了应用程序性能,服务器性能指标和安全性的视图。 另一方面,日志管理和分析可能非常耗时,这可能阻碍这些日益必要的服务的采用。

开源软件,如rsyslog现在ElasticsearchLogstash提供传输,转换和存储日志数据的工具。

在本教程中,您将了解如何创建集中式rsyslog服务器以存储来自多个系统的日志文件,然后使用Logstash将它们发送到Elasticsearch服务器。 从那里,您可以决定如何最好地分析数据。

目标

本教程教您如何集中syslog生成或接收日志,特别是被称为变异rsyslog现在 Syslog和基于syslog的工具(如rsyslog)从内核和许多运行的程序收集重要信息,以保持UNIX类服务器运行。 由于syslog是一个标准,而不仅仅是一个程序,许多软件项目支持发送数据到syslog。 通过集中此数据,您可以更轻松地审核安全性,监控应用程序行为,并跟踪其他重要的服务器信息。

从集中式或聚合式rsyslog服务器,您可以将数据转发到Logstash,这可以进一步解析和丰富您的日志数据,然后将其发送到Elasticsearch。

本教程的最终目标是:

  1. 设置单个客户端(或转发)rsyslog服务器
  2. 设置单个服务器(或收集)rsyslog服务器,以从rsyslog客户端接收日志
  3. 设置Logstash实例以从rsyslog收集服务器接收消息
  4. 设置Elasticsearch服务器以从Logstash接收数据

先决条件

同DigitalOcean的数据中心 ,创建启用专用网络下列Droplet:

  • Ubuntu的14.04Droplet名为rsyslog现在的客户端
  • Ubuntu的14.04Droplet(1 GB或更大)命名rsyslog现在服务器集中的地方日志将被保存,Logstash将被安装
  • Ubuntu的14.04Droplet与Elasticsearch从安装如何在Ubuntu 14.04安装和配置Elasticsearch

您还需要使用sudo权限为每个服务器的非root用户。 初始服务器设置与Ubuntu 14.04将介绍如何设置起来。

注:为了最大限度地提高性能,Logstash会尝试分配1G的默认内存,所以保证了集中式服务器实例的大小相应地。

警告:Dig​​italOcean的专用网络期权授予第二个网络接口连接到VPS,这是只有在同一数据中心提供给其他的VPS -包括其他客户的的VPS在同一数据中心。 这被称为共享私有网络。 为了模拟真实的专用网络,则需要按照说明用iptables 本教程

请参阅如何设置和使用DigitalOcean专用网络的帮助扶持专用网络,同时创造Droplet。

如果你创建了无Droplet专用网络,请参阅如何在现有的Droplet启用DigitalOcean专用网络

第1步 - 确定私有IP地址

在本节中,您将确定哪些专用IP地址分配给每个Droplet。 通过本教程将需要此信息。

在每个Droplet,找到了它的IP地址ifconfig命令:

sudo ifconfig -a

-a选项用于显示所有接口。 主以太网接口通常被称为eth0 在这种情况下,然而,我们想要的IP来自eth1私有 IP地址。 这些专用IP地址不能通过Internet路由,并用于在专用LAN(在这种情况下,通过辅助接口在同一数据中心的服务器之间)中进行通信。

输出将类似于:

从ifconfig -a输出
eth0      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:01  
          inet addr:123.456.78.90  Bcast:123.456.78.255  Mask:255.255.255.0
          inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:168 errors:0 dropped:0 overruns:0 frame:0
          TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)

eth1      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:02  
          inet addr:10.128.2.25  Bcast:10.128.255.255  Mask:255.255.0.0
          inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

这里要注意的部分eth1和内inet addr 在这种情况下,在专用网络地址是10.128.2.25。 此地址只能从启用了专用网络的同一区域内的其他服务器访问。

确保为所有3个Droplet重复此步骤。 将这些私有IP地址保存在安全的地方。 它们将在本教程中使用。

第2步 - 设置Elasticsearch的绑定地址

作为先决条件的一部分,您可以在其自己的Droplet上设置Elasticsearch。 如何安装和配置Elasticsearch在Ubuntu 14.04教程介绍了如何设置绑定地址到localhost ,以便其他服务器无法访问该服务。 但是,我们需要更改此选项,Logstash可以通过其私有网络地址发送数据。

我们将结合Elasticsearch它的私有IP地址。Elasticsearch只会监听请求该IP地址。

在Elasticsearch服务器上,编辑配置文件:

sudo nano /etc/elasticsearch/elasticsearch.yml

找到包含行network.bind_host 如果它被注释掉,通过删除其注释#在该行的开头字符。 将值更改为Elasticsearch服务器的专用IP地址,如下所示:

/etc/elasticsearch/elasticsearch.yml
network.bind_host: private_ip_address

最后,重新启动Elasticsearch以启用更改。

sudo service elasticsearch restart

警告:这是非常重要的,你只允许您信任的连接到服务器Elasticsearch。 使用iptables的强烈推荐。 在本教程中,你只需要信任rsyslog现在服务器的Droplet,其中有Logstash在其上运行的私有IP地址。

第3步 - 配置中央服务器接收数据

在本节中,我们将配置rsyslog现在服务器Droplet能够接收端口514从其他系统日志服务器数据集中的服务器。

要配置rsyslog现在服务器接收来自其他系统日志服务器,编辑数据/etc/rsyslog.confrsyslog现在服务器Droplet:

sudo nano /etc/rsyslog.conf

查找您已经注释掉这些行rsyslog.conf

/etc/rsyslog.conf
# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

每个部分(第一行$ModLoad imudp$ModLoad imtcp )加载imudpimtcp分别模块。 imudp代表 NPUT odule UDPimtcp代表 NPUT 中号 odule TCP。 这些模块侦听来自其他syslog服务器的传入数据。

每个部分(第二线$UDPSerververRun 514$TCPServerRun 514 )指示rsyslog现在应开始各自UDP和TCP服务器对这些协议监听端口514(其是系统日志缺省端口)。

要启用这些模块和服务器,请取消注释行,以使文件现在包含:

/etc/rsyslog.conf
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

保存并关闭rsyslog配置文件。

通过运行以下命令重新启动rsyslog:

sudo service rsyslog restart

您的集中式rsyslog服务器现在配置为侦听来自远程syslog(包括rsyslog)实例的消息。

提示:要验证rsyslog现在的配置文件,您可以运行sudo rsyslogd -N1命令。

第4步 - 配置rsyslog远程发送数据

在本节中,我们将配置rsyslog现在,客户端的日志数据发送到我们在上一步骤中配置的ryslog服务器Droplet。

在Ubuntu的默认设置rsyslog现在,你会发现两个文件/etc/rsyslog.d

  • 20-ufw.conf
  • 50-default.conf

rsyslog现在的客户端 ,编辑默认配置文件:

sudo nano /etc/rsyslog.d/50-default.conf

添加下面一行在之前的文件顶部log by facility部分,更换private_ip_of_ryslog_server中央服务器的私有 IP:

/etc/rsyslog.d/50-default.conf
*.*                         @private_ip_of_ryslog_server:514

保存并退出文件。

(。)的第一部分是指我们要发送的所有消息。 虽然它不在本教程的范围内,但您可以将rsyslog配置为仅发送特定消息。 该行的其余部分说明如何发送数据和发送数据的位置。 在我们的例子中, @的IP地址之前符号告诉rsyslog现在使用UDP发送消息。 更改为@@使用TCP。 这之后是rsyslog现在服务器具有安装在其上rsyslog现在和Logstash的私有IP地址。 冒号后面的数字是要使用的端口号。

重新启动rsyslog以启用更改:

sudo service rsyslog restart

恭喜! 您现在正在将您的系统日志消息发送到集中式服务器!

提示:要验证rsyslog现在的配置文件,您可以运行sudo rsyslogd -N1命令。

第5步 - 将日志数据格式化为JSON

Elasticsearch要求它接收的所有文档都是JSON格式,rsyslog提供了一种通过模板实现这一点的方法。

在此步骤中,我们将配置集中式rsyslog服务器以使用JSON模板格式化日志数据,然后将其发送到Logstash,然后将其发送到其他服务器上的Elasticsearch。

背面rsyslog现在服务器的服务器上,创建一个新的配置文件发送给Logstash之前消息成JSON格式格式:

sudo nano /etc/rsyslog.d/01-json-template.conf

将以下内容复制到文件,如下所示:

/etc/rsyslog.d/01-json-template.conf
template(name="json-template"
  type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"@version\":\"1")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"programname\":\"") property(name="programname")
      constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\"}\n")
}

除了第一个和最后一个,注意这个模板生成的行在它们的开头有一个逗号。 这是维持JSON结构将有助于确保文件被整齐地排队了一切可读。 此模板按照Elasticsearch和Logstash希望接收消息的方式格式化消息。 这是他们会是什么样子:

JSON消息示例
{
  "@timestamp" : "2015-11-18T18:45:00Z",
  "@version" : "1",
  "message" : "Your syslog message here",
  "sysloghost" : "hostname.example.com",
  "severity" : "info",
  "facility" : "daemon",
  "programname" : "my_program",
  "procid" : "1234"
}

提示: rsyslog.com文档显示可从rsyslog现在变量,如果你想定制的日志数据。 但是,必须以JSON格式将其发送到Logstash,然后发送到Elasticsearch。

正在发送的数据尚未使用此格式。 下一步显示配置服务器以使用此模板文件。

第6步 - 配置集中式服务器发送到Logstash

现在我们有了定义正确JSON格式的模板文件,让我们配置集中式rsyslog服务器将数据发送到Logstash,这是在本教程的同一Droplet。

在启动时,rsyslog现在将寻找通过文件/etc/rsyslog.d ,并从中创建它的配置。 让我们添加我们自己的配置文件来扩展配置。

rsyslog现在的服务器 ,创建/etc/rsyslog.d/60-output.conf

sudo nano /etc/rsyslog.d/60-output.conf

将以下行复制到此文件:

/etc/rsyslog.d/60-output.conf
# This line sends all lines to defined IP address at port 10514,
# using the "json-template" format template

*.*                         @private_ip_logstash:10514;json-template

*.*在开始装置来处理所有的日志消息的行的其余部分。 @符号表示使用UDP(用@@改为使用TCP)。 后的IP地址或主机名@就是转发消息。 在我们的例子中,我们使用了rsyslog现在服务器的私有IP地址,因为rsyslog现在集中式服务器和Logstash服务器安装在Droplet的同时, 这必须在配置Logstash在下一步侦听私有IP地址相匹配。

接下来是端口号。 本教程使用端口10514.请注意,Logstash服务器必须使用相同的协议在同一端口上侦听。 最后一部分是我们的模板文件,显示如何在传递数据之前对数据进行格式化。

不要重新启动rsyslog。 首先,我们必须配置Logstash来接收消息。

第7步 - 将Logstash配置为接收JSON消息

在此步骤中,您将安装Logstash,将其配置为从rsyslog接收JSON消息,并将其配置为将JSON消息发送到Elasticsearch。

Logstash需要Java 7或更高版本。 使用从第1步中的说明Elasticsearch教程上的rsyslog现在服务器Droplet安装Java 7或8。

接下来,安装Logstash存储库的安全密钥:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

库定义添加到您/etc/apt/sources.list文件中:

echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

注意:使用echo上述添加Logstash库的方法。 不要使用add-apt-repository ,因为这将增加deb-src条目,但是弹性不提供源代码包。 这将导致一个错误,当你试图运行apt-get update

更新软件包列表以包括Logstash存储库:

sudo apt-get update

最后,安装Logstash:

sudo apt-get install logstash

现在Logstash已安装,让我们将其配置为侦听来自rsyslog的消息。

Logstash的默认安装会在配置文件/etc/logstash/conf.d 编辑主配置文件:

sudo nano /etc/logstash/conf.d/logstash.conf

然后,添加这些行/etc/logstash/conf.d/logstash.conf

/ etc / logstash / conf.d / logstash.conf`
# This input block will listen on port 10514 for logs to come in.
# host should be an IP on the Logstash server.
# codec => "json" indicates that we expect the lines we're receiving to be in JSON format
# type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.

input {
  udp {
    host => "logstash_private_ip"
    port => 10514
    codec => "json"
    type => "rsyslog"
  }
}

# This is an empty filter block.  You can later add other filters here to further process
# your log lines

filter { }

# This output block will send all events of type "rsyslog" to Elasticsearch at the configured
# host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"

output {
  if [type] == "rsyslog" {
    elasticsearch {
      hosts => [ "elasticsearch_private_ip:9200" ]
    }
  }
}

根据定义,syslog协议是UDP,因此此配置反映该标准。

在输入块,通过与rsyslog现在服务器的私有IP地址,其中也有安装在其上Logstash更换logstash 私有 IP设置Logstash主机地址。

输入块配置Logstash为侦听端口10514 ,所以它不会通过syslog实例在同一台机器上进行竞争。 小于1024的端口将需要以root身份运行Logstash,这不是一个好的安全实践。

一定要与您的ElasticsearchDroplet的私有IP地址来替换elasticsearch 私有 IP。 输出块显示了一个简单的条件配置。 它的对象是只允许匹配事件通过。 在这种情况下,这只是具有“类型”为“rsyslog”的事件。

测试Logstash配置更改:

sudo service logstash configtest

它应该显示Configuration OK如果没有语法错误。 否则,请尝试并读取错误输出,以查看您的Logstash配置有什么问题。

当所有这些步骤完成后,您可以通过运行以下命令启动Logstash实例:

sudo service logstash start

也在同一服务器上重新启动rsyslog,因为它有一个Logstash实例以转发到现在:

sudo service rsyslog restart

要验证Logstash正在侦听端口10514:

netstat -na | grep 10514

你应该看到这样的:

netstat的输出
udp6       0      0 10.128.33.68:10514     :::*  

你会看到rsyslog现在服务器的私有IP地址,我们使用的是侦听rsyslog现在数据10514的端口号。

提示:要解决Logstash,停止该服务与sudo service logstash stop ,并在详细消息前台运行它:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --verbose

它将包含常见的信息,如验证IP地址和UDP端口Logstash正在使用:

Starting UDP listener {:address=>"10.128.33.68:10514", :level=>:info}

第8步 - 验证Elasticsearch输入

之前,我们配置Elasticsearch来侦听其私有IP地址。 它现在应该从Logstash接收消息。 在此步骤中,我们将验证Elasticsearch是否正在接收日志数据。

所述rsyslog现在客户端rsyslog现在-服务器Droplet应所有的日志数据发送到Logstash,然后沿对Elasticsearch通过。 让我们生成一个安全消息,以验证Elasticsearch确实正在接收这些消息。

rsyslog现在的客户端 ,执行以下命令:

sudo tail /var/log/auth.log

您将在输出结束时在本地系统上看到安全日志。 它看起来类似于:

尾的输出/var/log/auth.log
May  2 16:43:15 rsyslog-client sudo:    sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May  2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)

通过一个简单的查询,您可以检查Elasticsearch:

在Elasticsearch服务器或允许访问它的任何系统上运行以下命令。 与Elasticsearch服务器的私有IP地址替换elasticsearch_ip。 此IP地址也必须是您在本教程前面配置的Elasticsearch侦听的IP地址。

curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'

在输出中,您将看到类似于以下内容的内容:

卷曲输出
{
      "_index" : "logstash-2016.05.04",
      "_type" : "rsyslog",
      "_id" : "AVR8fpR-e6FP4Elp89Ww",
      "_score" : 1.0,
      "_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":"    sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
    },

注意,生成该rsyslog现在消息Droplet的名称是在日志(rsyslog现在客户机 )。

通过这个简单的验证步骤,您的集中式rsyslog设置是完整和完全可操作的!

结论

您的日志现在在Elasticsearch中。 下一步是什么? 考虑什么读了Kibana可以做可视化你Elasticsearch有数据,包括线和柱状图,饼状图,地图,以及更多。 如何使用Logstash和Kibana集中日志在Ubuntu 14.04介绍如何使用Kibana Web界面以搜索和可视化日志。

也许你的数据将更有价值与进一步的解析和标记化。 如果是这样,那么学习更多关于Logstash将帮助你实现这一结果。