数据库 MySQL Redis MongoDB

简介

go-sniffer 可以抓包截取项目(MySQL、Redis、MongoDB)中的请求并解析成相应的语句,并格式化输出。类似于在之前的文章 MySQL抓包工具:MySQL Sniffer中介绍的mysql-sniffer。而 go-sniffer 可以对更多数据库进行抓包分析,现在来介绍在什么情况下会使用该工具的。

使用

下载:

github 地址:https://github.com/40t/go-sniffer

安装:

安装依赖包:

Centos:

  1. yum -y install libpcap-devel

Ubuntu:

  1. apt-get install libpcap-dev

另外还需要安装golang,并且版本需要在1.10.3以上。

  1. wget https://golang.org/dl/go1.10.3.linux-amd64.tar.gz

设置好相关的环境变量。如果不想要go环境 ,则可以直接在其他地方安装好go-sniffer之后,复制到目标服务器上直接使用。

下载安装

— 安装好go环境的服务器上:

  1. go get -v -u github.com/40t/go-sniffer cp -rf $(go env GOPATH)/bin/go-sniffer /usr/local/bin

—安装到设置好的go环境变量的目录里 go-sniffer
参数说明:

  1. go-sniffer --help
  2. [使用说明]
  3. go-sniffer [设备名] [插件名] [插件参数(可选)]
  4. [例子]
  5. go-sniffer en0 redis 抓取redis数据包
  6. go-sniffer en0 mysql -p 3306 抓取mysql数据包,端口3306
  7. go-sniffer --[命令]
  8. --help 帮助信息
  9. --env 环境变量
  10. --list 插件列表
  11. --ver 版本信息
  12. --dev 设备列表
  13. [例子]
  14. go-sniffer --list 查看可抓取的协议
  15. =======================================================================
  16. [设备名] : lo0 : 127.0.0.1
  17. [设备名] : en0 : x:x:x:x:x5:x 192.168.1.3
  18. [设备名] : utun2 : 1.1.11.1

语法:

  1. $ go-sniffer lo0 mysql
  2. $ go-sniffer en0 redis
  3. $ go-sniffer eth0 http -p 8080
  4. $ go-sniffer eth1 mongodb

使用场景

一、Redis:审计、发现热点key

关于Redis的知识点就不说了,主要来说明如何使用go-sniffer来抓包分析。如果想发现哪个key的操作比较多或则是否存在热点key,在Redis4.0之前没有什么好办法(4.0之后的LFU可以查看hotkey),只有通过统计各个客户端发来的命令进行统计。虽然monitor可以看到某一刻的key操作,但是该命令消耗巨大,可能会造成客户端缓冲区溢出。并且也没有合适的插件来进行实现。即使有的话,对Redis的性能肯定有一定的损耗,所以只有监控其网络来分析操作是对Redis服务的影响最小的。如对一个实例进行监控:go-sniffer eth0 redis -p 6379 >> out.log 对通过eth0网卡的客户端访问端口为6379的Redis服务进行抓包,并把信息写到文件中。该文件的日志格式:

  1. tcp and port 6379 get abc
  2. get abc
  3. get abc
  4. get abc
  5. get opq
  6. get opq
  7. get opq
  8. get opq
  9. get xyz
  10. get xyz
  11. get xyz

可以看到,该文件的信息就是操作日志,最后可以通过使用awk来分析,也可以把该日志文件写入到数据库的表里进行统计分析:

  1. grep -avEi "^#|^$|^tcp|^ INFO|^ AUTH|^ REPLCONF ACK|^ CONFIG GET" out.txt |awk '{print $1,$2}'|sort| uniq -c | sort -nr |head -n 10
  2. 5 get abc
  3. 4 get opq
  4. 3 get xyz

注意:go-sniffer也需要消耗一定的资源,大致的消耗可以看以下表格:

OPS Redis CPU sniffer CPU
1.2W 20% 30%
5.5W 80% 140%
7.5W 98% 180%

从上面看到,go-sniffer所需要的CPU资源是Redis的2倍左右。所以,在使用该工具之前,先判断本身服务器的资源是否够用。

二、MySQL:审计

  1. go-sniffer eth0 mysql -p 3306 >> out.log

三、MongoDB:审计

  1. go-sniffer eth0 mongodb -p 27017 >> out.log