如何在Ubuntu 16.04上设置ELK堆栈以集中日志

时间:2020-03-05 15:32:42  来源:igfitidea点击:

ELK堆栈由用于集中数据的Elasticsearch,Logstash和Kibana组成。
ELK主要用于IT环境中的日志分析。
ELK堆栈可让我们始终轻松地搜索和分析大量数据以做出实时决策,从而变得更加轻松快捷。

在开始安装ELK堆栈之前,请检查Ubuntu服务器的LSB版本。

# lsb_release -a

1.安装Java

elasticsearch和logstash的要求是首先安装Java。
由于elasticsearch建议,我们将安装Oracle java。
但是,它也可以与OpenJDK一起使用。

将Oracle Java PPA添加到apt:

# sudo add-apt-repository -y ppa:webupd8team/java

更新apt数据库

# sudo apt-get update

现在,使用以下命令安装Oracle Java 8的最新稳定版本。

# sudo apt-get -y install oracle-java8-installer

已安装Java 8,使用命令java -version检查Java的版本

2.安装Elasticsearch

要安装Elasticsearch,首先将其公共GPG密钥导入apt数据库。
运行以下命令以将Elasticsearch公共GPG密钥导入apt

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

现在创建Elasticsearch源列表

# echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

更新apt数据库

# sudo apt-get update

现在使用以下命令安装Elasticsearch

# sudo apt-get -y install elasticsearch

接下来编辑elasticsearch配置文件

# sudo vi /etc/elasticsearch/elasticsearch.yml

要限制外部对Elasticsearch实例(端口9200)的访问,请取消注释表示network.host的行,并将其值替换为“ localhost”。

network.host: localhost

现在开始Elasticsearch

# sudo service elasticsearch restart

要在启动时启动Elasticsearch,请执行以下命令。

# sudo update-rc.d elasticsearch defaults 95 10

使用以下命令测试elasticsearch。

# curl localhost:9200

3.安装logstash

创建Logstash源列表。
我们已经导入了公钥,因为logstash和elasticsearch来自同一存储库。

# wget https://download.elastic.co/logstash/logstash/packages/debian/logstash_2.3.4-1_all.deb
# dpkg -i logstash_2.3.4-1_all.deb
# sudo update-rc.d logstash defaults 97 8
# sudo service logstash start

要检查logstash的状态,请在终端中执行以下命令。

# sudo service logstash status

我们可能会发现logstash已处于活动状态,但是无法使用service或者systemctl命令正确停止/重新启动logstash。
在这种情况下,我们必须自己配置systemd logstash守护程序脚本。
首先,备份/etc/init.d/和/etc/systemd/system中的logstash启动脚本,然后从那里删除它。
现在,从https://github.com/elastic/logstash/issues/3606安装此“ pleaserun”脚本。
安装此脚本的准备工作是ruby。

安装Ruby

# sudo apt install ruby

现在安装请运行gem

# gem install pleaserun

现在,我们可以为logstash创建systmd守护程序文件了。
使用以下命令执行此操作。

# pleaserun -p systemd -v default --install /opt/logstash/bin/logstash agent -f /etc/logstash/logstash.conf

现在已经创建了logstash的systemd守护程序,启动它并检查logstash的状态。

# sudo systemctl start logstash
# sudo systemctl status logstash

4.配置logstash

现在让我们配置Logstash。
logstash配置文件位于/etc/logstash/conf.d中,并且为JSON格式。
该配置由三部分组成,分别是输入,过滤器和输出。
首先,创建用于存储证书和Logstash密钥的目录。

# mkdir -p /var/lib/logstash/private
# sudo chown logstash:logstash /var/lib/logstash/private
# sudo chmod go-rwx /var/lib/logstash/private

现在为logstash创建证书和密钥

# openssl req -config /etc/ssl/openssl.cnf -x509  -batch -nodes -newkey rsa:2048 -keyout /var/lib/logstash/private/logstash-forwarder.key -out /var/lib/logstash/private/logstash-forwarder.crt -subj /CN=172.31.13.29

将/CN=172.31.13.29更改为服务器的专用IP地址。
为避免“ TLS握手错误”,在/etc/ssl/openssl.cnf中添加以下行。

[v3_ca] subjectAltName = IP:172.31.13.29

