纵横ELK:爬取Kibana数据实现资源监控

前言

很多大型企业都会使用ELK或者EFK来进行日志存储,在运维管理过程中自然就催生了实时监控日志或索引体量的需求,如果不进行资源监控和预报警的话,一旦ES的积累到一个阈值就会自动切换成只读,工程师不仅面临加班的困扰还影响了应用方的正常使用。

应用方在使用ES的时候不会一直使用同一个索引,它们很有可能在创建不同索引时使用序号或者日期作为索引的后缀,以便区分。我们可以在给应用方创建账号时强制要求该账号使用预分配索引开头,这样既便于管理,也是一种关于数据安全的权限区分。

但是,虽然Kibana提供了逐个显示索引信息的索引级命令,但是想要以聚合的方式自动化地获取这些统一格式开头的索引的总存储大小,Kibana并没有给出太方便的命令。所以才有了如下探索。

尝试爬虫直接爬取Kibana

直接尝试爬虫来爬取Kibana的页面不失为一种简单又高效的好办法,毕竟Kibana的 Index Management 页面已经清晰的展示了数据,就等着我们爬取了,而且爬虫获取数据不会受到内部网关的限制。

如上是一个简易爬虫尝试。但是事实上并没有那么轻松,因为它会受到ES的ESP机制的阻拦。由于时间有限,笔者今天没有进行进一步尝试,如果你有好的绕过方法,欢迎与我交流。爬取到的信息如下

利用Python和Burp编写脚本获取数据

经过尝试,我们可以利用Burp抓取访问Kibana的关键数据包,并进行重放的来随时获取想要的ES集群数据。通过Python自动化实现这一过程,再加上一个简易的前端,那么应用方便可以随时监测自己的数据使用情况了。

首先抓取能够获得目标数据的关键包,并将其重放 intruder

修改一下body中的参数,即可获得目标索引的聚合数据。尝试重放,显然是成功了。

我们使用Python来重新构造这个数据包

# 将数据转换为 JSON 格式
json_data = json.dumps(data_to_send)

url = 'http://ip:5601/api/index_management/indices/reload'
headers = {
    'Host': 'ip:5601',
    'Content-Length': '32',
    'kbn-version': 'xxx',
    'x-kbn-context': 'xxx',
    'User-Agent': 'xxx',
    'kbn-system-request': 'true',
    'Content-Type': 'application/json',# 发送数据为json
    'Accept': '*/*',# 接受任何类型的返回数据
    'Origin': 'http://ip:5601',
    'Referer': 'http://ip:5601/app/management/data/index_management/indices',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cookie': 'xxx',
    'Connection': 'close',
}
body = json_data
ret = requests.post(url=url, headers=headers, data=body)

# 将 ret 内容保存到 output.txt 文件
save_to_txt(ret.text, "xxx.txt")

用Requests发送到目标服务器的Kibana,然后再将返回结果进行处理

# 读取txt文件
with open('burp1.txt', 'r') as file:
    # 跳过开头的无关信息行,直到遇到JSON数据
    for line in file:
        if line.strip().startswith('{'):
            break

    # 将文件内容加载为JSON数组 #如果文件为空就会出现报错
    data = json.loads(line)

# 提取所有"size"项的数据
sizes = [item.get('size') for item in data if 'size' in item]

# 输出结果
#print(sizes)

# 转换为以GB为单位的值并相加
total_size_gb = sum(convert_to_gb(size) for size in sizes)

# 将total_size_gb转换为字符串,小数点后面的舍去
total_size_str = str(int(total_size_gb))

# 输出结果
print(total_size_str+"GB")

就能输出所有以 dsmm* 开头的索引的大小之和了。在这个过程中舍弃掉了大小以B和Kb为单位的索引,而将Mb和Gb为单位的索引进行了算数相加。通过这个脚本能够实现自动化监测任意集群和任意索引名的占用空间大小。

总结

从安全的角度来说,ES没有对重放数据包进行检测。但从运维的角度来说,开发一些小工具来辅助运维,能达到一个不错的效果。

欢迎关注我的公众号“闪客未来”解锁更多内容

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值