介绍
osquery是一个开源的安全工具,它需要一个操作系统,并将其变成一个巨大的数据库,您可以使用SQL语句查询表。 通过这些查询,您可以监视文件完整性,检查防火墙的状态和配置,对目标服务器执行安全审核等。
它是一个跨平台应用程序,支持最新版本的macOS,Windows 10,CentOS和Ubuntu。 它被官方描述为一个“SQL操作系统的仪器,监控和分析”框架,源自Facebook。
使用osquery,您可以运行命令,如select * from logged_in_users ;
对你的服务器,并得到一个结果像这样:
Output+-----------+----------+-------+------------------+------------+------+
| type | user | tty | host | time | pid |
+-----------+----------+-------+------------------+------------+------+
| login | LOGIN | ttyS0 | | 1483580429 | 1546 |
| login | LOGIN | tty1 | | 1483580429 | 1549 |
| user | root | pts/0 | 24.27.68.82 | 1483580584 | 1752 |
| user | sammy | pts/1 | 11.11.11.11 | 1483580770 | 4057 |
| boot_time | reboot | ~ | 4.4.0-57-generic | 1483580419 | 0 |
| runlevel | runlevel | ~ | 4.4.0-57-generic | 1483580426 | 53 |
+-----------+----------+-------+------------------+------------+------+
如果这吸引你,你会喜欢使用osquery作为您的服务器的系统安全监控和入侵检测工具。
安装osquery可以访问以下组件:
-
osqueryi
:交互式osquery shell,用于执行即席查询。 -
osqueryd
:在后台调度和运行查询的守护进程。 -
osqueryctl
:用于测试osquery的部署或配置的助手脚本。 它也可以用来代替操作系统的服务管理器来启动/停止/重启osqueryd
。
osqueryi
和osqueryd
是独立的工具。 他们不沟通,你可以使用一个没有其他。 大多数运行每个标记和选项是相同的,你可以使用osqueryd
的配置文件启动osqueryi
,所以你可以自定义环境,而不使用大量的命令行开关。
在本教程中,您将:
- 安装osquery。
- 配置操作系统的方面,如Rsyslog,osquery需要正常工作。
- 设置一个可以被
osqueryi
和osqueryd
使用的配置文件。 - 使用osquery 包 ,这是可以添加到计划的预定义查询组。
- 使用
osqueryi
执行特别查询以查找安全问题。 - 启动守护程序,使其可以自动运行查询。
由守护进程osqueryd生成的日志旨在发送到需要其他专业知识的外部日志记录端点,以便正确设置和使用。 本教程不会介绍该配置,但您将学习如何配置和运行守护程序并在本地保存结果。
先决条件
要完成本教程,您需要具备以下内容:
- 一个Ubuntu 16.04服务器,配置有具有sudo权限的非root用户和防火墙。 按照Ubuntu 16.04的初始设置指南进行设置。
您还应该具有对SQL的基本了解和对Linux系统安全性的基本知识。
第1步 - 在服务器上安装osquery
您可以通过从源编译它或通过使用包管理器安装osquery。 由于在官方Ubuntu存储库中没有可安装的软件包,因此您必须将该项目的官方Ubuntu存储库添加到系统中。
首先,添加存储库的公钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B
然后添加存储库:
sudo add-apt-repository "deb [arch=amd64] https://osquery-packages.s3.amazonaws.com/xenial xenial main"
更新包数据库:
sudo apt-get update
最后,安装osquery:
sudo apt-get install osquery
开箱即用,osquery不是非常有用; 它不是即插即用应用程序。 无论您打算使用交互式shell还是守护进程,都必须从命令行或通过配置文件传递一些标志和选项。 要查看守护程序可用的标志和选项,请键入:
osqueryd --help
输出将包括几十个命令行标志和配置选项。 下面显示的是用于本文的测试服务器的部分输出。
Outputosquery 2.1.2, your OS as a high-performance relational database
Usage: osqueryd [OPTION]...
osquery command line flags:
--flagfile PATH Line-delimited file of additional flags
--config_check Check the format of an osquery config and exit
--config_dump Dump the contents of the configuration
--config_path VALUE Path to JSON config file
--config_plugin VALUE Config plugin name
--config_tls_endpoint VALUE TLS/HTTPS endpoint for config retrieval
--config_tls_max_attempts VALUE Number of attempts to retry a TLS config/enroll request
--config_tls_refresh VALUE Optional interval in seconds to re-read configuration
--daemonize Run as daemon (osqueryd only)
...
...
osquery configuration options (set by config or CLI flags):
--audit_allow_config Allow the audit publisher to change auditing configuration
--audit_allow_sockets Allow the audit publisher to install socket-related rules
--audit_persist Attempt to retain control of audit
--aws_access_key_id VALUE AWS access key ID
--aws_firehose_period VALUE Seconds between flushing logs to Firehose (default 10)
--aws_firehose_stream VALUE Name of Firehose stream for logging
--aws_kinesis_period VALUE Seconds between flushing logs to Kinesis (default 10)
--aws_kinesis_random_partition_key Enable random kinesis partition keys
--aws_kinesis_stream VALUE Name of Kinesis stream for logging
--aws_profile_name VALUE AWS profile for authentication and region configuration
--aws_region VALUE AWS region
要查看仅对交互式shell可用的其他命令行标志,请键入:
osqueryi --help
运行osqueryi
是列出和查询开箱即用的osquery表的最简单的方法。 例如,使用以下命令启动它:
osqueryi --verbose
这将使您处于交互式shell中,您将看到类似于以下内容的输出:
OutputI0105 01:52:54.987584 4761 init.cpp:364] osquery initialized [version=2.1.2]
I0105 01:52:54.987808 4761 extensions.cpp:351] Could not autoload extensions: Failed reading: /etc/osquery/extensions.load
I0105 01:52:54.987944 4761 extensions.cpp:364] Could not autoload modules: Failed reading: /etc/osquery/modules.load
I0105 01:52:54.988209 4761 init.cpp:606] Error reading config: config file does not exist: /etc/osquery/osquery.conf
I0105 01:52:54.988334 4761 events.cpp:886] Error registering subscriber: socket_events: Subscriber disabled via configuration
I0105 01:52:54.993973 4763 interface.cpp:307] Extension manager service starting: /home/sammy/.osquery/shell.em
Using a virtual database. Need help, type '.help'
osquery>
由于输出中的错误和信息消息,很明显,osquery的所有部分都不能正常工作。 某些查询,如select * from yara ;
w ill不返回任何内容,表示该表未填充数据。
其他查询,如select time, severity, message from syslog ;
将返回如下所示的消息,表明还有更多的工作,我们需要做:
OutputW1202 15:44:48.600539 1720 virtual_table.cpp:492] Table syslog is event-based but events are disabled
W1202 15:44:48.600587 1720 virtual_table.cpp:499] Please see the table documentation: https://osquery.io/docs/#syslog
我们将对服务器的配置进行一些修改以解决此问题。
键入以下命令退出控制台:
.exit
在下一节中,我们将修改osquery需要正常运行的操作系统的各个方面。
第2步 - 允许osquery访问系统日志
在此步骤中,我们将修改操作系统的syslog应用程序以允许osquery使用和查询系统日志。 在Ubuntu 16.04上,这意味着修改Rsyslog配置文件。 而你需要做的唯一的修改是附加几行代码到配置文件。
首先,打开/etc/rsyslog.conf
文件:
sudo nano /etc/rsyslog.conf
我们需要添加一些配置,告诉Rsyslog要写入什么管道,以及哪些syslog参数写入该管道。 默认情况下,管道是/var/osquery/syslog_pipe
。 osquery然后填充其syslog
表从写入到该管道的信息。
将以下行附加到文件:
/etc/rsyslog.conftemplate(
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")
保存并关闭文件。 要应用更改,请重新启动syslog守护程序:
sudo systemctl restart rsyslog
现在让我们创建一个配置文件,设置一些默认选项并安排一些查询。
第3步 - 创建一个osquery配置文件
创建配置文件可以更容易地运行osqueryi
。 而不必通过大量的命令行选项, osqueryi
可以从位于/etc/osquery/osquery.conf
中的配置文件中读取这些选项。 并且,当然,配置文件也将可用于守护程序。
配置文件还包含需要按计划执行的查询。 但是,大多数可以按计划运行的查询都是作为所谓的包发送的。 包是位于/usr/share/osquery/packs
目录中的文件。
osquery不附带配置文件,但有一个示例配置文件,您可以复制到/etc/osquery
和修改。 但是,该文件没有所有的选项,你需要运行它在一个Linux发行版,如Ubuntu,所以我们将创建自己的。
配置文件有三个部分:
- 守护程序选项和功能设置的列表。 这些也可以由
osqueryi
读取。 - 要运行的计划查询的列表以及应运行的时间。
- 用于执行更具体的计划查询的包列表。
以下是我们将用于我们的配置文件的选项列表,它们的意义和我们将设置它们的值。 这个选项列表osqueryd
在Ubuntu 16.04和其他Linux发行版上运行osqueryi
和osqueryd。
- config_plugin :在哪里需要osquery从中读取其配置。 默认情况下,它们是从磁盘上的文件读取的,因此其值为
filesystem
。 - logger_plugin :指定osquery应在何处写入计划查询的结果。 再次,我们将使用
filesystem
。 - logger_path :这是日志目录的路径,您可以在其中找到包含信息,警告,错误和计划查询结果的文件。 默认情况下,这是
/var/log/osquery
。 - disable_logging :通过将此值设置为
false
我们启用日志记录。 - log_result_events :通过将其设置为
true
,结果日志中的每一行都将表示状态更改。 - 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
,因此我们将保留它。 - enable_monitor :用于启用或禁用计划监视器。 我们将启用它,因此值将为
true
。 - disable_events :用于调节osquery的发布/订阅系统。 我们需要启用此选项,因此此处的值将为
false
。 - disable_audit :用于禁用从操作系统的审计子系统接收事件。 我们需要启用它,因此这里使用的值将为
false
。 - audit_allow_config :允许审计发布者更改审计配置。 默认值为
true
。 - audit_allow_sockets :这允许审计发布者安装套接字相关的规则。 该值将为
true
。 - host_identifier :这用于标识运行osquery的主机。 当聚集来自多个服务器的结果时,有助于容易地确定特定日志条目来自哪个服务器。 该值为
hostname
或uuid
。 开箱即用,它设置为hostname
,因此我们将使用该值。 - enable_syslog :为了使osquery使用syslog信息,这必须设置为
true
。 - schedule_default_interval :如果未设置计划查询的间隔,请使用此值。 它在几秒钟内,我们将其设置为
3600
。
你已经看过如何查看所有命令行标志和配置选项可用于osqueryi
和osqueryd
,但上述选项将足以在此服务器上运行osquery。
使用以下命令创建并打开配置文件:
sudo nano /etc/osquery/osquery.conf
配置文件使用JSON格式。 将以下内容复制到文件中:
{
"options": {
"config_plugin": "filesystem",
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"disable_logging": "false",
"log_result_events": "true",
"schedule_splay_percent": "10",
"pidfile": "/var/osquery/osquery.pidfile",
"events_expiry": "3600",
"database_path": "/var/osquery/osquery.db",
"verbose": "false",
"worker_threads": "2",
"enable_monitor": "true",
"disable_events": "false",
"disable_audit": "false",
"audit_allow_config": "true",
"host_identifier": "hostname",
"enable_syslog": "true",
"audit_allow_sockets": "true",
"schedule_default_interval": "3600"
},
配置文件的下一部分是调度部分。 每个查询都由键或名称标识,键在文件中必须是唯一的,后面是要运行的查询,以及运行查询的间隔(以秒为单位)。 我们将添加一个计划查询,每300秒查看一次crontab
表。
将以下行添加到配置文件:
"schedule": {
"crontab": {
"query": "SELECT * FROM crontab;",
"interval": 300
}
},
您可以写任何数量的查询,你想要。 只要保持正确的格式。 否则,文件将无法通过验证。 例如,要添加几个查询,请添加以下行:
"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
}
},
排定查询后,您可以添加名为装饰器的特殊查询,这些查询是将数据预置到其他计划的查询。 这里显示的装饰器查询将会将运行osquery的主机的UUID和用户的用户名添加到每个计划的查询。
将以下行附加到文件:
"decorators": {
"load": [
"SELECT uuid AS host_uuid FROM system_info;",
"SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;"
]
},
最后,我们可以将osquery指向包含更多特定查询的包列表。 每次安装osquery都会在/usr/share/osquery/packs
中提供一组默认的包。 其中一个包用于macOS,其余包用于Linux系统。 虽然您可以从默认位置使用这些包,但您也可以将它们复制到/etc/osquery
目录中。
将这些行添加到文件以完成文件。
"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": "filesystem",
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"disable_logging": "false",
"log_result_events": "true",
"schedule_splay_percent": "10",
"pidfile": "/var/osquery/osquery.pidfile",
"events_expiry": "3600",
"database_path": "/var/osquery/osquery.db",
"verbose": "false",
"worker_threads": "2",
"enable_monitor": "true",
"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"
}
}
保存并关闭文件,然后使用以下命令验证它:
sudo osqueryctl config-check
输出应如下所示:
OutputI0104 11:11:46.022858 24501 rocksdb.cpp:187] Opening RocksDB handle: /var/osquery/osquery.db
如果有错误,输出将指示错误的位置,所以你可以解决它。
一旦拥有有效的配置文件,就可以继续配置文件完整性监视所需的osquery包。
第4步 - 设置osquery文件完整性监控包
注意服务器上文件的完整性是监控其系统安全性的一个关键方面。 为此,osquery提供了一个即时的解决方案。
您添加到上一节中配置的包即开即用。 在本节中,我们将向列表中再添加一个包,其中包含将用于文件完整性监视的查询和指令。 在本练习中,我们将调用fim.conf
文件。
创建此文件并在编辑器中打开它:
sudo nano /usr/share/osquery/packs/fim.conf
我们将创建一个包,它将每隔300秒监控/home
, /etc
和/tmp
中的文件事件。 包文件的完整设置显示在以下文件列表中。 将其复制到文件中。
/usr/share/osquery/packs/fim.conf{
"queries": {
"file_events": {
"query": "select * from file_events;",
"removed": false,
"interval": 300
}
},
"file_paths": {
"homes": [
"/root/.ssh/%%",
"/home/%/.ssh/%%"
],
"etc": [
"/etc/%%"
],
"home": [
"/home/%%"
],
"tmp": [
"/tmp/%%"
]
}
}
保存并关闭文件。
要使新文件及其规则可用于osquery,请在/etc/osquery/osquery.conf结尾处的包列表中引用它。 打开文件进行编辑:
sudo nano /etc/osquery/osquery.conf
然后修改包部分以包括新文件:
/etc/osquery/osquery.conf
...
"packs": {
"fim": "/usr/share/osquery/packs/fim.conf",
"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"
}
保存并关闭文件。 只是为了确保你没有犯错误的文件,再次验证:
sudo osqueryctl config-check
现在让我们开始使用osqueryi
来查询系统。
第5步 - 使用osqueryi执行临时安全检查
有很多地方,osquery派上用场。 在本节中,您将使用交互式shell使用osqueryi
在系统上执行各种安全检查。 请记住,在这一点上,我们还没有启动osquery守护进程。 这就是osquery的美丽 - 你可以使用osqueryi
运行查询,即使守护进程没有活动,而仍然使用我们构建的配置文件来配置环境。
要使用配置文件启动osquery
,请键入:
sudo osqueryi --config_path /etc/osquery/osquery.conf --verbose
注意 :传递osqueryi
和osqueryd
的verbose选项是一个好的做法,因为它允许您看到任何可能指示osquery问题的错误或警告。 通常, osqueryi
可以在没有root权限的情况下运行,但是如果您在指定守护程序的配置文件时调用它,则必须以root身份运行它。
让我们从基本的安全检查开始,并从那里开始工作。 例如,除了您以外的其他人现在是否登录到系统? 使用此查询找出:
select * from logged_in_users ;
输出应如下所示:
Output+-----------+----------+-------+------------------+------------+------+
| type | user | tty | host | time | pid |
+-----------+----------+-------+------------------+------------+------+
| boot_time | reboot | ~ | 4.4.0-57-generic | 1483580419 | 0 |
| runlevel | runlevel | ~ | 4.4.0-57-generic | 1483580426 | 53 |
| login | LOGIN | ttyS0 | | 1483580429 | 1546 |
| login | LOGIN | tty1 | | 1483580429 | 1549 |
| user | root | pts/0 | 11.11.11.11 | 1483580584 | 1752 |
| user | sammy | pts/1 | 11.11.11.11 | 1483580770 | 4057 |
+-----------+----------+-------+------------------+------------+------+
在此输出中,有两个真实用户帐户登录到计算机,并且它们都来自相同的IP地址。 该IP地址应为已知的IP地址。 如果不是,您应该调查登录来源。
上一个查询告诉你谁现在登录,但以前的登录怎么办? 你可以通过查询最后一个表找到,像这样:
select * from last ;
输出没有显示任何异常,所以没有其他人最近登录了机器:
Output+----------+-------+------+------+------------+------------------+
| username | tty | pid | type | time | host |
+----------+-------+------+------+------------+------------------+
| reboot | ~ | 0 | 2 | 1483580419 | 4.4.0-57-generic |
| runlevel | ~ | 53 | 1 | 1483580426 | 4.4.0-57-generic |
| | ttyS0 | 1546 | 5 | 1483580429 | |
| LOGIN | ttyS0 | 1546 | 6 | 1483580429 | |
| | tty1 | 1549 | 5 | 1483580429 | |
| LOGIN | tty1 | 1549 | 6 | 1483580429 | |
| root | pts/0 | 1752 | 7 | 1483580584 | 11.11.11.11 |
| sammy | pts/1 | 4057 | 7 | 1483580770 | 11.11.11.11 |
+----------+-------+------+------+------------+------------------+
是否配置并激活了防火墙? 防火墙是否仍在运行? 如果有疑问,运行此查询以找出:
select * from iptables ;
如果没有输出,则表示IPTables防火墙尚未配置。 对于面向Internet的服务器,这不是一件好事,因此您最好配置防火墙。
您可以运行上一个命令,修改为对特定列进行过滤,如下所示:
select chain, policy, src_ip, dst_ip from iptables ;
该查询应该给出如下输出。 查找您未配置的任何异常的源和目标IP地址:
Output+---------+--------+---------+-----------+
| chain | policy | src_ip | dst_ip |
+---------+--------+---------+-----------+
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 127.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| INPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| FORWARD | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| FORWARD | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| OUTPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
| OUTPUT | ACCEPT | 0.0.0.0 | 0.0.0.0 |
+---------+--------+---------+-----------+
在crontab中计划什么类型的作业? 你安排好了吗? 此查询将帮助您找到已计划以特定时间间隔运行的恶意软件:
select command, path from crontab ;
输出应该采取这种形式。 任何命令在那里看起来可疑需要进一步调查:
Output+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+
| command | path |
+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+
| root cd / && run-parts --report /etc/cron.hourly | /etc/crontab |
| root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) | /etc/crontab |
| root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) | /etc/crontab |
| root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) | /etc/crontab |
| root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi | /etc/cron.d/mdadm |
| root test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond | /etc/cron.d/popularity-contest |
+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+
系统上是否有启用setuid的文件? 有相当多的任何Ubuntu 16.04服务器,但哪些是他们,有什么不应该是在系统上? 这些问题的答案将帮助你检测backdoored二进制。 定期运行此查询,并将其结果与旧结果进行比较,以便您可以关注任何添加。 该查询是:
select * from suid_bin ;
此查询的部分输出可能如下所示:
Output+-------------------------------+----------+-----------+-------------+
| path | username | groupname | permissions |
+-------------------------------+----------+-----------+-------------+
| /bin/ping6 | root | root | S |
| /bin/su | root | root | S |
| /bin/mount | root | root | S |
| /bin/umount | root | root | S |
| /bin/fusermount | root | root | S |
| /bin/ntfs-3g | root | root | S |
| /bin/ping | root | root | S |
| /sbin/mount.ntfs-3g | root | root | S |
| /sbin/mount.ntfs | root | root | S |
| /sbin/unix_chkpwd | root | shadow | G |
| /sbin/pam_extrausers_chkpwd | root | shadow | G |
| /usr/bin/chage | root | shadow | G |
| /usr/bin/locate | root | mlocate | G |
| /usr/bin/chfn | root | root | S |
| /usr/bin/chsh | root | root | S |
| /usr/bin/newuidmap | root | root | S |
| /usr/bin/write | root | tty | G |
| /usr/bin/mlocate | root | mlocate | G |
| /usr/bin/at | daemon | daemon | SG |
| /usr/bin/sg | root | root | S |
要查看加载的内核模块的列表,请运行以下查询:
select name, used_by, status from kernel_modules where status="Live" ;
这是另一个查询,你想定期运行,并将其输出与旧的结果,看看是否有任何改变。
还有另一种方法可以帮助你在服务器上找到后门程序,运行一个列出所有监听端口的查询。 为此,请执行以下查询:
select * from listening_ports ;
在只有SSH在端口22
上运行的新服务器上,输出将如下所示:
Output+-------+------+----------+--------+---------+
| pid | port | protocol | family | address |
+-------+------+----------+--------+---------+
| 1686 | 22 | 6 | 2 | 0.0.0.0 |
| 1686 | 22 | 6 | 10 | :: |
| 25356 | 0 | 0 | 0 | |
+-------+------+----------+--------+---------+
在你的服务器上,如果输出只包括你知道服务器应该监听的端口,没有什么可担心的。 但是如果有其他端口打开,你想调查这些端口是什么。
要查看服务器上的文件活动,请运行以下查询:
select target_path, action, uid from file_events ;
输出将显示服务器上的所有最近文件活动,以及负责该活动的用户标识。
Output+---------------------------+---------+------+
| target_path | action | uid |
+---------------------------+---------+------+
| /home/sammy/..bashrc.swp | CREATED | 1000 |
| /home/sammy/..bashrc.swp | UPDATED | 1000 |
| /home/sammy/..bashrc.swp | UPDATED | 1000 |
| /home/sammy/.bashrc | UPDATED | 1000 |
| /home/sammy/..bashrc.swp | DELETED | 1000 |
| /home/sammy/..bashrc.swp | CREATED | 1000 |
| /home/sammy/..bashrc.swp | UPDATED | 1000 |
| /home/sammy/..bashrc.swp | UPDATED | 1000 |
| /home/sammy/.bashrc | UPDATED | 1000 |
| /home/sammy/.bashrc | UPDATED | 1000 |
| /home/sammy/.bashrc | UPDATED | 1000 |
| /home/sammy/..bashrc.swp | DELETED | |
| /etc/test_file.txt | DELETED | |
| /home/sammy/.bash_history | UPDATED | 1000 |
| /home/sammy/.bash_history | UPDATED | 1000 |
| /etc/secret_file.md | CREATED | 0 |
| /etc/secret_file.md | UPDATED | 0 |
| /etc/secret_file.md | UPDATED | 0 |
+---------------------------+---------+------+
有很多类似的查询,您可以在服务器上运行,以了解可能的安全问题。
如果不确定表的模式,请使用以下命令找出:
.schema name-of-table
你可以列出可用的表:
.tables
在osquery附带的包中有更多的例子,许多设计为由osqueryd
运行。 在下一节中,您将了解如何启动守护程序来运行这些查询。
第6步 - 运行osqueryd
osqueryd
,守护进程,允许osquery以设置的间隔运行查询。 这些查询包括您在第4步中配置的那些查询,我们在该步骤中指定的包中的查询,以及在第5步中配置的FIM包中。如果您还没有学习它们,现在是一个好时机看看/usr/share/osquery/packs
。
osqueryd生成的结果写入/var/log/osquery
中名为osqueryd.results.log
的文件。 开箱即用,该文件不存在。 它仅在启动守护程序并开始生成结果时创建。
你可以使用systemctl
或osqueryctl
启动osqueryctl
。 两者都完成同样的事情,所以它不要紧,你使用哪一个。 osqueryd
将在启动时检查配置文件的存在,如果没有找到,将提醒您。 它将保持运行没有配置文件,虽然它不会做任何有用的。
但是由于你已经设置了一个配置文件,所以你需要做的是启动守护进程:
sudo systemctl start osqueryd
或者您可以键入:
sudo osqueryctl start
在启动守护程序后的几分钟内,/ /var/log/osquery/osqueryd.results.log
的大小应该增加。 您可以通过键入并重复下一个命令来看到这种情况:
ls -lh /var/log/osquery/osqueryd.results.log
文件大小的增加表示已将调度查询的结果写入磁盘。 不幸的是,osquery没有像OSSEC这样的警报工具,所以除非查看结果文件,否则无法看到计划查询的结果。 你可以使用tail
命令,这将连续流的文件的最后10行到您的屏幕:
sudo tail -f /var/log/osquery/osqueryd.results.log
按CTRL+C
停止拖尾日志。
长期来说,您希望将查询结果日志发送到可以使用的外部分析平台。 可行的开源选项包括Doorman , Zentral和ElasticSearch 。
结论
osquery是一个强大的工具,对于使用熟悉的SQL语法运行一次性和计划查询非常有用。 osqueryi
是用于编写一次性查询的osquery组件,而osqueryd
用于调度查询。 要了解计划查询的结果,您需要将其发送到外部日志分析平台。 你可以在https://osquery.io/找到更多关于osquery的信息 。