如何在Ubuntu16.04上使用osquery监控系统安全

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

osqueryiosqueryd 是独立的工具。 他们不交流,你可以使用一个而没有另一个。 运行每个所需的大多数标志和选项都是相同的,您可以使用 osqueryd 的配置文件启动 osqueryi,这样您就可以自定义环境而无需使用大量命令行开关。

在本教程中,您将:

  • 安装 osquery。
  • 配置操作系统的各个方面,例如 Rsyslog,osquery 需要正常运行。
  • 设置osqueryiosqueryd都可以使用的配置文件。
  • 使用 osquery packs,它们是可以添加到计划中的预定义查询组。
  • 使用 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 ; 将不会返回任何内容,表明该表尚未填充数据。

其他查询,如 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 配置文件

创建配置文件可以更轻松地运行 osqueryiosqueryi 可以从位于 /etc/osquery/osquery.conf 的配置文件中读取这些选项,而不必传递大量命令行选项。 当然,配置文件也可用于守护进程。

配置文件还包含需要按计划执行的查询。 但是,您可以按计划运行的大多数查询都以所谓的 packs 的形式提供。 包是位于 /usr/share/osquery/packs 目录中的文件。

osquery 没有附带配置文件,但有一个示例配置文件,您可以将其复制到 /etc/osquery 并进行修改。 但是,该文件没有在像 Ubuntu 这样的 Linux 发行版上运行它所需的所有选项,因此我们将创建自己的。

配置文件分为三个部分:

  • 守护程序选项和功能设置列表。 这些也可以通过 osqueryi 读取。
  • 要运行的计划查询列表以及它们应该运行的时间。
  • 用于执行更具体的预定查询的包列表。

以下是我们将用于配置文件的选项列表,它们的含义以及我们将设置它们的值。 此选项列表足以在 Ubuntu 16.04 和其他 Linux 发行版上运行 osqueryiosqueryd

  • 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的主机。 聚合来自多个服务器的结果时,有助于轻松确定特定日志条目来自哪个服务器。 该值为 hostnameuuid。 开箱即用,它设置为 hostname,因此我们将使用该值。
  • enable_syslog:为了让 osquery 使用 syslog 信息,必须将其设置为 true
  • schedule_default_interval:当一个调度查询的间隔没有设置时,使用这个值。 以秒为单位,我们将其设置为 3600

您已经了解了如何查看 osqueryiosqueryd 可用的所有命令行标志和配置选项,但以上选项足以在此服务器上运行 osquery。

使用以下命令创建并打开配置文件:

sudo nano /etc/osquery/osquery.conf

配置文件使用 JSON 格式。 将以下内容复制到文件中:

/etc/osquery/osquery.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" 
  },

配置文件的下一部分是调度部分。 每个查询由一个键或名称标识,该键或名称在文件中必须是唯一的,后跟要运行的查询和运行查询的间隔(以秒为单位)。 我们将添加一个计划查询,该查询每 300 秒查看一次 crontab 表。

将这些行添加到配置文件中:

/etc/osquery/osquery.conf

  "schedule": {
    "crontab": {
      "query": "SELECT * FROM crontab;",
      "interval": 300
    }
  },

您可以编写任意数量的查询。 只要保持正确的格式。 如果您不这样做,该文件将无法通过验证。 例如,要添加更多查询,请添加以下行:

/etc/osquery/osquery.conf

  "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 的特殊查询,这些查询是将数据附加到其他计划查询的查询。 此处显示的装饰器查询会将运行 osquery 的主机的 UUID 和用户的用户名添加到每个计划的查询中。

将这些行附加到文件中:

/etc/osquery/osquery.conf

  "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 目录。

将这些行添加到文件中以完成文件。

/etc/osquery/osquery.conf

  "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"
  }
}

请注意末尾的右花括号,它与文件第一行的左花括号相匹配。 您完成的配置文件应如下所示:

/etc/osquery/osquery.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

然后修改 packs 部分以包含新文件:

/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

注意:传递 osqueryiosquerydverbose 选项是一个很好的做法,因为它可以让您看到任何可能表明 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 地址。 如果不是,您应该调查该登录的来源。

前面的查询告诉你现在谁登录了,但是以前的登录呢? 您可以通过查询 last 表找到,如下所示:

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 服务器上都有很多,但它们是哪些,有没有不应该在系统上的? 这些问题的答案将帮助您检测后门二进制文件。 定期运行此查询并将其结果与旧结果进行比较,以便您可以密切关注任何添加。 该查询是:

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 ;

在仅在端口 22 上运行 SSH 的新服务器上,输出将如下所示:

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 ;

输出显示服务器上所有最近的文件活动,以及负责该活动的用户 ID。

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 的文件。 开箱即用,该文件不存在。 它仅在守护程序启动并开始生成结果时创建。

您可以使用 systemctlosqueryctl 启动 osqueryd。 两者都完成了同样的事情,所以你使用哪一个并不重要。 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 停止拖尾日志。

从长远来看,您可能希望将查询结果日志发送到您可以使用的外部分析平台。 可行的开源选项包括 DoormanZentralElasticSearch

结论

osquery 是一个强大的工具,对于使用熟悉的 SQL 语法运行一次性和计划查询很有用。 osqueryi 是用于编写一次性查询的 osquery 组件,而 osqueryd 用于调度查询。 为了理解预定查询的结果,您需要将它们发送到外部日志分析平台。 您可以在 https://osquery.io/ 找到有关 osquery 的更多信息。