专栏首页云计算教程系列如何使用Ubuntu 16.04上的osquery监视系统安全性
原创

如何使用Ubuntu 16.04上的osquery监视系统安全性

介绍

osquery是一个安全开源工具,它采用操作系统并将其转换为一个巨大的数据库,使用可以使用类似SQL的语句进行查询的表。通过这些查询,您可以监控文件完整性,检查防火墙的状态和配置,执行目标服务器的安全审核等。

它是一个跨平台的应用程序,支持最新版本的macOS,Windows 10,CentOS和Ubuntu。它被官方描述为“基于SQL的操作系统仪器,监控和分析”框架,起源于Facebook。

使用osquery,您可以运行与服务器相似的命令select * from logged_in_users;,并返回如下结果:

+-----------+----------+-------+------------------+------------+------+
| 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 ,它是可以添加到计划中的预定义查询组。
  • 使用特殊查询osqueryi来查找安全问题。
  • 启动守护程序,以便它可以自动运行查询。

由osqueryd守护程序生成的日志旨在运送到外部日志记录端点,这些端点需要其他专业知识才能正确设置和使用。本教程不会介绍该配置,但您将学习如何配置和运行守护程序并在本地保存结果。

准备

要完成本教程,您需要具备以下内容:

  • 一个配置了一个具有sudo权限的非root用户的Ubuntu 16.04服务器。

没有服务器的用户可以购买和使用腾讯云服务器或者直接在腾讯云实验室Ubuntu服务器上机体验 ,您还应该具有对SQL语法的基本了解。

第一步 - 在服务器上安装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

输出将包括许多命令行标志和配置选项。下面显示的是本文使用的测试服务器的部分输出结果。

osquery 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中,您将看到类似于此的输出结果:

I0105 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;将返回如下消息,这表明我们需要做更多工作:

W1202 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

我们将对服务器的配置进行一些修改以解决此问题。

输入以下命令退出控制台:

osquery>; .exit

在下一节中,我们将修改osquery需要正常运行的操作系统的各个方面。

第二步 - 允许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.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")

保存并关闭文件。要应用更改,请重新启动syslog守护程序:

$ sudo systemctl restart rsyslog

现在让我们创建一个配置文件,设置一些默认选项并安排一些查询。

第三步 - 创建osquery配置文件

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

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

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

配置文件有三个部分:

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

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

  • 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。

您已经了解了如何查看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

/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

输出结果应如下所示:

I0104 11:11:46.022858 24501 rocksdb.cpp:187] Opening RocksDB handle: /var/osquery/osquery.db

如果出现错误,输出将指示错误的位置,以便您可以修复它。

获得有效的配置文件后,您可以继续配置文件完整性监视所需的osquery包。

第四步 - 设置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查询系统。

第五步 - 使用osqueryi执行临时安全检查

有很多地方可以使用osquery。在本节中,您将使用osqueryi交互式shell 对系统执行各种安全检查。请记住,此时,我们仍然没有启动osquery守护程序。这就是osquery的优点

即使守护程序未处于活动状态,您也可以使用osqueryi来运行查询,同时仍然使用我们构建的配置文件来配置环境。

要osquery使用配置文件启动,请输入:

$ sudo osqueryi --config_path /etc/osquery/osquery.conf --verbose

:传递osqueryiosquerydverbose选项是一个好的做法,因为它可以让你看到任何可能表明osquery问题的错误或警告。通常,osqueryi可以在没有root权限的情况下运行,但如果在指定守护程序的配置文件时调用它,则必须以root身份运行它。

让我们从基本的安全检查开始,然后从那里开始工作。例如,您以外的其他人现在登录系统了吗?找出这个查询:

osquery>; select * from logged_in_users ;

输出结果应如下所示:

+-----------+----------+-------+------------------+------------+------+
| 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地址。如果不是,您应该调查登录的来源。

上一个查询会告诉您现在登录的是谁,但之前登录的是什么?您可以通过查询最后一个表来查找,如下所示:

osquery>; select * from last ;

输出结果没有任何异常,因此最近没有其他人登录过这台机器:

+----------+-------+------+------+------------+------------------+
| 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      |
+----------+-------+------+------+------------+------------------+

防火墙是否已配置并激活?防火墙是否仍在运行?如果有疑问,请运行此查询以查找:

osquery>; select * from iptables ;

如果没有输出,则表示尚未配置IPTables防火墙。对于面向Internet的服务器而言,这不是一件好事,因此您可以更好地配置防火墙。

您可以运行上一个命令,修改为对特定列进行过滤,如下所示:

osquery>; select chain, policy, src_ip, dst_ip from iptables ;

该查询应该提供如下输出结果。查找未配置的任何异常源和目标IP地址:

+---------+--------+---------+-----------+
| 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中安排了哪些类型的作业?你安排好了吗?此查询将帮助您查找已按计划间隔运行的恶意软件:

osquery\>: select command, path from crontab ;

输出结果应采用如下形式。任何看起来可疑的命令都需要进一步调查:

