【日志审计】基于ELK搭建日志服务

0x01 背景


解决当前业务日志无监控、无审计,若出现攻击行为无感知问题。
为未来做敏感接口监控做铺垫。

参考:https://zhuanlan.zhihu.com/p/340238202

0x02 整体架构


Filebeat+消息中间件(redis、kafka)+Logstash+Elasticsearch+Kibana
在这里插入图片描述
搭建此架构,通过增加中间件,来解耦处理过程。一方面能在流量突发增长时,起到削峰的作用,避免请求超负荷,导致系统崩溃。另一方面,当Logstash出现故障,日志数据还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志,避免了数据的丢失。

1、配置介绍

接下来会按照上述的第三种架构,构建系统。主机配置和每台主机所安装的软件如下:

主机名配置存储系统版本用途
master8C16G1TCentOS7.9部署Elasticsearch、Logstash、Kibana、Kafka(内置Zookeeper)
node18C16G1TCentOS7.9部署Elasticsearch、Kafka(内置Zookeeper)
node28C16G1TCentOS7.9部署Elasticsearch、Kafka(内置Zookeeper)
node34C8G1TCentOS7.9用于部署Filebeat日志采集及其他测试操作、Nginx服务
2、实施部署

ELK 下载地址:(当前环境使用7.15.2 版本)
https://www.elastic.co/cn/downloads/past-releases#
Kafka下载地址:(当前环境使用kafka_2.12-2.8.2版本)
https://archive.apache.org/dist/kafka/2.8.2/

1)搭建Elasticsearch集群

  • 安装包分别上传至master\node1\node2机器上,并进行解压;
  • 编辑部署包config/elasticsearch.yml文件,修改一下配置:
cluster.name: es-cluster
node.name: master/node-1/node-2
path.data: /app/elasticsearch-7.15.2/data
path.logs: /app/elasticsearch-7.15.2/logs
network.host: 172.32.10.14/172.32.10.15/172.32.10.16
http.port: 9200
discovery.seed_hosts: ["172.32.10.14", "172.32.10.15","172.32.10.16"]
cluster.initial_master_nodes: ["master"]
  • 编辑部署包中config/jvm.options文件,设置堆内存大小,默认为1G,根据情况修改为:
-Xms8g
-Xmx8g
  • 系统配置修改
1、配置内存最大映射数,编辑/etc/sysctl.conf文件,添加以下配置后,运行sysctl -p,使配置生效:
vm.max_map_count = 655360

2、增加最大文件打开数及最大进程数等,编辑/etc/security/limits.conf,添加以下内容:
#* soft nproc 65535
#* hard nproc 65535
# End of file
#
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 8192

注:
1、部署过程中遇到问题,需要重新登录用户才可生效。
2、启动时,需要确认本地是否安装java环境,若无可修改bin/elasticsearch文件,调用java的路径,如下:

export JAVA_HOME=/app/elasticsearch-7.15.2/jdk
export PATH=$JAVA_HOME/bin:$PATH

if [ -x "$JAVA_HOME/bin/java" ]; then
    JAVA="/app/elasticsearch-7.15.2/jdk/bin/java"
else
    JAVA=`which java`
fi
  • 启动服务:./elasticsearch-7.15.2/bin/elasticsearch -d

2)部署Kibana

  • 将Kibana安装包上传到master机器上,并进行解压。
  • 修改配置文件config/kibana.yml,如下:
server.port: 5601
server.host: "172.32.10.14"
elasticsearch.hosts: ["http://172.32.10.14:9200","http://172.32.10.15:9200","http://172.32.10.16:9200"]
kibana.index: ".kibana"
  • 运行Kibana服务。
nohup ./kibana-7.15.2-linux-x86_64/bin/kibana >> /home/user/logs/kibana.log &

3)部署Kafka和Zookeeper

  • 将Kafka安装包上传到master、node1、node2机器上,并进行解压。
  • Kafka使用Zookeeper来管理配置,以及master选举。这里使用Kafka自带的Zookeeper来安装配置。
  • 配置Zookeeper,修改kafka安装包下的config/zookeeper.properties文件,如下:
dataDir=/app/kafka_2.12-2.8.2/zk/data
dataLogDir=/app/kafka_2.12-2.8.2/zk/logs
clientPort=2181
tickTime=2000
initLimit=20
syncLimit=10
server.1=172.32.10.14:2888:3888
server.2=172.32.10.15:2888:3888
server.3=172.32.10.16:2888:3888
maxClientCnxns=0
  • 在zk数据存放目录,创建一个myid文件,每台kafka机器都必须唯一,可以按顺序,在每份文件中,分别录入连续的数字即可。
tree zk
zk
├── data
│   ├── myid
│   └── version-2
│       ├── acceptedEpoch
│       ├── currentEpoch
│       ├── snapshot.0
│       ├── snapshot.35
│       └── snapshot.49
└── logs
    └── version-2
        ├── log.1
        ├── log.100000001
        ├── log.200000001
        ├── log.200000007
        ├── log.36
        └── log.400000001
  • 配置kafka,并修改安装包下config/server.properties文件。
