项目需要,研究了ELK,记录一下
一. 背景: 为解决安全检查合规,以及功能增强,需升级ELK7->8, 故在本地搭建ELK8的服务,验证相关问题。
二. 简介:网上资源很多,
简单的说:ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部
Logstash 用于采集数据,
Elasticsearch 用于存储分析检索数据,
Kibana 用于分析展示数据
除了3个基本套件外:项目中的elk还涉及,
FileBeat 轻量的数据采集, ElastAlert 2 监控报警 (ES也有自己的强大的收费的监控报警)。
关于Beats和Logstash的使用,网上很多资源编辑ELK架构简述 , 编辑logstash 和 beats的关系_logstash beats_水的精神的博客-优快云博客 ;
简单的说,Beats轻量,专注收集; Logstash除了收集,还特别擅长数据转换,格式化等处理工作。
三. 搭建过程:
官网有打好的docker镜像,也有相应的文档,参考 编辑Installing the Elastic Stack | Elastic Installation and Upgrade Guide [8.9] | Elastic
这里的步骤适用windows本地部署。
1. 官网下载文件,这里都下的用于windows的zip, 当前版本8.8.2
Elasticsearch (install instructions)
Kibana (install)
Logstash (install)
Beats (install instructions)
ElastAlert2 (编辑ElastAlert 2 - Automated rule-based alerting for Elasticsearch — ElastAlert 2 0.0.1 documentation )
另外:JDK17+ (这个elasticsearch的zip打包好了所需版本,不自己下的话,可以把相应目录加到“环境变量”)
2. 打开 .\elasticsearch-8.8.2\config\elasticsearch.yml, 调整相应配置
network.host: 127.0.0.1
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
# 启动运行 .\elasticsearch-8.8.2\bin\elasticsearch.bat 脚本即可。
注意:这里刚启动的后,控制台上可以看到user “elastic” 及随机密码,
建议执行重置密码,录入一个方便记忆的密码
.\elasticsearch-reset-password -i -u elastic
用户elastic权限太大,不建议在具体业务中使用,并且其本身在一些配置中受限,另外,内置有kibana_system, logstash_system, kibana_admin, logstash_admin 的用户,专门用于连接相应的套件,
建议参考kibana_system, logstash_system 的角色权限等,创建一个自定义角色,基于该新建的角色创建一个新用户,用于我们的日志系统。(注意,貌似logstash_system没有批量写的权限,导致logstash不能写入数据到elasticsearch, 所以最好新建我们的角色,并赋予批量写的权限, 可能logstash_admin有批量的权限,没有专门测)
创建role和user的工作,可以先使用超级用户elastic, 把 elasticsearch 和 kibana 连接好,然后在kibana的 devTool上,使用API工具创建更方便, 创建好后在返回来修正各个配置文件;
另外:为方便本地搭建,没有启用SSL; 如果想验证下,elasticserach8.X的目录中有自带的证书, 我试过可以用
#批量写的role
"logstash_writer": { "cluster": [], "indices": [ { "names": [ "*" ], "privileges": [ "create_doc", "create", "delete", "index", "write", "all" ], "allow_restricted_indices": false } ], "applications": [], "run_as": [], "metadata": {}, "transient_metadata": { "enabled": true }
3. 打开 .\logstash-8.8.2\config\logstash.conf
(如果没有,请把logstash-sample.conf拷贝一份重命名即可)
input {
# file {
# path => "D:/logs/app.gateway-*.json"
# start_position => "beginning"
# sincedb_path => "D:/elk/elk_running/logstash-8.8.2/sincedb/file"
# }
beats {
port => 5044
}
}
filter {
......
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
index => "log-app-v2"
user => "loguser"
password => "xA123456"
#ssl => true
#ssl_certificate_verification => true
#cacert => "D:\\elk\\elk_running\\elasticsearch-8.8.2\\config\\certs\\http_ca.crt"
}
# 启动运行 .\logstash-8.8.2\bin\logstash.bat -f .\config\logstash.conf 脚本即可。
4. 打开 .\kibana-8.8.2\config\kibana
server.port: 5601
server.host: "127.0.0.1"
elasticsearch.username: "loguser"
elasticsearch.password: "123456"
# 启动运行 .\kibana-8.8.2\bin\kibana.bat 脚本即可。
5. 打开 .\filebeat-8.8.2\filebeat.yml
filebeat.inputs:
- type: filestream
enabled: true
paths: - D:\logs\app.*-*.json
output.logstash:
hosts: ["localhost:5044"]
# 启动运行 .\filebeat-8.8.2\filebeat -c filebeat.yml -e 脚本即可。
6. ElastAlert2安装
pip3 install elastalert2
git clone https://github.com/jertel/elastalert2.git
$ python3 setup.py install
## 可能会提示 更新setuptools, 那就执行pip3 install "setuptools>=11.3" 更新一下先
配置文件
## 配置文件目录位于elastalert2/examples/目录下,把config.yaml.sample复制一份成config.yaml
rules_folder: examples/rules
run_every:
minutes: 1
buffer_time:
minutes: 15
es_host: "127.0.0.1"
es_port: 9200
es_username: loguser
es_password: 123456
writeback_index: elastalert_status
创建监控状态索引,也可以不创建,第一次启动elastalert时会有一个警告,然后它自己就去给创建了;创建成功即可通过kibana查看索引管理,看到创建好的一系列索引 elastalert_status_XXXX;
elastalert-create-index
创建自定义rule: demo_sendgrid.yaml
# 2分钟内超过10的ERROR事件,就报警(向本地http://localhost:8409, post报警数据)
name: 10_error_2_minutes
type: frequency
index: mylog-*
use_strftime_index: true
num_events: 10
timeframe:
minutes: 2
filter:
- query:
query_string:
query: "Error"
alert: post2
http_post2_url: "http://localhost:8409"
http_post2_payload: |
{
"message": "there is some error"
}
http_post2_headers: Content-Type: application/json
启动elastalert
python -m elastalert.elastalert --config D:\elk\elk_running\elastalert2\examples\config.yaml --rule D:\elk\elk_running\elastalert2\examples\rules\demo_sendgrid.yaml --verbose