初识osquery

发布时间 2023-07-27 09:52:02作者: 仅此而已-远方

相关资料

官网:HomeGitHubDocs

外网: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模式下的一些基本操作:

.show 展示当前 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"
  }
}
osquery.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:

虚表中的数据可能会定期删除