初识osquery
相关资料
外网:osquery的安装与使用、osquery初识、osquery架构
介绍
osquery是一个由FaceBook开源用于对系统进行查询、监控以及分析的一款软件 。
我们在Linux中使用诸如ps、top、ls -l等等命令的时候,可以发现其实他们的输出结果的格式都是很固定的很像一张表。或许是基于这样的想法,facebook开发了osquery。
osquery将操作系统当作是一个高性能的关系型数据库。使用osquery运行我们能够使用类似于SQL语句的方式去查询数据库中的信息,比如正在运行的进程信息,加载的内核模块,网络连接,浏览器插件等等信息(一切查询的信息的粒度取决于osquery的实现粒度了)。
osqueryi是使用SQLite作为查询引擎,但是并没有使用SQLite来存储数据。大部分的数据都是在查询时通过一个虚表得到的。osquery通过嵌入的RocksDB来存储数据。
安装
1、在官网下载osquery的安装包。本文以centos7环境为例,下载4.5.1的rpm包
2、切到安装包目录,执行命令:
rpm -ivh osquery-4.5.1-1.linux.x86_64.rpm
运行
两种模式介绍
osquery存在两种运行模式,分别是osqueryi(交互式模式)、osqueryd(后台进程模式)。
- osqueryi:与osqueryd安全独立,不需要以管理员的身份运行,能够及时地查看当前操作系统的状态信息。
- osqueryd:我们能够利用osqueryd执行定时查询记录操作系统的变化,例如在第一次执行和第二次执行之间的进程变化(增加/减少),osqueryd会将进程执行的结果保存(文件或者是直接打到kafka中)。osqueryd还会利用操作系统的API来记录文件目录的变化、硬件事件、网络行为的变化等等。osqueryd在Linux中是以系统服务的方式来运行。
osqueryi交互模式
启动osquery:
基本操作
输入.help,可以看到osqueryi模式下的一些基本操作:
.tables 可以查看当前操作系统下所支持的所有表。osquery表结构可参考:Tables
.schema [表名] 可以查看具体的表的DDL(根据表名模糊查询)
查询SQL(虚表查询)
为了方便展示,这里使用 .mode pretty 模式,如果字段很多,可以调整为.mode line 模式
1、查询OS版本:
2、查询系统信息(只查询某些字段):
3、查询 yum 包信息(带过滤条件、排序、limit):
osqueryd后台进程模式
允许osquey访问系统日志
1、切到 /etc/rsyslog.d/ 目录下,创建 osquery.conf 文件(文件要是*.conf文件),在文件中增加如下内容:
template( name="OsqueryCsvFormat" type="string" string="%timestamp:::date-rfc3339,csv%,%hostname:::csv%,%syslogseverity:::csv%,%syslogfacility-text:::csv%,%syslogtag:::csv%,%msg:::csv%\n" ) *.* action(type="ompipe" Pipe="/var/osquery/syslog_pipe" template="OsqueryCsvFormat")
2、保存后重启 syslog 守护进程:
systemctl restart rsyslog
创建 osquery 配置文件
osquery默认读取配置文件的地址:/etc/osquery/osquery.conf
配置文件组成:
- options: 程序的启动和初始化选项配置
- schedule: 查询计划。包含查询SQL以及查询频率(秒)
- decorators: 用于向其它查询计划或者日志中添加额外的数据
- packs: 包含特定查询的包列表(安装osquery时,会在/usr/share/osquery/packs下提供一组默认包)
1、在/etc/osquery下创建配置文件:osquery.conf,并粘贴如下配置:
{ "options": { "config_plugin": "filesystem", "logger_plugin": "filesystem", "logger_path": "/var/log/osquery", "disable_logging": "false", "schedule_splay_percent": "10", "pidfile": "/var/osquery/osquery.pidfile", "events_expiry": "3600", "database_path": "/var/osquery/osquery.db", "verbose": "false", "worker_threads": "2", "disable_events": "false", "disable_audit": "false", "audit_allow_config": "true", "host_identifier": "hostname", "enable_syslog": "true", "audit_allow_sockets": "true", "schedule_default_interval": "3600" }, "schedule": { "crontab": { "query": "SELECT * FROM crontab;", "interval": 300 }, "system_profile": { "query": "SELECT * FROM osquery_schedule;" }, "system_info": { "query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;", "interval": 3600 } }, "decorators": { "load": [ "SELECT uuid AS host_uuid FROM system_info;", "SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;" ] }, "packs": { "osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf", "incident-response": "/usr/share/osquery/packs/incident-response.conf", "it-compliance": "/usr/share/osquery/packs/it-compliance.conf", "vuln-management": "/usr/share/osquery/packs/vuln-management.conf" } }
配置说明:
options
- config_plugin:希望osquery从哪里读取其配置。默认情况下,它是从磁盘上的文件中读取的,因此它的值为filesystem。
- logger_plugin:指定osquery应写入预定查询结果的位置。我们将再次使用filesystem。
- logger_path:这是日志目录的路径,您可以在其中找到包含信息,警告,错误和计划查询结果的文件。默认情况下为/var/log/osquery。
- disable_logging:通过将此值设置为false,我们可以启用日志记录。
- schedule_splay_percent:这告诉osquery,当以相同的间隔调度大量查询时,为了限制对服务器的性能影响,将它们分开运行。默认值为10百分比。
- pidfile:在哪里编写osquery守护进程的进程id。默认为/var/osquery/osquery.pidfile。
- events_expiry:以秒为单位,将订阅者结果保留在osquery后备存储中的时间。开箱后设置为3600。
- database_path:osquery数据库的路径。我们将使用默认值,即/var/osquery/osquery.db。
- verbose:启用日志记录后,将用于启用或禁用详细信息性消息。我们将此设置为false。
- worker_threads:用于处理查询的工作分派线程数。默认设置为2,我们将保留它。
- disable_events:用于管理osquery的发布/订阅系统。我们需要启用此功能,因此此处的值将设置为false。
- disable_audit:用于禁用从操作系统的审计子系统接收事件。我们需要启用它,因此这里使用的值将是false。
- audit_allow_config:允许审计发布者更改审计配置。默认是true。
- audit_allow_sockets:允许审计发布者安装与套接字相关的规则。此值设置为true。
- host_identifier:用于标识运行osquery的主机。当聚合来自多个服务器的结果时,有助于轻松确定特定日志条目来自哪个服务器。此值为hostname或uuid。
- enable_syslog:为了使osquery使用syslog信息,必须将其设置为true。
- schedule_default_interval:未设置预定查询的时间间隔时,请使用此值。它大约几秒钟,我们将把它设置为3600。
schedule
- query:定义需要执行的SQL语句
- interval:定时执行的时间(单位:秒)
- snapshot:是否为快照模式(缺省false)。true表示为增量模式,false为快照模式。增量模式:每次产生的结果是相比上一次变化的结果,快照模式:显示所有的数据,不会与之前的结果进行对比
- removed:是否记录action为remove的日志(缺省true)
2、保存,验证配置文件:
osqueryctl config-check
没有报错信息则证明配置没有问题
3、配置osquery 文件完整性监控(FIM)
osquery 使用 file_path 检测自定义目录上的任务一个文件的更改,然后将所有活动存储到 file_events 表中。
切到 /usr/share/osquery/packs 目录下,创建文件:fim.conf,增加如下内容:
{ "queries": { "file_events": { "query": "select * from file_events;", "removed": false, "interval": 300 } }, "file_paths": { "homes": [ "/root/%%", "/home/%%" ], "etc": [ "/etc/%%" ], "home": [ "/home/%%" ], "tmp": [ "/tmp/%%" ] } }
说明:每300秒监控一次 file_paths 下配置的文件的变化,并记录到file_events表中
保存文件,并在/etc/osquery/osquery.conf 的packs中增加fim的配置:
启动osqueryd后台进程
1、启动命令
osqueryd
2、查看日志
后台进程osqueryd允许osquery以设定的事件间隔运行查询,这些查询包括在osquery.conf配置的查询。生成的查询结果会写入到 /var/log/osquery/osquery.results.log文件中
过一会可以看到打印出 incident-response.conf 中的配置的 iptables 的查询信息:
测试fim
1、在 /home 目录下添加一个文件 fim.txt,查看日志:
2、也可以使用osqueryi交互式查看。执行命令:
osqueryi --config-path /etc/osquery/osquery.conf
3、然后执行查询SQL:
虚表中的数据可能会定期删除