- 搭建安全认证的ELK日志系统,其中讲到如何配置logstash的正则提取规则。
- 官网filebeat文档
- 观感最好的文章filebeat配置文件详解,详细讲解了每条配置项。
网上有不少关于filebeat配置文件的文章,但多半是基于5.x版本的,实际上跟6.x的语法的差别不会很大。
5.x版本需要一个个手动配置需要采集的日志。
6.x版本将一些常见的日志比如syslog、apache、nginx的配置规则给分离出来,通过参数开关来启用,降低了使用难度。
用nginx反代并启用访问限制
默认es不设防,所以至少要用nginx反代一下es做个http认证。
- how-secure-kibana-nginx-centos
- 启用https认证
官网博客给的配置文件有坑
- 安装并启用nginx服务
yum install epel-release
yum install nginx
systemctl start nginx
systemctl enable nginx
注意:因为SeLinux的关系会导致反代失败,查看
/var/log/nginx/error.log
看到Permission denied) while connecting to upstream
,执行setsebool -P httpd_can_network_connect 1
临时关闭setenforce 0
, 无需重启
修改/etc/selinux/config 文件,将SELINUX=enforcing改为SELINUX=disabled,然后重启
For setting up an HTTP authentication we will need the “.htaccess” and “.htpasswd” files, we can get both of them by installing “httpd-tools” package: yum install httpd-tools
接着创建密码文件
htpasswd -c passwords test
,会提示你输入密码然后创建了个passwords
文件,选项-c
表示创建,后期要添加新用户可以用htpasswd passwords test2
修改nginx配置文件默认位置
/etc/nginx/nginx.conf
,官网博客把两个auth_basic
移动到了location外面导致认证无法通过
events {
worker_connections 1024;
}
http {
upstream elasticsearch {
server 127.0.0.1:9200;
}
server {
listen 8080;
location / {
auth_basic "Protected Elasticsearch";
auth_basic_user_file passwords;
proxy_pass http://elasticsearch;
proxy_redirect off;
}
}
}
用nginx -t
验证配置文件是否规范
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
没问题之后可以使用nginx -c /etc/nginx/nginx.conf
或者systemctl restart
启动nginx
- 修改elasticsearch.yml文件
# 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0
# network.bind_host: 127.0.0.1 #只有本机可以访问http接口
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址,就是给集群之间通信用的
# network.publish_host: 192.168.0.1
# 同时设置bind_host和publish_host上面两个参数
# network.host: 192.168.0.1 #绑定监听IP
beat安全配置
使用beat来创建密钥库,这样在配置文件中可以使用你定义的密钥键来代替明文密码,这样别人就不知道es的登陆密码了。
winlogbeat keystore create
winlogbeat keystore add ES_PWD #会提示你输入密钥值
winlogbeat keystore add ES_PWD --force 强制更新
winlogbeat keystore list
winlogbeat keystore remove ES_PWD
如果密钥保存在文件里面,可以用
cat /file/containing/setting/value | winlogbeat keystore add ES_PWD --stdin --force
配置文件中调用变量
output.elasticsearch.password: "${ES_PWD}"
命令行调用变量
-E "output.elasticsearch.password=\${ES_PWD}"
注意: 虽然每次生成filebeat.keystore
的内容不一样,但是复制后依然可以到处使用。
连接到es和kibana
如果hosts中没有指定端口,es默认是9200,kibanas默认是5601
setup.kibana:
host: "192.168.138.137:8888"
username: "${USER}"
password: "${PWD}"
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.138.137:80"]
# Optional protocol and basic auth credentials.
#protocol: "https"
username: "${ES_USER}"
password: "${ES_PWD}"
运行filebeat setup -e
初始化环境,该setup命令加载建议的索引模板以写入Elasticsearch,并部署示例仪表板以可视化Kibana中的数据。这是一次性设置步骤。
该-e标志是可选的,并将输出发送到标准错误而不是syslog。
Filebeat
filebeat
自带了些常用的日志解析模块,比如web服务器apache,nginx,iis
,数据库mysql,mongodb,postgresql
web日志采集
nginx日志变量
Apache日志变量
问题:一台服务器上有多个网站,需要将每个网站的日志分离开来。
以iis为例,修改iis日志输出的格式,增加服务名称(既cs-host
)字段,同时module\iis\access\ingest\default.json
也要增加cs-host
的解析规则。
apache日志变量%v 对该请求提供服务的标准ServerName
。
nginx日志变量$hostname
。
修改default.json
,如果在_ingest/pipeline/
已存在,可以通过PUT方法更新。
注意默认情况Windows2008 R2下IIS并没有启用cs-referer
字段(Windows 2012版本以上才默认启用),将其修改为host
字段。提取规则是从上到下依次匹配的,匹配失败会报错。
顺带让其能匹配带中文的url
(?
最终是这个样子的
"patterns":[
"%{TIMESTAMP_ISO8601:iis.access.time} %{IPORHOST:iis.access.server_ip} %{WORD:iis.access.method} (?(?:/[A-Za-z0-9$.+!*'(){},~:;=@#%&_\\-\u4e00-\u9fa5]*)+) %{NOTSPACE:iis.access.query_string} %{NUMBER:iis.access.port} %{NOTSPACE:iis.access.user_name} %{IPORHOST:iis.access.remote_ip} %{NOTSPACE:iis.access.agent} %{NOTSPACE:iis.access.host} %{NUMBER:iis.access.response_code} %{NUMBER:iis.access.sub_status} %{NUMBER:iis.access.win32_status} %{NUMBER:iis.access.request_time_ms}",
然后filebeat run -e
显示调试信息。
在filebeat.yml里面启用指定module,tags
、fields
可以在input节点中使用。
filebeat.modules:
- module: apache2
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths:
# Input configuration (advanced). Any input configuration option
# can be added under this section.
input:
type: log
paths:
- D:/apache2/log/www.test.com-access_log*.log
exclude_lines: ["^#"]
fields_under_root: true
fields:
apache2.access.host: "www.test.com"
经过测试,module里面不支持多个input,后面的input的值会覆盖前面的,无法分开读取多个不同路径的日志。
后续用logstash
进行处理
system模块
这是用来解析Linux系统日志的模块。
查看/usr/share/filebeat/module/system/auth/manifest.yml
可以知道它是解析/var/log
里面的secure
和auth.log
,既linux的登陆日志。
var:
- name: paths
default:
- /var/log/auth.log*
- /var/log/secure*
需要在ES端安装插件,/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip
,安装插件后需要重启ES服务使其生效。
如果服务器使用的是非UTC+0
时区,需要修改mainfest.yml
,启用时区转化。
- name: convert_timezone
default: true
注意: 需要在ES端删除原有的pipeline
,curl -XDELETE 'http://localhost:9200/_ingest/pipeline/filebeat-*'
否则就会像这样,比实际时间又快了8个小时,这是因为ES在转化时间戳时默认按照UTC
时区处理,而filebeat
本身读取到的时间已经是UTC+8
的。
当然还可以修改pipeline.json
来修正时区,但是这样反而要求每台服务器设置的时区必须都是一致的,这样也很麻烦。
"date": {
"target_field": "@timestamp",
"formats": ["MMM d HH:mm:ss", "MMM dd HH:mm:ss"],
"ignore_failure": true,
"field": "system.syslog.timestamp",
"timezone": "CST"
}
WinlogBeat
达到了开箱即用的程度,这里修改了winlogbeat.yml
的name
的值为服务器ip方便审计。
General
部分还可以设置tags: ["service-X", "web-tier"]
和fields
用来标记和区分服务器的归属或者用途,支持中文。
name: "192.168.45.132"
# The tags of the shipper are included in their own field with each
# transaction published.
tags: ["service-X", "web-tier"]
# Optional fields that you can specify to add additional information to the
# output.
fields:
env: 测试
最为重要的Windows登陆日志解析后如下图
设置自启动服务
手动运行beat
没有异常之后,方便无人值守设置成服务。
- Windows
在beat的解压目录
有个poweshell脚本。以winlogbeat为例,执行PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-winlogbeat.ps1
- Linux
直接通过软件包的方式安装,记得systemctl enable 服务名
来设置成自启动服务。