broker.id=1
listeners=PLAINTEXT://172.32.10.14:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/app/kafka_2.12-2.8.2/kafka-logs
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=172.32.10.14:2181,172.32.10.15:2181,172.32.10.16:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
  • 运行以下命令,启动ZK集群。
nohup ./bin/zookeeper-server-start.sh config/zookeeper.properties >> /home/user/zookeeper.log &
  • 运行以下命令,启动Kafka集群。
nohup ./bin/kafka-server-start.sh config/server.properties  >> /home/user/kafka_server.log &
其他命令:

1、创建Topic
./bin/kafka-topics.sh --create --zookeeper 172.32.10.14:2181,172.32.10.15:2181,172.32.10.16:2181 --replication-factor 1 --partitions 1 --topic topic_name

2、查询Topic
./bin/kafka-topics.sh --zookeeper 172.32.10.14:2181,172.32.10.15:2181,172.32.10.16:2181 --list

3、删除Topic
./bin/kafka-topics.sh --delete --zookeeper 172.32.10.14:2181,172.32.10.15:2181,172.32.10.16:2181 --topic topic_name

注意,启动时也存在jdk问题,需要在./bin/kafka-run-class.sh文件修改,如下配置:
export JAVA_HOME=/app/elasticsearch-7.15.2/jdk
#echo $JAVA_HOME
# Which java to use
if [ -z "$JAVA_HOME" ]; then
  JAVA="java"
  #JAVA="/home/user/jdk1.8.0_361/bin/java"
else
  JAVA="$JAVA_HOME/bin/java"
  #JAVA="/home/user/jdk1.8.0_361/bin/java"
fi

4)部署Logstash

  • 将Logstash安装包上传到master机器上,并进行解压。
  • 在配置文件/app/logstash-7.15.2/config/conf目录添加filter.conf 、input.conf 、output.conf等配置文件。
input{
    kafka{
        type => "kafka_nginx"
        codec => "json"
        topics => ["nginx_access_x","nginx_error_x"]
        decorate_events => true
        consumer_threads => 5
        bootstrap_servers => "172.32.10.14:9092,172.32.10.15:9092,172.32.10.16:9092"
    }
}

filter {
    if [@metadata][kafka][topic] == "nginx_access_zd" {
        grok {
          match => { "message" => "%{IP:remote_addr} - %{DATA:remote_user} \[%{HTTPDATE:request_time}\] \"%{WORD:request_method} %{URIPATHPARAM:url_args} %{URIPROTO:protocol}/%{DATA:treaty}\" %{NUMBER:status} %{NUMBER:body_sent_bytes} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" \"%{DATA:X_Forwarded_For}\" %{DATA:host} %{URIPATH:uri}" }
        }
    }
    if [@metadata][kafka][topic] == "nginx_error_zd" {
        grok {
          match => { "message" => "%{DATA:error_time} \[%{DATA:error_type}\] %{DATA:error_info}, client: %{DATA:client}, server: %{DATA:server}, request: %{DATA:request}, host: \"%{DATA:host}\"" }
        }
    }
}

output {
    if [@metadata][kafka][topic] == "nginx_access_x" {
        elasticsearch {
            hosts => ["172.32.10.14","172.32.10.15","172.32.10.16"]
            index => 'nginx-access-x-%{+YYYY-MM-dd}'
        }
    }
    if [@metadata][kafka][topic] == "nginx_error_x" {
        elasticsearch {
            hosts => ["172.32.10.14","172.32.10.15","172.32.10.16"]
            index => 'nginx-error-x-%{+YYYY-MM-dd}'
        }
    }
}
  • 启动Logstash服务
nohup ./bin/logstash -f ./config/conf/ --config.reload.automatic  >> /home/user/logstash.log &

5)部署Filebeat

  • 在测试机或每台需要采集日志的服务器部署,上传安装包到node3机器上,并解压。
  • 修改配置文件filebeat.yml,配置如下:
filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  tags: ["nginx_access_x"]
  fields:
    topic: nginx_access_x

- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/error.log
  tags: ["nginx_error_x"]
  fields:
    topic: nginx_error_x


output.kafka:
    hosts: ["172.32.10.14:9092","172.32.10.15:9092","172.32.10.16:9092"]
    topic: '%{[fields.topic]}'


注:
Exiting: error unpacking config data: more than one namespace configured accessing 'output' (source:'filebeat-7.15.2-linux-x86_64/filebeat.yml')
注释默认output原始配置
  • 启动filebeat服务。
nohup ./filebeat-7.15.2-linux-x86_64/filebeat -e -c ./filebeat-7.15.2-linux-x86_64/filebeat.yml >> filebeat.log &

6)配置Kibana的Index

为了将ES中保存的nginx日志取出,还需要配置Kibana的索引,用于查看ES日志。

  • 使用浏览器登录Kibana, 在"Management"中,配置Kibana的"Index Patterns”,根据保存在ES中的Index格式,我们可以配置为"logstash-nginx*"。
    在这里插入图片描述
  • 配置完成后,即可在"Discover"中,使用该Kibana的index,查询和过滤ES中的日志数据了。
    在这里插入图片描述

后续日志切割、字段优化等操作,将根据实际遇到的问题持续更新。

【日志审计】Ngnix日志filter记录,日志切割

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值