SIEM(security information and event management),顾名思义就是针对安全信息和事件的管理系统,针对大多数企业是不便宜的安全系统,本文结合作者的经验介绍如何使用开源软件离线分析数据,使用攻击建模的方式识别攻击行为。
以数据库为例,通过 logstash 搜集 mysql 的查询日志,近实时备份到 hdfs 集群上,通过 hadoop 脚本离线分析攻击行为。
常见的数据日志搜集方式有三种:
大多数数据库审计产品都支持这种模式,通过分析数据库流量,解码数据库协议,识别 SQL 预计,抽取出 SQL 日志
比较典型的就是 db-proxy 方式,目前百度、搜狐、美团、京东等都有相关开源产品,前端通过 db-proxy 访问后端的真实数据库服务器。SQL 日志可以直接在 db-proxy 上搜集。
通过在数据库服务器安装客户端搜集 SQL 日志,比较典型的方式就是通过 logstash 来搜集,本文以客户端方式进行讲解,其余方式本质上也是类似的。
下载 logstash 目前最新版本 5.2.1 版
- input {
- file {
- type = >"mysql_sql_file"path = >"/var/log/mysql/mysql.log"start_position = >"beginning"sincedb_path = >"/dev/null"
- }
- }
- output {
- kafka {
- broker_list = >"localhost:9092"topic_id = >"test"compression_codec = >"snappy"#string(optional),one of["none","gzip","snappy"],
- default:
- "none"
- }
- }
- bin/logstash -f mysql.conf
- 2017-02-16T23:29:00.813Z localhost 170216 19:10:15 37 Connect
- debian-sys-maint@localhost on
- 2017-02-16T23:29:00.813Z localhost 37 Quit
- 2017-02-16T23:29:00.813Z localhost 38 Connect debian-sys-maint@localhost on
- 2017-02-16T23:29:00.813Z localhost 38 Query SHOW VARIABLES LIKE 'pid_file'
最简化操作是不用进行切词,如果喜欢自动切分出数据库名,时间等字段,请参考:
grok 语法
grok 语法调试
以常见的 wavsep 搭建靶场环境,请参考我的另外一篇文章《 》
分析攻击特征,下列列举两个,更多攻击特征请大家自行总结
- 2017 - 02 - 16T23: 29 : 00.993Z localhost 170216 19 : 19 : 12 46 Query SELECT username,
- password FROM users WHERE username = 'textvalue'UNION ALL SELECT NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL#' AND password='textvalue2 ''
使用联合查询枚举数据时会产生大量的 NULL 字段
枚举数据库结构时会使用 INFORMATION_SCHEMA,另外个别扫描器会使用 GROUP BY x)a)
- 2017 - 02 - 16T23: 29 : 00.998Z localhost 46 Query SELECT username,
- password FROM users WHERE username = 'textvalue'AND(SELECT 7473 FROM(SELECT COUNT( * ), CONCAT(0x7171716271, (SELECT(CASE WHEN(8199 = 8199) THEN 1
- ELSE 0 END)), 0x717a627871, FLOOR(RAND(0) * 2)) x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x) a)--LFpQ ' AND password='textvalue2 ''
hadoop 是基于 map,reduce 模型
简化理解就是:
- cat data.txt | ./map | ./reduce
最简化期间,我们可以只开发 map 程序,在 map 中逐行处理日志数据,匹配攻击行为。
以 perl 脚本开发,python 类似
- #!/usr/bin/perl -w
- my $rule="(null,){3,}|information_schema|GROUP BY x\\)a\\)";
- my $line="";
- while($line=<>)
- {
- if( $line=~/$rule/i )
- {
- printf($line);
- }
- }
在 hadoop 下运行即可。
生产环境中的规则会比这复杂很多,需要你不断补充,这里只是举例;
单纯只编写 map 会有大量的重复报警,需要开发 reduce 用于聚合;
应急响应时需要知道 SQL 注入的是那个库,使用的是哪个账户,这个需要在 logstash 切割字段时补充;
应急响应时最好可以知道 SQL 注入对应的链接,这个需要将 web 的 accesslog 与 SQL 日志关联分析,比较成熟的方案是基于机器学习,学习出基于时间的关联矩阵;
客户端直接搜集 SQL 数据要求 mysql 也开启查询日志,这个对服务器性能有较大影响,我知道的大型公司以 db-prxoy 方式接入为主,建议可以在 db-proxy 上搜集;
基于规则识别 SQL 注入存在瓶颈,虽然相对 web 日志层面以及流量层面有一定进步,SQL 语义成为必然之路。
基于沙箱以及算法挖掘攻击,请见下文。
来源: http://www.tuicool.com/articles/ZvAZjuV