logstash分析sql注入攻击并将日志存储到es

      最近在用logstash做日志分析的时候,搜集了很多资料,但大部分都是关于logstash如何将日志各个部分加以分类存储到logstash中,没有写如何分析攻击日志的东西,所以在此我简单记录一下。

首先,logstash做日志分析最重要的还是过滤器的书写,logstash的过滤器支持grok匹配,而grok又是建立在正则表达式上面的,所以我们可以从这方面入手进行分析。

需求

1.将日志进行筛选,首先将所有日志进行常规分析,各个字段进行分类,存储到es中。

2.将可能是sql注入攻击的日志单独筛选出来,存入到es中

实现

1.首先看一下过滤器的编写

input {
file {     
   path => ["D:/logs/logs/*.log"]
   start_position => "beginning"   
   type=>"elasticsearch" 
   }
file {     
   path => ["D:/logs/logs/*.log"]
   start_position => "beginning"   
   type=>"sqlattrack" 
   }
}
filter{
if   [type] == "sqlattrack"{
    grok{
        match=>{"message" => ".*?[^a-zA-Z](?<tag_1>((and|or|union|select|insert|delete|count|updata|where))).*?"}
    }
  }
if   [type] == "elasticsearch"{
    grok{
        match=>{"message" => "%{IP:client_ip} - - \[%{HTTPDATE:timestamp}\] \"(%{WORD:verb} %{GREEDYDATA:request} HTTP/%{NUMBER:http_version}|{GREEDYDATA:request})\" %{NUMBER:response} %{NUMBER:buytes}"}
  }
 }
}
output {
if   [type] == "elasticsearch"{
    elasticsearch {
    hosts => ["192.168.137.102:9200"]
    index => "es_log_%{+YYYY.MM.dd}"
  }
    stdout{
      codec=>rubydebug
    }
}
if    [type] == "sqlattrack" and ([tag_1] =="and" or  [tag_1]=="or" or [tag_1]=="union" or [tag_1]=="select" or [tag_1]=="delete" or [tag_1]=="count" or [tag_1]=="updata" or [tag_1]=="where" or [tag_1]=="insert"){
    elasticsearch {
    hosts => ["192.168.137.102:9200"]
    index => "es_logsql_%{+YYYY.MM.dd}"
  }
    stdout{
      codec=>rubydebug
    }
}
}

logstash的config文件包含三大块,分别是input filter output,其中input和output比较好理解,相信大家看一下我的代码能看懂,我在此简单的解释一下:path就是我日志的路径,start_position是指从哪开始读,logstash默认是从文件末尾开始读的,我这里将其写为从文件首部开始读取,type字段可以自己起名,是一个标识字段,大家可以随意。我将日志读取了两遍,第一次是为了整体存储,第二次则是为了筛选可能存在攻击行为的日志,所以这两个type必须是不一样的。

output的判断是比较重要的,也就是根据type标识不同,将过滤得到的日志分别命名,存到es中。hosts就是我es的地址,index是索引名,相当于起一个在es中存储名字,可以类比做数据库的表名。我们主要看filter的写法。

在这里给大家推荐一个网址https://www.5axxw.com/tools/v2/grok.html,这个网站可以测试你的grok匹配是否正确

 第一个框填入你的日志,第二个框填入你编写的匹配规则,第三个框也就是得到的json数据。

在这里我就不解释比较简单的grok匹配了,大家可以对比一下,我将我日志的截图和分析结果放上来,这个市面上的资料是比较多的。

{
  "client_ip": [
    [
      "0:0:0:0:0:0:0:1"
    ]
  ],
  "IPV6": [
    [
      "0:0:0:0:0:0:0:1"
    ]
  ],
  "IPV4": [
    [
      null
    ]
  ],
  "timestamp": [
    [
      "21/Apr/2023:00:11:52 +0800"
    ]
  ],
  "MONTHDAY": [
    [
      "21"
    ]
  ],
  "MONTH": [
    [
      "Apr"
    ]
  ],
  "YEAR": [
    [
      "2023"
    ]
  ],
  "TIME": [
    [
      "00:11:52"
    ]
  ],
  "HOUR": [
    [
      "00"
    ]
  ],
  "MINUTE": [
    [
      "11"
    ]
  ],
  "SECOND": [
    [
      "52"
    ]
  ],
  "INT": [
    [
      "+0800"
    ]
  ],
  "verb": [
    [
      "GET"
    ]
  ],
  "request": [
    [
      "/picture/1.jpg"
    ]
  ],
  "http_version": [
    [
      "1.1"
    ]
  ],
  "BASE10NUM": [
    [
      "1.1",
      "200",
      "259033"
    ]
  ],
  "response": [
    [
      "200"
    ]
  ],
  "buytes": [
    [
      "259033"
    ]
  ]
}