请记住,我们必须将此证书复制到我们要通过filebeat将其日志发送到ELK服务器的每个客户端。

接下来,我们将首先创建名称为02-beats-input.conf的“ filebeat”输入

# sudo vi /etc/logstash/conf.d/02-beats-input.conf
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/var/lib/logstash/private/logstash-forwarder.crt"
ssl_key => "/var/lib/logstash/private/logstash-forwarder.key"
}
}

现在,我们将创建名称为10-syslog-filter.conf的“ filebeat”过滤器,以添加syslog消息的过滤器。

# sudo vi /etc/logstash/conf.d/10-syslog-filter.conf
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}

最后,我们将创建名称为30-elasticsearch-output.conf的“ filebeat”输出

# sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}

使用以下命令测试Logstash配置。

# sudo service logstash configtest

如果没有语法错误,它将显示Configuration OK,否则请检查/var/log/logstash中的logstash日志文件

要测试logstash,请从终端执行以下命令。

# cd /opt/logstash/bin && ./logstash -f /etc/logstash/conf.d/02-beats-input.conf

我们会发现logstash已启动管道并处理syslog。
一旦确定Logstash正在将syslogscombine 02-beats-input.conf,10-syslog-filter.conf和30-elasticsearch-output.conf处理为目录/etc/logstash/conf.d中的单个logstash conf文件。

重新启动logstash以重新加载新配置。

# sudo systemctl restart logstash

5.安装示例仪表板

下载示例Kibana仪表板和Beats索引模式。
我们将不使用此仪表板,而是将其加载,以便我们可以其中使用filebeat索引模式。
下载示例仪表板并将其解压缩。

# curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
# unzip beats-dashboards-1.1.0.zip

使用以下命令将示例仪表板,可视化和Beats索引模式加载到Elasticsearch中。

# cd beats-dashboards-1.1.0 # ./load.sh

我们将在kibana仪表板的左侧列中找到以下索引模式。
我们将仅使用filebeat索引模式。

packetbeat- *
topbeat- *
filebeat- *
winlogbeat- *

由于我们将使用filebeat将日志转发到Elasticsearch,因此我们会将Filebeat索引模板加载到elasticsearch中。

首先,下载filebeat索引模板

# curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json

现在,使用以下CURL命令加载以下模板。

# curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' [email protected]

如果模板正确加载,我们应该会看到类似以下的消息:

Output:  {  "acknowledged" : true  }

现在,ELK服务器已准备好接收文件信号数据,让我们在客户端服务器中配置文件信号。
有关加载节拍仪表板的更多信息,请检查此链接https://www.elastic.co/guide/en/beats/libbeat/current/load-kibana-dashboards.html

6.在客户端中安装filebeat

在我们要将日志发送到ELK服务器的客户端中创建Beats来源列表。
更新apt数据库并使用apt-get安装filebeat

# echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list # sudo apt-get update && sudo apt-get install filebeat

开始文件拍

# /etc/init.d/filebeat start

