如何在Ubuntu 16.04上设置ELK堆栈以集中日志
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 *,我们将看到来自客户端的日志流入仪表板。