来自第弹性
介绍
了解组织生成的数百万条日志行可能是一个艰巨的挑战。 一方面,这些日志行提供了应用程序性能,服务器性能指标和安全性的视图。 另一方面,日志管理和分析可能非常耗时,这可能阻碍这些日益必要的服务的采用。
开源软件,如rsyslog现在 , Elasticsearch和Logstash提供传输,转换和存储日志数据的工具。
在本教程中,您将了解如何创建集中式rsyslog服务器以存储来自多个系统的日志文件,然后使用Logstash将它们发送到Elasticsearch服务器。 从那里,您可以决定如何最好地分析数据。
目标
本教程教您如何集中syslog生成或接收日志,特别是被称为变异rsyslog现在 。 Syslog和基于syslog的工具(如rsyslog)从内核和许多运行的程序收集重要信息,以保持UNIX类服务器运行。 由于syslog是一个标准,而不仅仅是一个程序,许多软件项目支持发送数据到syslog。 通过集中此数据,您可以更轻松地审核安全性,监控应用程序行为,并跟踪其他重要的服务器信息。
从集中式或聚合式rsyslog服务器,您可以将数据转发到Logstash,这可以进一步解析和丰富您的日志数据,然后将其发送到Elasticsearch。
本教程的最终目标是:
- 设置单个客户端(或转发)rsyslog服务器
- 设置单个服务器(或收集)rsyslog服务器,以从rsyslog客户端接收日志
- 设置Logstash实例以从rsyslog收集服务器接收消息
- 设置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的默认内存,所以保证了集中式服务器实例的大小相应地。
警告:DigitalOcean的专用网络期权授予第二个网络接口连接到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(在这种情况下,通过辅助接口在同一数据中心的服务器之间)中进行通信。
输出将类似于:
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地址,如下所示:
network.bind_host: private_ip_address
最后,重新启动Elasticsearch以启用更改。
sudo service elasticsearch restart
警告:这是非常重要的,你只允许您信任的连接到服务器Elasticsearch。 使用iptables的强烈推荐。 在本教程中,你只需要信任rsyslog现在服务器的Droplet,其中有Logstash在其上运行的私有IP地址。
第3步 - 配置中央服务器接收数据
在本节中,我们将配置rsyslog现在服务器Droplet能够接收端口514从其他系统日志服务器数据集中的服务器。
要配置rsyslog现在服务器接收来自其他系统日志服务器,编辑数据/etc/rsyslog.conf
对rsyslog现在服务器Droplet:
sudo nano /etc/rsyslog.conf
查找您已经注释掉这些行rsyslog.conf
:
# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
每个部分(第一行$ModLoad imudp
和$ModLoad imtcp
)加载imudp
和imtcp
分别模块。 该imudp
代表我 NPUT 米 odule UDP和imtcp
代表我 NPUT 中号 odule TCP。 这些模块侦听来自其他syslog服务器的传入数据。
每个部分(第二线$UDPSerververRun 514
和$TCPServerRun 514
)指示rsyslog现在应开始各自UDP和TCP服务器对这些协议监听端口514(其是系统日志缺省端口)。
要启用这些模块和服务器,请取消注释行,以使文件现在包含:
# 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:
*.* @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
将以下内容复制到文件,如下所示:
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希望接收消息的方式格式化消息。 这是他们会是什么样子:
{
"@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
将以下行复制到此文件:
# 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
:
# 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
你应该看到这样的:
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
您将在输出结束时在本地系统上看到安全日志。 它看起来类似于:
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将帮助你实现这一结果。