背景介绍
如何收集网络设备日志?收集日志后如何对日志进行分析判断网络中是否存在隐患?笔者通过Elastic + rsyslog 实现。
系统环境
- Debian 11
- Elastic 8.5
架构说明
需要两台服务器,设备数量不多可以安装再一台服务器上。
- 一台安装Elasticsearch + Kibana
- 一台安装Logstansh + resyslog
使用Elastic自带JVM环境。
Elasticsearch
什么是Elasticsearch 请参照官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/8.5/elasticsearch-intro.html
安装
笔者通过包安装手动安装
Debian
# 安装wget
sudo apt install wget -y
# 下载安装包和校验包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.1-amd64.deb &&
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.1-amd64.deb.sha512
# 校验包完整性
shasum -a 512 -c elasticsearch-8.5.1-amd64.deb.sha512
# 安装包
sudo dpkg -i elasticsearch-8.5.1-amd64.deb
Centos
# 安装shasum检测包完整性,安装wget
sudo dnf install perl-Digest-SHA -y && sudo dnf install wget -y
# 下载安装包 和 完整性检测包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.0-x86_64.rpm &&
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.0-x86_64.rpm.sha512
# 验证包完整性 elasticsearch-8.5.0-x86_64.rpm: OK
shasum -a 512 -c elasticsearch-8.5.0-x86_64.rpm.sha512
# 安装
sudo rpm --install elasticsearch-8.5.0-x86_64.rpm
安装完成后如下信息
----------- Security autoconfiguration information --------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
# 系统自动生成的密码 M-=LwwxrCT0nmXz9i3Dg
The generated password for the elastic built-in superuser is : M-=LwwxrCT0nmXz9i3Dg
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.
修改配置参数
字段说明:
- cluster.name:集群名称,节点根据集群名称确定是否是同一个集群。默认名称为 my-application,但应将其更改为描述集群用途的适当名称。不要在不同的环境中重用相同的集群名称。否则,节点可能会加入错误的集群
- node.name:节点名称,集群内唯一,默认为主机名。,但可以在配置文件中显式配置
- network.host: 节点对外提供服务的地址以及集群内通信的ip地址,例如127.0.0.1和
[::1]
。 - xpack.security.enabled: true 启动安全传输
- cluster.initial_master_nodes 指定master节点
- http.port:对外提供服务的端口号,默认 9200
- transport.port:节点通信端口号,默认 9300
更换日志和存储路径,指定文件路径。
- 存储数据的目录路径(用逗号分隔多个位置): path.data: /var/lib/elasticsearch
- 日志文件路径: path.logs: /var/log/elasticsearch
# 创建文件目录
mkdir /opt/elastic
# 将目录授权给elasticsearch账户
sudo chown -R elasticsearch:elasticsearch /opt/elastic/
# 修改配置文件
sudo vim /etc/elasticsearch/elasticsearch.yml
# 配置集群名称
cluster.name: Elastic-cluster
# 配置节点名称
node.name: node-1
# 配置数据及日志目录,如果使用默认路径可以不用修改,修改后方便升级与迁移。
path.data: /opt/elastic/lib/elasticsearch
path.logs: /opt/elastic/log/elasticsearch
# 指定集群初始化节点主机, node-1 为 node.name 设置的名称
cluster.initial_master_nodes: ["node-1"]
启动服务
# 开机自启和启动服务
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
开启防火墙
Debian 默认不启动防火墙可以跳过
sudo ufw allow 9200/tcp
sudo ufw allow 9300/tcp
sudo ufw reload
Centos
sudo firewall-cmd --add-port=9200/tcp --permanent
sudo firewall-cmd --add-port=9300/tcp --permanent
sudo firewall-cmd --reload
访问 https://IP:9200 可以看到如下信息
查看日志
cat /opt/elastic/log/elasticsearch/Elastic-cluster.log
Kibana
什么是Kibana 请参照官方文档
https://www.elastic.co/guide/en/kibana/current/introduction.html
安装
debian
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.1-amd64.deb &&
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.1-amd64.deb.sha512
shasum -a 512 -c kibana-8.5.1-amd64.deb.sha512
sudo dpkg -i kibana-8.5.1-amd64.deb
Centos
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.0-x86_64.rpm &&
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.0-x86_64.rpm.sha512
shasum -a 512 -c kibana-8.5.0-x86_64.rpm.sha512
sudo rpm --install kibana-8.5.0-x86_64.rpm
修改配置参数
sudo vim /etc/kibana/kibana.yml
- server.port: 5601 配置监听的端口
- server.host: “127.0.0.1” 配置监听的IP
- i18n.locale: “zh-CN” 汉化
启动服务
# 加载systemctl服务项
sudo /bin/systemctl daemon-reload
# 开机自启和启动服务
sudo systemctl enable kibana.service
sudo systemctl start kibana.service
开启防火墙
debain 默认不启动防火墙可以跳过
sudo ufw allow 5601/tcp
sudo ufw reload
Centos
sudo firewall-cmd --add-port=5601/tcp --permanent
sudo firewall-cmd --reload
连接 elasticsearch
访问 http://192.168.12.128:5601/
elassticsearch 上执行如下命令,将得到密钥写入web中点击 Configure Elastic
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
在 kibana 上执行如下命令获取验证码,将验证码填入web中点击 verify
sudo /usr/share/kibana/bin/kibana-verification-code
登陆使用 elassticsearch 的账户和密码,账户是 elastic 密码是安装elassticsearch是自动生成的。
查看日志
cat /var/log/kibana/kibana.log
80端口访问
为什么kibana不能通过80端口启动,简短的回答:1024以下的端口只能由root用户打开。根据注释,您可以使用 CAP_NET_BIND_SERVICE,但应用于javabin的方法将使任何java程序都使用此设置运行,这样不安全,具体可以参照此篇 文章
笔者通过本地端口转发的方式实现
下载启动ufw
# 安装
sudo apt-get install ufw
# 允许通过ufw
sudo ufw allow ssh
sudo ufw allow 22/tcp
sudo ufw allow 5601/tcp
# 开机自启 和 启动 ufw
sudo ufw enable && sudo ufw start
配置允许端口转发
# 编辑配置文件
vim /etc/ufw/sysctl.conf
# 允许转发
net/ipv4/ip_forward=1
本地端口转发配置
# 编辑配置文件
sudo vim /etc/ufw/before.rules
# 将80端口的请求转发至5601
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5601
COMMIT
重新加载ufw配置
sudo ufw reload
Rsyslog
什么是Rsyslog 请参照官方文档
https://www.rsyslog.com/
安装
一般情况下系统已经安装
debian
# 验证安装
sudo dpkg-query -l | grep rsys
# 安装命令
sudo apt install -y rsyslog
Centos
# 验证安装
rpm -qa | grep rsyslog
# 安装命令
yum install rsyslog
服务器管理
sudo systemctl enable rsyslog
sudo systemctl start rsyslog
修改配置参数
删除module 和 input 下的注释,imudp 为UDP,imtcp 为 TCP,华为的TCP传输为6514端口需要的可以自行修改本文采用UDP作为传输协议。
sudo vim /etc/rsyslog.conf
# 更改 $FileCreateMode 0640 授权给其他用户可读
$FileCreateMode 0644
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
新增如下字段,用于存储对应设备日志在/var/log/network/
目录下,日志名称为设备发送源IP地址 + 当前日期,设备支持 local1-local7 可自行定义,下文中的 \
为换行连接符。
local3.none;\
local4.none;\
local5.none;\
local6.none -/var/log/messages
$template aruba,"/var/log/network/aruba/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local3.* ?aruba
$template cisco,"/var/log/network/cisco/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local4.* ?cisco
$template h3c,"/var/log/network/h3c/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local5.* ?h3c
$template huawei,"/var/log/network/huawei/%$YEAR%_%$MONTH%_%$DAY%-%FROMHOST-IP%.log"
local6.* ?huawei
单个厂商的设备会在一个目录下,命令方式为 日期+设备IP,方便后期清理。
创建文件并授权所有用户权限
sudo mkdir /var/log/network
sudo mkdir /var/log/network/aruba
sudo mkdir /var/log/network/cisco
sudo mkdir /var/log/network/h3c
sudo mkdir /var/log/network/huawei
sudo chmod 777 -R /var/log/network
重启服务
systemctl restart rsyslog.service
网络设备配置
将 syslog-ip 替换成服务器的IP地址。
Huawei
info-center loghost source interface
info-center loghost syslog-ip local-time facility local6
H3C
info-center loghost source interface
info-center loghost syslog-ip facility local5
Aruba
将所有日志级别中的 all 全都定义为 warning
CISCO
(config)#logging on
(config)#logging syslog-ip
(config)#logging facility local4
(config)#logging source-interface e0
logstash
什么是logstash 请参照官方文档
https://www.elastic.co/guide/en/logstash/current/introduction.html
安装
debian
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-amd64.deb &&
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-amd64.deb.sha512
shasum -a 512 -c logstash-8.5.1-amd64.deb.sha512
sudo dpkg -i logstash-8.5.1-amd64.deb
centos
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-x86_64.rpm &&
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-x86_64.rpm.sha512
shasum -a 512 -c logstash-8.5.1-x86_64.rpm.sha512
sudo rpm --install logstash-8.5.1-x86_64.rpm
创建日志发送账户
登陆 Kibana 创建管理角色
创建logstash账户并授权刚刚创建的角色
权限说明参考文档
创建incedb文件
用于存储logstash读取日志状态。
sudo touch /var/log/network/huawei/incedb && sudo chmod 777 /var/log/network/huawei/incedb
sudo touch /var/log/network/h3c/incedb && sudo chmod 777 /var/log/network/h3c/incedb
sudo touch /var/log/network/aruba/incedb && sudo chmod 777 /var/log/network/aruba/incedb
获取 cacert
下载 elasticsearch 服务器上的证书文件,用于连接elasticsearch,目录地址如下。
/etc/elasticsearch/certs/http_ca.crt
将证书文件上传至 logstash 服务器,目录地址如下,不使用该路径请一同更改 output下的文件路径。
/etc/logstash/conf.d/
# 授权所有用户读取和执行权限
sudo chmod 755 /etc/logstash/conf.d/http_ca.crt
配置启动文件
默认会读取 /etc/logstash/conf.d/ 下的文本,需要配置多个输入,可以创建多个配置文件。
新增配置文件
读取resyslog 接收到的日志导入elasticsearch,笔者使用到的设备没有Cisco,Cisoc用户需要自行编写grok匹配。
sudo vim /etc/logstash/conf.d/read_file.conf
插入如下内容,记得修改output的账户信息:
input {
file {
path => ["/var/log/network/huawei/*.log"]
type => huawei_log
start_position => "beginning"
sincedb_path => "/var/log/network/huawei/incedb"
}
file {
path => ["/var/log/network/h3c/*.log"]
type => h3c_log
start_position => "beginning"
sincedb_path => "/var/log/network/h3c/incedb"
}
file {
path => ["/var/log/network/aruba/*.log"]
type => aruba_log
start_position => "beginning"
sincedb_path => "/var/log/network/aruba/incedb"
}
}
filter {
if[type] == "huawei_log"{
grok {
match => {
"message" => [
"(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})\+08:00\s+(?<name>\S+)\s+(?<level>\S+\:)%{GREEDYDATA:info}",
"(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+(?<name>\S+)\s+(?<level>\S+\:)\s+%{GREEDYDATA:info}"
]
}
}
}else if [type] == "h3c_log"{
grok {
match => {"message" => "(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+%{YEAR}\s+(?<name>\S+)\s+(?<level>\S+\:)%{GREEDYDATA:info}"}
}
}else if [type] == "aruba_log"{
grok {
match => {
"message" => [
"(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME}) %{YEAR}\s+(?<name>\S+)\s+(?<level>.+\>)\s+%{GREEDYDATA:info}",
"(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+%{YEAR}\s+(?<level>.+\)\:)\s+(?<ap_run_time>\S+\])\s+%{GREEDYDATA:info}"
]
}
}
}
if ("10.0.20.177" in [message]) or ("10.10.4.177" in [message]) { drop { } }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
mutate {
remove_field => ["message"]
}
}
output {
elasticsearch {
index => "networks-office01-%{+YYYY.MM.dd}"
hosts => ["https://127.0.0.1:9200"]
user => "logstash_internal"
password => "xxx"
ssl => true
cacert => "/etc/logstash/conf.d/http_ca.crt"
}
}
配置文件说明
input
file {
# 读取指定目录下的文件, *.log 为所有log结尾的文件
path => ["/var/log/network/huawei/*.log"]
# 给设备日志添加一个type的字段值为huawei_log
type => huawei_log
# 默认logstash从末尾开始读,这条命令顶端开始读
start_position => "beginning"
# 存储logstash的数据文件,以免重复读取
sincedb_path => "/var/log/network/huawei/incedb"
}
filter
# 如果类型是 huawei_log 执行这个grok匹配方法
if[type] == "huawei_log"{
grok {
match => {
# 定义了两个正则匹配,会逐条匹配,华为交换机跟防火墙的日志格式不同
"message" => [
"(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})\+08:00\s+(?<name>\S+)\s+(?<level>\S+\:)%{GREEDYDATA:info}",
"(?<time>%{MONTH}\s+%{MONTHDAY}\s+%{TIME})\s+(?<name>\S+)\s+(?<level>\S+\:)\s+%{GREEDYDATA:info}"
]
}
}
# 10.0.20.177 和 10.10.4.177 是监控平台执行的查询命令,日志了比较大且监控平台已经存储,如果日志中包含这些信息,丢弃日志。
if ("10.0.20.177" in [message]) or ("10.10.4.177" in [message]) { drop { } }
# 更改日期格式
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
# 移除 message 字段,event.original 字段有同样的信息
mutate {
remove_field => ["message"]
}
}
正则匹配到的数据
output
# 如果 type 是 huawei_log 执行如下字段
if[type] == "huawei_log"{
elasticsearch {
# 设置日志索引
index => "networks-office01-%{+YYYY.MM.dd}"
# elasticsearch 地址
hosts => ["https://127.0.0.1:9200"]
# 用户名
user => "logstash_internal"
# 密码
password => "xxx"
# 使用ssl加密
ssl => true
# 指定证书文件,在elasticsearch上获取
cacert => "/etc/logstash/conf.d/http_ca.crt"
}
发送给 elasticsearch 的日志如下:
服务管理
sudo systemctl enable logstash.service
sudo systemctl start logstash.service
查看日志
cat /var/log/logstash/logstash-plain.log
Kibana日志配置
设置索引
进入 Discover
单击创建数据视图
填写相关信息,*
为匹配多个字符,保存数据
选择刚刚创建的数据试图查看日志
分析日志
日志已经通过grok分开,Elastic会统计相关字段,在keyword结尾的字段中显示统计信息可以发现一些隐患。
文章来源:https://www.toymoban.com/news/detail-623025.html
如一段时间内单个接口频繁UP/DOWN可能出现问题,也可以联动告警。
文章来源地址https://www.toymoban.com/news/detail-623025.html
参考文档
- https://www.elastic.co/guide/index.html
- https://www.rsyslog.com/doc/v8-stable/
到了这里,关于Elastic 之网络设备日志收集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!