欢迎光临
我们一直在努力

ELK 处理 Percona 审计日志(填坑)

前提

1、有强烈的审计需求。

2、能允许10%-15%左右的性能损失。

3、有强烈的对数据库操作实时查看需求(一般都是为了领导要求)。

Logstash 比较坑的配置

input {
    file {
        path => [\"/u02/backup/audit.log\"]
        codec => json
    }
}
output {
    elasticsearch {
        hosts  => [\"192.168.1.233\"]
    }
}

上面的配置看上去是没有问题的,如果是一般的json数据哪就能解析成功了,

但是在 Percona audit plugin 中应用程序应用程序生成的SQL是五花八门,各种字符都有其中有。

如下审计的日志被 python 读取后的字符串展现(红色标记):

从上图可以看到有一些换行后tab的字符,这些字符使用 json.load 的时候会报错,不能解析成json

使用python json 模块解析相关日志文件报错:

>>> json.loads(json_line)
Traceback (most recent call last):
  File \"<stdin>\", line 1, in <module>
  File \"/usr/lib64/python2.7/site-packages/simplejson/__init__.py\", line 516, in loads
    return _default_decoder.decode(s)
  File \"/usr/lib64/python2.7/site-packages/simplejson/decoder.py\", line 370, in decode
    obj, end = self.raw_decode(s)
  File \"/usr/lib64/python2.7/site-packages/simplejson/decoder.py\", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.scanner.JSONDecodeError: Invalid control character \'\\t\' at: line 1 column 232 (char 231)

所以在使用logstash的时候也就解析不了这样的json数据了,

最终logstash只能报错并将整个message记录到 Elasticsearch 中

解决办法

解决办法就是把这些字符替换掉。如下 Logstash 配置文件

input {
    file {
        path => [\"/u02/backup/audit.log\"]
    }
}

filter {
    mutate {
        gsub => [\"message\", \"\\\\\\\\n\", \" \"]
        gsub => [\"message\", \"\\t\", \" \"]
        replace => [ \"message\", \"%{message}\" ]
    }
    json{
        source => \"message\"
    }
    mutate {
         remove_field => [ \"message\" ]
    }
}

output {
    elasticsearch {
        hosts  => [\"192.168.1.233\"]
    }
}

该配置文件是投机取巧的办法, 把 (换行/tab) 字符替换成空格,要注意的一点最终显示的SQL和原来的有所差别。

这种方法有点不灵活如果sql语句中还有遇到一些json不能解析的字符又要进行处理。

>>朋友们如果有更好的方法也告知一声哈!<<<

还不能笑到最后

刚开始以为这一切都万事大吉了。其实还有个一坑就是在使用 Kibana 查看的时候,这时候问题就来了。

有是有过 Percona audit 插件的估计都有这样的问题,就是他记录的是时间是国际形式的(如上图黄色标记),不像我们习惯了北京时间。因此在页面显示的时间会比我们平时的少 8 小时。

一般来说在ELK中使用国际的标准格式是合理的。因为在使用 Kibana 查看的时候会帮你自动转化成本地时间格式。也就是如果我们在中国他会自动把 timezone 转化为 Asia/Shanghai(东8区) 的。所以显示的时间应该是正确的才对。可是实际情况并没有。

没有转化的原因

是应为 Elasticsearch 将 \”2016-08-30T01:45:30 UTC\” 这串字符解析成了String类型。按道理应该解析成和@timestamp一样的date类型。

解决思路

将 \”2016-08-30T01:45:30 UTC\” 格式转化成和 @timestamp 一样的格式(\”2016-08-30T01:45:30Z\”)

最终配置文件如下

input {
    file {
        path => [\"/u02/backup/audit.log\"]
    }
}

filter {
    mutate {
        gsub => [\"message\", \"\\\\\\\\n\", \" \"]
        gsub => [\"message\", \"\\t\", \" \"]
        replace => [ \"message\", \"%{message}\" ]
    }

    json{
        source => \"message\"
    }

    mutate {
        remove_field => [ \"message\" ]
        gsub => [\"[audit_record][timestamp]\", \" UTC\", \"Z\"]
        replace => [ \"[audit_record][timestamp]\", \"%{[audit_record][timestamp]}\" ]
    }
}

output {
    elasticsearch {
        hosts  => [\"192.168.1.233\"]
    }
}

使用上面配置就能顺利的将 时间格式 转化成 Elasticsearch 想要的时间格式,并且能在 Kibana 中正确显示。

祝大家好运。

 

昵称: HH

QQ: 275258836

ttlsa群交流沟通(QQ群②: 6690706 QQ群③: 168085569 QQ群④: 415230207(新) 微信公众号: ttlsacom)

感觉本文内容不错,读后有收获?

赞(0) 打赏
主机商所有内容均来自网络,若无意侵犯到您的权利,请及时与联系 QQ 2232175042,将在48小时内删除相关内容!!主机测评网 » ELK 处理 Percona 审计日志(填坑)

主机商评测网 找服务器 更专业 更方便 更快捷!

专注IDC行业资源共享发布,给大家带来方便快捷的资源查找平台!

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