+----------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+
| 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二进制文件。定期运行此查询并将其结果与较旧的结果进行比较,以便您可以密切关注任何添加。该查询如下:

osquery>: select * from suid_bin ;

此查询的部分输出结果可能如下所示:

+-------------------------------+----------+-----------+-------------+
| 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           |

要查看已加载的内核模块列表,请运行以下查询:

osquery>; select name, used_by, status from kernel_modules where status="Live";

这是您希望定期运行的另一个查询,并将其输出结果与较旧的结果进行比较,以查看是否有任何更改。

另一种可以帮助您在服务器上找到后门的方法是运行一个列出所有侦听端口的查询。为此,请执行以下查询:

osquery>; select * from listening_ports ;

在只有端口22上运行SSH的新服务器上,输出结果如下所示:

+-------+------+----------+--------+---------+
| pid   | port | protocol | family | address |
+-------+------+----------+--------+---------+
| 1686  | 22   | 6        | 2      | 0.0.0.0 |
| 1686  | 22   | 6        | 10     | ::      |
| 25356 | 0    | 0        | 0      |         |
+-------+------+----------+--------+---------+

在您的服务器上,如果输出只包含您知道服务器应该监听的端口,则无需担心。但如果有其他端口打开,您将需要调查这些端口是什么。

要查看服务器上的文件活动,请运行以下查询:

osquery>; select target_path, action, uid from file_events ;

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

+---------------------------+---------+------+
| 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    |
+---------------------------+---------+------+

有许多查询,例如您可以在服务器上运行的查询,以了解可能存在的安全问题。

如果您不确定表的架构,请使用以下命令查找:

osquery>; .schema name-of-table

您可以列出可用的表格:

osquery>: .tables

在osquery附带的包中有更多的例子,而且很多都是为了定期运行而设计的osqueryd。在下一节中,您将学习如何启动守护程序来运行这些查询。

第六步 - 运行osqueryd

守护进程osqueryd允许osquery以设定的时间间隔运行查询。这些查询包括您在第四步中配置的查询,我们在该步骤中指定的包中的查询,以及我们在第五步中配置的FIM包中的查询。如果您尚未研究它们,现在是时候应该看一下/usr/share/osquery/packs的内容。

osqueryd生成的结果将写入/var/log/osquery目录中调用的文件osqueryd.results.log中。开箱后,该文件不存在。它仅在守护程序启动时创建并开始生成结果。

你可以开始使用systemctl或osqueryctl启动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停止拖尾日志。

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

结论

osquery是一个功能强大的工具,对于使用熟悉的SQL语法运行一次性和预定查询非常有用。osqueryi是用于编写一次性查询的osquery组件,而osqueryd用于调度查询。


参考文献:《How To Monitor Your System Security with osquery on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 16.04上设置Nginx服务器块(虚拟主机)

    使用Nginx Web服务器时,可以使用服务器块(类似于Apache中的虚拟主机)来封装配置详细信息,并从单个服务器托管多个域。

    葡萄
  • 如何在Ubuntu 18.04上为用户目录设置vsftpd

    FTP是文件传输协议的缩写,是一种曾经广泛用于在客户端和服务器之间移动文件的网络协议。它已被更快,更安全,更方便的文件传输方式所取代。许多普通网民希望通过htt...

    葡萄
  • 如何在Debian 9上使用Python 3设置Jupyter笔记本

    Jupyter Notebook为交互式计算提供了一个命令shell作为Web应用程序。该工具可以与多种语言一起使用,包括Python,Julia,R,Hask...

    葡萄
  • CentOS 7 安装osquery监控系统

    版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://b...

    shaonbean
  • Windows下如何在Python上安装xgboost ?

    刚开始试了conda install py-xgboost,建议赶紧停下,不想你遇到那么多坑!

    IT派
  • STA | 串扰,理论分析

    最近在泡VLSI System Design 这个网站,看到了多年前牛人们码的许多文章,内容翔实无一句废话,内容质量比我这破号好太多了,今天搬一篇Crossta...

    老秃胖驴
  • 大数据时代,互联网金融将会呈现怎样的面孔?

    随着互联网与金融的不断融合发展,互联网金融早已成为当下最热门的话题之一。那么,什么才是互联网金融?在大数据时代,互联网金融将会呈现怎样的面孔?现在就让数据猿编辑...

    数据猿
  • [互联网金融]园丁式监管走向大数据监管

    大数据文摘
  • 站在更高的角度,看微服务架构的理论基础

    微服务是近些年非常火热的新概念,大家都在追,也都觉得很对,但是似乎没有很充足的理论基础说明这是正确的,给人的感觉是 不明觉厉 。前段时间看了Mike Amund...

    李红
  • Android OpenGL ES(六) - 将输入源换成视频

    上文中,我们是将相机提供的预览画面输入到Surface当中,然后进行滤镜处理和录制。 那我们可以切换输入源为视频吗?

    deep_sadness

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动