在上一篇博文:实时查询腾讯云主机状态之利器——Osquery (安全篇)中,我们介绍了Osquery在安全分析、合规检测、威胁捕获中的应用场景。
而另一篇博文使用腾讯云自动化助手批量安装beats,则简单介绍了一下如何通过自动化助手批量安装Elastic Agent。
在本篇中,我们再来看一下,从运维的角度看,我们如何通过Osquery洞察一些运维调优,故障排查时所需要的信息。全文将展示数个简单的案例,帮助大家了解我们可以通过Osquery做哪些事情。而如果要想详细了解,则需要查看Osquery的官方文档。查看我们都支持哪些文档。
Elastic与Osquery的完美配合
当我们在生产环境中大量使用Osquery时,我们会遇到两个主要的问题:
- Osquery 的设置与管理
- Osqeury 生成大量数据后的数据管理
- Osquery与其他工具的集成(Alert、SIEM、ITSM)
幸运的是,通过Elastic Stack与Osquery的集成,我们可以轻松解决这些问题。关于上面的第三点,我们在安全篇中已经做过介绍。本文,我们将介绍Osquery 的设置与管理,以及数据管理的内容
设置和管理
您将需要一个部署基础架构来将 osquery 交付到您的环境中,并需要一个配置计划来管理该工具。可选的项包括腾讯云自动化助手,以及各种DevOps工具,比如Ansible,Puppet,Chef; 但如果我们已经使用Elastic Stack的可观测性解决方案,Osquery就已经是这个方案中一部分,可以使用Ingeration功能,自然集成。比如,我们已经使用腾讯云自动化助手批量安装了Elastic Agent,
就可以非常简单的将Osquery安装到所有已经安装了Elastic Agent的主机上(filebeat, metricbeat, packbeat等功能,以同样的方式可以推送)
可以在安装的时候,添加更多的配置项:
可以在Fleet界面上查看运行状态:
数据存储
一旦收集到数据,就必须存储数据,这就是构建自己的 osquery 支出可能变得昂贵的地方。osquery没有统一的后端存储解决方案。但是,Elasticsearch会是一个非常好的选择。
重要的是要记住 osquery 产生的数据所需要的成本与你选择的解决方案有关,比如一些按流量计费的产品,当大量未经优化的数据通道进入 SIEM 时,这可能会导致高昂的传输和存储成本。
在我们的方案中,数据被自动存储到Elasticsearch当中,你不需要做任何的配置,就可以回溯每次运行的查询结果:
可以使用各种搜索工具查看:
运维查询案例
我们已经有了一个使用Osquery的完美方案,安装,配置,数据存储,数据查看都不是问题。现在, 我们再来看看一些简单的例子。
案例:macOS 和 Linux 系统中的磁盘加密
让我们从 disk_encryption 表开始。首先要注意的是,它只捕获基于 Linux 和 macOS 的系统的信息。
这是查询:
代码语言:sql复制SELECT * FROM disk_encryption;
结果:(not encrypted
)
请注意,输出并不是很有用。是的,该encryption_status
字段告诉我们分区是否已加密,但哪个分区很重要?什么需要加密?name
列是指分区的硬件设备,但调查人员通常不会记住这些。我们将需要另一个表中的信息:
SELECT * FROM mounts;
结果:
该path
列显示设备在系统中的安装位置。请注意该device_alias
列看起来很像name
上表中的列?JOIN
这意味着我们可以用!将这两个查询链接在一起。
SELECT m.device, m.device_alias, m.path, m.type, de.encryption_status
FROM mounts m
LEFT JOIN disk_encryption de ON de.name = m.device_alias
WHERE m.device LIKE '/dev/%'
ORDER BY m.device;
结果:
主机上的一些基本配置和服务
一些简单的例子:
代码语言:sql复制select * from etc_hosts
代码语言:sql复制select * from etc_services
代码语言:sql复制select * from interface_addresses
代码语言:sql复制//查看系统信息
select * from system_info;
//查看OS版本
select * from os_version;
//查看内核信息版本
SELECT * FROM kernel_info;
//内存信息
select * from memory_info;
//查询用户信息
select * from users;
select * from users where uid=0;
//检查计划任务
select * from crontab;
```sql
查看进程绑定端口的情况
代码语言:sql复制SELECT DISTINCT p.pid, p.name, l.port FROM listening_ports AS l JOIN processes AS p ON l.pid = p.pid WHERE l.address = '0.0.0.0';
结果:
查看Docker进程的信息
查看某个container运行的spring程序的版本
代码语言:sql复制SELECT path FROM docker_container_fs_changes where id="198679bbef727c1a24d71d65a03480d7f7746dba08599f1202d1584cac6a1e60" and path like "%spring%.jar"
结果:
一些外部资源
官方文档
https://osquery.readthedocs.io/en/stable/
Osquery在不同操作系统上支持的表
https://osquery.io/schema/
可以使用MITRE ATT&CK框架规则:
https://github.com/teoseller/osquery-attck
使用教程
https://www.uptycs.com/blog/tag/osquery-tutorial/