现在编辑文件/etc/filebeat/filebeat.yml。
修改现有的探矿器以将syslog发送到logstash。
在“路径”部分中,注释掉/var/log/*.log文件,并为syslog/var/log/syslog添加新条目。

接下来,指定探矿者中的日志类型为syslog。

取消注释Logstash:输出部分和主机:[“ SERVER_PRIVATE_IP:5044”]部分。
将localhost编辑为ELK服务器的专用IP地址或者主机名。
现在,取消注释表示certificate_authorities的行,并将其值修改为我们在步骤9中在ELK服务器中创建的/var/lib/logstash/private/logstash-forwarder.crt,我们必须将此证书复制到所有客户端计算机。

重新启动filebeat并检查其状态。

# sudo /etc/init.d/filebeat restart # sudo service filebeat status

要测试文件拍,请在终端上执行以下命令。

# filebeat -c /etc/filebeat/filebeat.yml -e -v

filebeat将日志发送到logstash,以对日志建立索引。
启用文件信号以在每次引导期间启动。

# sudo update-rc.d filebeat defaults 95 10

现在打开我们喜欢的浏览器,并将URL指向http://ELK-SERVER-IP:5601或者http://ELK-SERVER-DOMAIN-NAME:5601,单击左侧的file-beats- *后,我们将找到系统日志。
侧边列。

这是我们对filebeat的最终filebeat配置

filebeat:
prospectors:

paths:
- /var/log/auth.log
- /var/log/syslog
input_type: log
document_type: syslog
registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["172.31.13.29:5044"]
bulk_max_size: 1024
tls:
certificate_authorities: ["/var/lib/logstash/private/logstash-forwarder.crt"]
shipper:
logging:
files:
rotateeverybytes: 10485760

7.配置防火墙

添加防火墙规则以允许到以下端口的流量。

四个IPTABLE命令将是

# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5601 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5044 -j ACCEPT

保存规则。

# service iptables save

重新启动IPTABLE

# service iptables restart

对于UFW用户:

# sudo ufw allow 5601/tcp
# sudo ufw allow 9200/tcp
# sudo ufw allow 80/tcp
# sudo ufw allow 5044/tcp
# sudo ufw reload

8.安装/配置Kibana

下载最新的kibana fom https://download.elastic.co/

# cd /opt
# wget https://download.elastic.co/kibana/kibana/kibana-4.5.3-linux-x64.tar.gz
# tar -xzf kibana-4.5.3-linux-x64.tar.gz # cd kibana-4.5.3-linux-x64/
# mv kibana-4.5.3-linux-x64 kibana # cd /opt/kibana/config # vi kibana.yml

现在在/opt/kibana/config/kibana.yml中更改这些参数

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"

出于测试目的,我们可以使用以下命令运行kibana。

# cd /opt/kibana/bin
# ./kibana & # netstat -pltn

现在,我们将使用“ pleaserun”为kibana创建systemd守护程序,其方式与为logstash创建的方式相同。

# pleaserun -p systemd -v default –install /opt/kibana/bin/kibana -p 5601 -H 0.0.0.0 -e http://localhost:9200

其中
-p指定kibana将绑定的端口号
-H指定将其中运行Kibana的主机IP地址。

-e选项指定elasticsearch IP地址。

启动木乃伊

# systemctl start kibana

检查kibana的状态

# systemctl status kibana

检查kibana是否已占用5601端口

# netstat -pltn| grep '5601'

9.安装/配置NGINX

由于将Kibana配置为侦听localhost,因此我们需要设置一个反向代理以允许对其进行外部访问。
我们将使用NGINX作为反向代理。
使用以下命令安装NGINX和apache utils。

# sudo apt-get install nginx apache2-utils php-fpm

在/etc/php/7.0/fpm/pool.d中编辑php-fpm配置文件www.conf

listen.allowed_clients = 127.0.0.1,172.31.13.29

重新启动php-fpm

# sudo service php-fpm restart

使用htpasswd创建一个名为“ kibana”的管理员用户,以访问Kibana Web界面。

# sudo htpasswd -c /etc/nginx/htpasswd.users kibana

在提示符下输入密码。
记住该密码,我们将使用它来访问Kibana Web界面。

为NGINX创建证书

# sudo openssl req -x509 -batch -nodes -days 365 -newkey rsa:2048  -out /etc/ssl/certs/nginx.crt -keyout /etc/ssl/private/nginx.key -subj /CN=demohost.com

编辑NGINX默认服务器块。

# sudo vi /etc/nginx/sites-available/default

删除文件的内容,然后将以下配置粘贴到文件中。

server_tokens off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
server {
listen 443 ssl;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
location/{
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
add_header Strict-Transport-Security "max-age=31536000;";
}
server {
listen 80;
listen [::]:80 default_server ipv6only=on;
return 301 https://$host$request_uri;
}

我们没有使用server_name指令,因为我们已经在/etc/hosts和/etc/hostname中将域名配置为demohost.com。
同样,自那以后,我们编辑了NGINX默认主机(/etc/nginx/sites-available/default)。
因此,一旦NGINX启动,demohost.com将在浏览器中可用。

保存并退出。
从现在开始,NGINX会将服务器的HTTP通信定向到端口号5601的Kibana应用程序。

现在重启NGINX,使我们的更改生效:

# sudo service nginx restart

现在,我们可以通过访问FQDN或者ELK服务器的公共IP地址来访问Kibana,例如:http://elk_server_public_ip /。
输入我们先前创建的“ kibana”凭证,我们将被重定向到Kibana欢迎页面,该页面将要求我们配置索引模式。

单击左上侧边列中的filebeat *,我们将看到来自客户端的日志流入仪表板。