如何在Ubuntu 16.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 ,这是可以添加到计划的预定义查询组。
  • 使用osqueryi执行特别查询以查找安全问题。
  • 启动守护程序,使其可以自动运行查询。

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

先决条件

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

您还应该具有对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的主机。 当聚集来自多个服务器的结果时,有助于容易地确定特定日志条目来自哪个服务器。 该值为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
    }
  },

排定查询后,您可以添加名为装饰器的特殊查询,这些查询是将数据预置到其他计划的查询。 这里显示的装饰器查询将会将运行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

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

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

上一个查询告诉你谁现在登录,但以前的登录怎么办? 你可以通过查询最后一个表找到,像这样:

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

你可以使用systemctlosqueryctl启动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停止拖尾日志。

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

结论

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

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