今天临时收到一个企业客户的项目需求,需要对所有WIndows业务服务器的日志进行集中化查看和分析管理,毕竟像业务很多的公司而且历史比较悠久的公司,windows和linux都是混合运行的,毕竟太老的程序和配置是不能轻易动的,尤其医院和政府类的。
在互联网项目中,良好的日志监控和分析能保障业务稳定运行,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器,这时候就需要一个集中式的日志收集装置,对日志中的关键字进行监控,触发异常时进行报警,协助开发人员查看相关日志。
好吧!话不扯远。直接进入项目正题。
项目需求:
收集和存储Windows AD服务器关键系统日志,应对安全审计要求。
基于Windows账户登录日志进行安全事件分析。
收集WIndows server服务器上各种应用软件和IIS等中间件的访问日志和错误日志进行分析和定位故障原因进行溯源。
日志类别分析:
日志主要包括系统日志、应用程序日志和安全日志。每条日志都记载着时间戳、主机名、使用者及操作行为等相关的描述,系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,及时分析问题、追查错误根源纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
在大数据时代,日志数量巨大,种类多样化,企业数据就如同一座亟待开发的金矿;日志的统计和检索的难度加大,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
强大的ELK日志管理
ELK是一款开源的海量日志搜索分析平台,能够完美的解决我们上述的问题,对日志进行集中采集和实时索引,提供实时搜索、分析、可视化、报警等功能,帮助企业在统一平台实时管理日志数据,进行线上业务实时监控、异常原因定位、数据统计分析。ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站: https://www.elastic.co/products
- Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
- Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
- Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
ELK+kafka日志系统原理(介质为日志) Windows/linux的
logstash(客户端)--->kafka(队列)--->kakfa上的logstash(也是一个客户端)--->ES(存储)--->kibana(界面)
此次项目拓扑图(出于对客户隐私信息的保护暂时只画出简单图示)
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser浏览器渲染。
由于 Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。因此项目需要详细讲解如何部署基于 Filebeat/Winlogbeat 的 ELK 集中式日志解决方案,具体架构见图 5。
图 5. 基于 Filebeat 的 ELK 集群架构
因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。加上配置 Nginx 实现简单的用户认证,一定程度上提高安全性。另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。
对于日志数据流特别大的情况,LogStash会造成拥堵,这个时候可以使用消息队列来进行缓冲。同时,日志一旦进过LogStash之后,会不方面一些流处理程序来读取。这个时候使用kafka就比较好了,因为kafka是将消息持久化在本地,流处理应用可以从消息的offset初始的地方来读取。加入kafka的后的流程如下:
日志系统平台搭建信息
平台
笔者试验平台为 RHEL 6.9。注意,目前 ELK(包括 Beats)不支持 AIX。具体对平台的支持请查看这里。
JDK
JDK 是 IBM Java 8。ELK 需要 Oracle 1.7(或者是 OpenJDK 1.7) 及以上,如果是 IBM Java,则需要 8 及以上的版本。
具体信息。
浏览器
Kibana 4.x 不支持 IE9 及以下;Kibana 3.1 虽然支持 IE9,但是不支持 Safari(iOS)和 Chrome(Android)。具体对浏览器的支持,请看这里。
软件版本
- Filebeat:1.2.3;
- Logstash:2.3.4;
- Elasticsearch:2.3.4;
- Kibana:4.5.4;
- Nginx:1.8.1。
注意事项
logstash版本:1.5.4(因不支持beats输入插件,故弃用),2.2.1或者更高的版本(目前使用版本)
由于ELK无论linux和windows运行都正常,建议生产环境使用linux系统
另外由于某些Windows Server服务器默认是禁止启用powershell的,因此安装过程可能会遇到如下问题。
无法加载文件 C:\Program Files\winlogbeat\install-service-winlogbeat.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 "get-help about_signing"。08以上是自带powershell的,而03则需要安装netframework之后才能安装powershell。
安装步骤
步骤一、下载Java组件并安装
下载最新版本的jdk,解压缩双击安装。备注:请务必使用java8以上的版本,否则ELK不能正常使用。
步骤二、添加JAVA_HOME 环境变量
右键“这台电脑“-〉属性-〉高级系统设置-〉环境变量,在系统变量里新建JAVA_HOME,值为C:\Java\jdk1.8.0_152,如下图所示
步骤三、安装配置nginx,为kibana配置反向代理
首先从网址http://nginx.org/download/nginx-1.9.4.zip下载nginx.
解压nginx-1.9.4.zip到f:\elk,目录更名为nginx.
修改f:\elk\nginx\conf\nginx.conf文件,增加如下内容
server{
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_pass http://localhost:5601;
}
这样做解决了5601端口被防火墙屏蔽,导致外部用户访问不了的问题。
步骤四、安装elasticsearch
解压elasticsearch-1.7.1.zip压缩包到F:\elk\elasticsearch地址下
打开命令行,输入如下命令
Pushd f:\elk\elasticsearch\bin\
Service install
产生如下输出
然后输入
service manager
出现如下界面
修改“Startup type “ ,从Manual到Automatic。
然后点击”Start“, elasticsearch将立即开始运行。
在浏览器中输入http://localhost:9200,出现如下界面,表明elasticsearch安装成功。
步骤五、安装head插件
解压elasticsearch-head-master.zip压缩包内容到elasticsearch\plugins文件夹下,修改elasticsearch-head-master名称为head,在浏览器中输入http://localhost:9200/_plugin/head/即可查看Elasticsearch中数据
步骤六、安装logstash
解压logstash-2.2.1.zip压缩包到F:\elk\logstash地址下
在f:\elk\logstash\bin里新建Logstash.conf
内容如下
input {
beats {
port => "5544"
codec => json {
charset => "UTF-8"
}
}
}
filter {
if [type] == "info" {
grok {
match => {
"message" => "(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})\s+\[(?<thread>.*)\]\s+(?<level>\w*)\s+(?<class>\S*)\s+\[(?<method>\S*)\]\s+\: (?<message>.*)\s*"
}
overwrite => ["message"]
}
}
if [type] == "error"{
grok {
match => {
"message" => "(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})\s+\[(?<thread>.*)\]\s+(?<level>\w*)\s+(?<class>\S*)\s+\[(?<method>\S*)\]\s+\- (?<message>.*)\s*"
}
overwrite => ["message"]
}
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "test-%{+YYYY-MM}"
}
stdout { codec => rubydebug }
}
步骤七、新建Logstash 启动批处理文件
在文件夹f:\elk\logstash\bin下新建run.bat 文件
文件内容如下
logstash.bat agent -f logstash.conf
增加这个批处理的目的是为了解决在windows环境下logstash运行一段时间就会挂起的问题。
步骤八、将Logstash安装成windows服务
首先从网址https://nssm.cc/release/nssm-2.24.zip下载nssm。
解压nssm-2.24.zip,然后从解压目录中拷贝nssm-2.24\win64\nssm.exe到f:\elk\logstash\bin里,然后在命令行里输入
Pushd f:\elk\logstash\bin
接着执行
Nssm install logstash
出现安装界面
请填写如下信息:
Path: f:\elk\logstash\bin\run.bat
Startup directory: f:\elk\logstash\bin
界面如下:
点击"Details"页签,填写如下内容
Display name:logstash
Startup type:Automatic
界面如下:
接下来点击"Dependencies"页签,填写如下信息
This service depends on the followingsystem components: elasticsearch-service-x86
界面如下:
添加依赖的原因是,logstash的输出配置的是Elasticsearch,如果Elasticsearch没有启动,logstash无法正常工作。
最后单击install service按钮,执行安装过程,出现如下界面,表示服务已经安装成功。
步骤九、将Kibana安装成windows服务
将步骤八下载的nssm拷贝到文件夹f:\elk\kibana\bin下。
然后在命令行里输入
Pushd f:\elk\kibana\bin
接着执行
Nssm install kibana
出现安装界面
请填写如下信息:
Path: f:\elk\kibana\bin\kibana.bat
Startup directory: f:\elk\kibana\bin
界面如下:
类似步骤八
点击"Details"页签,填写如下内容
Display name:kibana
Startup type:Automatic
界面如下:
接下来点击"Dependencies"页签,填写如下信息
This service depends on the followingsystem components:
elasticsearch-service-x86
logstash
界面如下:
最后单击install service按钮,执行安装过程,出现如下界面,表示服务已经安装成功。
你可以在"f:\elk\kibana\config\kibana.yml"中修改kibana的运行端口。
步骤十、安装FileBeat
(一)、安装
1.将文件夹中filebeat-5.5.1-winsows-x86_64.zip压缩包(也可自行下载)解压到C:\filebeat文件夹
2.以管理员身份运行PowerShell(此处不要用cmd.exe),在控制台中输入以下命令安装
CD C:\filebeat
.\install-service-filebeat.ps1
3.安装过程中会出现以上错误,此时需更改执行策略,语句如下
Set-executionpolicy RemoteSigned
选择:y 执行完后重新执行安装命令
.\install-service-filebeat.ps1
至此安装成功,此时可看到filebeat服务为关闭状态
4.在开始菜单-运行输入Services.msc打开本地服务操作栏,找到filebeat.exe,启动服务
(二)、配置
1.打开C:\filebeat文件夹,找到filebeat.yml配置文件,打开
2.将以下内容替换到配置文件中,根据需要更改配置内容(注意,由于文件为yml格式,所以同一模块中的行列需对齐,否则无法读取该配置文件)
(三)、数据查看
重新启动服务,往配置文件所在的日志目录中插入数据,打开http://localhost:9200/_plugin/head/或http://localhost:5601即可查看新增的日志数据
在没有日志产生的情况下,winlogbeat进程工作内存9M,有日志产生的情况下,小于100M内存。
█维护
Windows Service维护
;启动服务
net start winlogbeat
;停止服务
net stop winlogbeat
;卸载服务
powershell "C:\Program Files\winlogbeat\uninstall-service-winlogbeat.ps1"
附录部分配置文件
编辑文件【winlogbeat.conf】,设置日志收集参数、转发服务器参数等。
C:\Program Files\winlogbeat\winlogbeat.yml
# The supported keys are name (required), tags, fields, fields_under_root,
# forwarded, ignore_older, level, event_id, provider, and include_xml. Please
# visit the documentation for the complete details of each option.
# https://go.es.io/WinlogbeatConfig
# 收集三类日志:Application/Security/System,72小时前的日志忽略。以下默认,无需修改
winlogbeat.event_logs:
- name: Application
ignore_older: 72h
- name: Security
- name: System
# 注释所有Elasticsearch相关的配置参数
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
# 配置Logstash相关参数,默认只需要配置hosts
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["1.1.1.1:5044"]
其中1.1.1.1时远程logstash服务器的IP地址,实际部署时请设置为正确的IP参数。
请确保防火墙策略允许Windows AD服务器能够访问到logstash服务器IP的TCP5044端口。
【参考资料】
1、ELK+Filebeat 集中式日志解决方案详解 https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html?ca=drs-&utm_source=tuicool&utm_medium=referral(讲解的很详细推荐阅读)
2、ELK+kafka日志系统搭建-实战 - CSDN博客 https://blog.csdn.net/wangdaoge/article/details/53130263
3、ELK日志管理平台 - CSDN博客 https://blog.csdn.net/polaris_1/article/details/54381502