系统安全监控DIY:动手做Osquery Agent

  如何写agent的文章有太多,做系统安全监控的文章也有很多,有些出色的开源安全工具和一些安全服务,其中ossec在众多的企业运用广泛,但复杂的配置和复杂的规则特性很难做到快速部署,对于安全来说时间就是”金钱”,今天我们的主角是facebook开源的osquery,通过集成osquery来实现快速监控系统安全,通过编写简单的agent来做到分布式服务器监控。

  But, osquery 有一个很大的缺陷,就是他不能通过远程操作, 至少笔者是没有看到任何远程操作的方案,只有通过定制log日志或者上服务器运行命令才行,这样对我们我们N台服务器的管理和部署就显得及其不方便了,经过一番github上的搜索找到了osqeury的python库,既然能用python来控制他,那就可以做成分布式来agent来管理它。

  有方案就会有踩坑,在开发之初,笔者采用的是celery这款分布式列队神器来对各个系统进行管理,但最后发现下发任务只能被执行一次,多个节点没办法做到同事计算,所以对管理大量的服务器来说,它不能胜任,所以还是决定自己动手来实现agent的管理,任务的下发和服务器的监控。

  我们通过生产者消费者模型来出发相关任务,通过让消息队列发送任务,让Client接受到任务(包括定时任务和非定时任务),通过任务的操作,把结果写入到mysql数据库中,并且服务器中的Agent会上报状态给redis,告知服务器的ip和服务器现在的状态等。

  代码分服务端和客户端,服务端来发送任务,客户端来执行任务,非常简单,我们来解读下代码:

  整个客户端就是获取任务,执行任务的过程都是动态的,也就是任务可以进行自定义。

  是不是非常简单?这样我们就能不断的提供给它规则,让它去执行就可以了,其实在这之前,我们还需要获得agent的相关信息,我给它定义了一个方法叫uploadAgentInfo,我们来看下

  其实在这个方法中,我们可以看出,它上传了此agent的ip到redis,这样,我们的服务器就能获取到有多少agent和它相关的信息。当然config字典我们可以更加丰富它,并且我们可以,并且也可以做到实时的数据上传。

  说完agent,我们来看看服务端,其实服务端非常简单,下面就是服务端的工作,你没看错,就几行代码

  #规则缓存(需要手动或者使用脚本在redis中建立规则,redis中的规则用hash存储)

  这里需要注意的是,不管在服务端还是在客户端,这套代码是要相同部署的,我们可以用gitlab进行代码更新,用Jenkins来做到自动部署,是不是非常方便?至此,osquery的agent已经全部做完,目前也只是做到数据的采集,对规则和对数据的分析还未开始做,等以后有时间了,还会分享关于osquery的监控规则和对数据的分析,请期待。

相关阅读