Elastic 之网络设备日志收集

背景介绍

如何收集网络设备日志?收集日志后如何对日志进行分析判断网络中是否存在隐患?笔者通过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结尾的字段中显示统计信息可以发现一些隐患。

如一段时间内单个接口频繁UP/DOWN可能出现问题,也可以联动告警。

参考文档

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值