然后给大家看一下他们在es中的存储样子

{
"_index": "es_log_2023.04.20",
"_type": "_doc",
"_id": "nv6unocBASMToJ6DaD2a",
"_version": 1,
"_score": 1,
"_source": {
"@version": "1",
"buytes": "433714",
"message": "0:0:0:0:0:0:0:1 - - [11/Apr/2023:08:23:19 +0800] "GET /js/vue.js HTTP/1.1" 200 433714 ",
"type": "elasticsearch",
"timestamp": "11/Apr/2023:08:23:19 +0800",
"request": "/js/vue.js",
"host": "WIN-Q87V9552R8L",
"verb": "GET",
"http_version": "1.1",
"response": "200",
"client_ip": "0:0:0:0:0:0:0:1",
"path": "D:/logs/logs/1.log",
"@timestamp": "2023-04-20T12:40:42.420Z"
}
}

 这些就是比较常规的,接下来我具体讲一下sql攻击匹配,可能方法比较笨,但百度实在找不到相关的东西,这也是我自己琢磨的。

首先是先找一个sql攻击的日志,然后匹配一下,这个比较简单,对你自己的网站进行sql注入攻击,得到的日志粘到刚才那个网站测试就好了。

.*?[^a-zA-Z](?<tag_1>((and|or|union|select|insert|delete|count|updata|where))).*?

这是我写的一个比较简单的匹配规则,.*?的意思是非贪婪匹配,匹配任意长度的任何字符串,但是是尽可能匹配少的,两边都是.*?也就是说这两边出现什么都可以,主要是有没有我括号里面的东西。

?<tag_1>的解释: tag_1是我自己起的名字,就是相当于变量名,他的匹配规则就是我后面写的那些,当匹配到后面的东西时,他的值就是匹配到的东西,否则就是null。在我的表达式里面,我仅对几种比较常见可能存在sql注入攻击的字符进行匹配,大家可以根据我这个写法进行扩写

然后看output就比较轻松了,当tag_1的字符是这几个时,可能是攻击行为,将其存到可能存在攻击的日志中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Logstash是一个开源的数据收集引擎,可以从各种源(例如SQL Server)收集数据并将其转发到目标存储(例如Elasticsearch)。 首先,您需要在Logstash的配置文件中定义输入和输出插件。对于SQL Server,您可以使用`jdbc`插件来连接数据库并执行查询,然后使用`elasticsearch`插件将结果发送到Elasticsearch。 在配置文件中,您需要提供SQL Server数据库的连接详细信息,例如主机名、端口、数据库名称、用户和密码。您还需要指定要执行的查询语句和将数据发送到Elasticsearch的目标索引。 以下是一个示例配置文件的概述: ``` input { jdbc { jdbc_driver_library => "path_to_sqlserver_jdbc_driver" jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" jdbc_connection_string => "jdbc:sqlserver://<host>:<port>;databaseName=<database>" jdbc_user => "<username>" jdbc_password => "<password>" schedule => "* * * * *" statement => "SELECT * FROM <table>" } } output { elasticsearch { hosts => ["localhost:9200"] index => "my_index" } } ``` 在这个示例中,Logstash将每分钟执行一次查询,并将结果发送到名为`my_index`的Elasticsearch索引中。 通过运行Logstash并指定配置文件,您可以开始将数据从SQL Server导入到Elasticsearch。例如,使用以下命令运行Logstash: ``` bin/logstash -f path_to_config_file.conf ``` Logstash将会自动连接到SQL Server数据库,执行查询,并将结果发送到Elasticsearch。 总结起来,使用Logstash的`jdbc`和`elasticsearch`插件,可以轻松实现从SQL Server到Elasticsearch的数据传输。只需定义合适的配置文件,并在Logstash中运行它即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值