如何设置OsQuery以监视Ubuntu上的安全威胁
Osquery是由Facebook开发的开源工具,用于查询与运行进程,加载的内核模块,在用户中的主动登录的机器状态相关的各种信息,主动侦听端口等。
该系统仪器框架使低级操作系统分析和监测有效和直观。
OsQuery将操作系统公开为高性能虚拟关系数据库,允许我们编写SQL查询以探索操作系统数据并查询端点(Windows,OS X,Linux和FreeBSD)以识别,探测和消除各种类型的威胁。
Osquery与传统的HIDS/IPS不同。
其中我们需要了解表中的数据,用于基于这些数据的查询和设计查询中的数据。
此外,它具有内置功能,可监控文件完整性,审计网络连接和进程,甚至是日志硬件设备实时更改。
在本文中,我们将在Ubuntu 16中安装OsQuery,并通过Osqueryi和Osqueryd检查其用途。
1.安装Osquery.
将OsQuery存储库信息添加到APT数据库并更新系统。
# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B
要使用Add-APT存储库,我们需要安装Python软件属性。
# sudo apt-get install software-properties-common python-software-properties
将存储库数据添加到APT-Database
# sudo add-apt-repository "deb [arch=amd64] https://osquery-packages.s3.amazonaws.com/xenial xenial main"
更新系统并安装OsQuery
# sudo apt-get update # sudo apt-get install osquery
我们可以通过交互式shell或者守护程序模式运行OsQuery。
起初,让我们探索如何通过OsQuery Shell接口使用它,然后我们将检查守护程序模式。
要获取OsQuery shell,请在终端中键入OsQueryi,以查询开箱即用的OsQuery表。
# osqueryi osquery>
要列出系统中的所有登录用户,请运行以下查询。
osquery> select * from logged_in_users ;
查找查询可用的所有表。
osquery> .tables
要描述表的模式,请执行以下命令。
osquery> .schema table-name
退出shell
osquery> .exit
我们还可以通过传递命令行标志来运行OsQuery。
例如
# osqueryi --disable_events=false --worker_threads=2 --logger_plugin=filesystem --pidfile=/var/osquery/osquery.pidfile
要查找可用于OsQuery Interactive Shell的更多命令行标志,请从终端执行以下命令。
# osqueryi --help
我们将在单独的部分中探讨更多查询,但现在让我们配置OsQuery。
2.配置OsQuery.
使用配置文件运行OsQuery更容易。
而不是通过大量命令行参数来运行OsQuery交互式shell,而是可以在OsQuery配置文件中写入这些参数。
运行Osqueryi时,Osquery Interactive Shell(Osqueryi)将读取这些参数。
OsQuery不附带配置文件。
相反,我们可以复制的示例配置文件(/usr/share/osquery/osquery.example.conf)。
它查找/etc/osquery/osquery.conf中的配置文件。
如果未存在配置文件,OsQueryi将使用默认选项运行。
此外,配置文件可供OsQuery守护程序使用。
OsQuery配置文件包含以下三个部分。
→Osqueryi和OsQuery守护程序(OsQueryd)→查询计划:SQL查询和间隔集的选项和设置列表。
→包含更具体/目标查询的包列表。
e.g文件更改监视包:受监控文件和目录的类别和路径
2.1选项和设置
在此Wiki中可以找到完整的选项和设置列表。
下面描述将用于本文的选项和设置。
config_plugin:config插件名称。
配置检索类型,默认文件系统插件从磁盘读取配置JSON。
logger_plugin:logger插件名称。
默认记录器是文件系统。
这将各种日志类型作为JSON写入特定文件路径。
可以同时使用多个记录器插件,有效地将日志复制到每个接口。
在指定配置时,单独的插件名称使用逗号(--logger_plugin = filesystem,syslog)。
logger_path:错误/警告/信息和结果日志记录的目录路径。
disable_logging:禁用错误/警告/信息(称为状态日志)和查询结果日志记录。
schedule_splay_percent:百分比为splay配置时间。
查询计划通常包括具有相同间隔的几个查询。
它通常不是计划作者在该间隔一起运行这些查询的意图。
而是,每个查询都应该在围绕间隔运行。
加载配置时,将应用10%的默认计划Splay。
pidfile:守护程序Pidfile互斥锁的路径。
该文件用于防止启动多个OsQueryD进程。
Events_expiry:超时到过期的Eventive来自Backing-Store的Subscribe结果。
此次到期仅在查询结果时应用。
例如,如果--EVENTS_EXPIRY = 1,则事件只能从订户中选择单个选择。
如果未选择发生,则事件将无限期地保存在备份商店中。
database_path:如果使用基于磁盘的备用存储,请指定路径。
默认情况下,OsQuery将使用RocksDB使用"备份商店"保持状态。
此状态保持事件信息,使得可以根据计划稍后查询。
它在计划内为每个查询保存最新查询的结果。
此最后查询结果允许查询差异日志记录。
冗长:启用详细信息信息。
Worker_Threads:用于处理查询的工作调度线程数。
启用_monitor:用于启用或者禁用计划监视器。
disable_events:禁用OsQuery操作系统事件发布订阅API。
这将隐式禁用基于记录事件报告的多个表。
disable_audit:用于禁用操作系统审核子系统的接收事件。
audit_allow_config:允许审核发布者更改审计配置
host_identifier:用于标识运行OsQuery的主机的字段:主机名,UUID,短暂实例。
启用_syslog:打开syslog摄入事件发布者。
这是一个'显式' - 启用,因为它需要rsyslog或者syslog-ng的外部配置。
audit_allow_sockets:这允许审核发布者安装与套接字相关的规则。
schedule_default_interval:(可选)设置默认区间值。
如果我们安排未定义间隔的查询,则使用此操作。
# sudo vi /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" }, ........... ........... ...........
2.2查询时间表
计划部分包含唯一键标识的查询,后跟interval指定查询频率以秒为单位。
计划部分的配置如下所示
........... ........... { "schedule": { "crontab": { "query": "SELECT * FROM crontab;", "interval": 300 }, "largest_process": { "query": "select pid, name, uid, resident_size from processes order by resident_size desc limit 10;", "interval": 60 }, } ........... ...........
第一个查询在每300秒中查看CRONTAB表,并在每10秒内每次10秒加载核心延长。
查询的结果使用RockSDB缓存在磁盘上。
在第一个查询运行中,所有结果都存储在RockSDB中。
在随后的运行中,只有结果集 - 差异(更改)将记录到RockSDB。
另一个名为装饰器的特殊查询用于将数据添加到其他计划查询。
以下装饰器将使主机运行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;" ] }, .......... ..........
2.3查询包
配置支持套装,称为packs,有助于定义计划的查询。
包装用OsQuery分发并根据广泛的信息和可见性标记。
例如,"合规性"包将包括查询,用于检查锁定的操作系统功能和用户设置中的更改。
"漏洞管理"Pack可能会执行常规资产管理查询,该查询构建围绕包和软件安装更改的事件日志。
位于/usr/share/OsQuery/Pack文件夹中的默认包装集。
将这些包添加到配置文件中。
.......... .......... "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" }
2.4为文件完整性监控创建自定义包
我们在上一节中添加的包已从框中送出。
现在我们希望添加自己的包,其任务是监视通过file_path配置的文件夹的文件完整性。
通过名称fims.conf创建文件/usr/share/salk/OsQuery/Packs /并添加以下部分。
# vi /usr/share/osquery/packs/fims.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/%%" ] } }
File_Events查询计划收集在五分钟间隔内由File_Path指定的路径中的任何文件上发生的所有FIIM事件。
在高级别,这意味着事件在OsQuery中缓冲并每隔五分钟发送到配置的记录器。
修改Osquery.conf中的Pack部分以包含上述文件。
# sudo vi /etc/osquery/osquery.conf ................. "packs": { "fim": "/usr/share/osquery/packs/fims.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" }
最终的OsQuery配置文件如下所示 -
{ "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": "true", "worker_threads": "2", "enable_monitor": "true", "disable_events": "false", "disable_audit": "false", "audit_allow_config": "true", "host_identifier": "hostname", "enable_syslog": "true", "syslog_pipe_path": "/var/osquery/syslog_pipe", "audit_allow_sockets": "true", "schedule_default_interval": "3600" }, "schedule": { "crontab": { "query": "SELECT * FROM crontab;", "interval": 300 }, "largest_process": { "query": "select pid, name, uid, resident_size from processes order by resident_size desc limit 10;", "interval": 60 } }, "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": { "fim": "/usr/share/osquery/packs/fims.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", "hardware-monitoring": "/usr/share/osquery/packs/hardware-monitoring.conf" } }
检查配置文件的有效性。
# sudo osqueryctl config-check
在详细模式下运行Osquery Interactive Shell。
# osqueryi --verbose
3.配置OsQuery以消耗Syslog-NG日志
在此步骤中,我们将配置OsQuery来消耗Syslogs。
Ubuntu有默认的rsyslog应用程序,可以生成syslogs,但在本文中,我们会发现如何配置syslog-ng,以便由OsQuery消耗它的日志。
OsQuery查询的syslog表从一个正确配置的syslog-ng守护程序转发的日志转发。
随着Syslog被摄入到OsQuery中,它被写入背纸商店(RockSDB)并提供查询。
因此,Syslog-NG配置将创建一个命名管道,通过osquery将消耗日志。
安装syslog-ng
# sudo apt-get install syslog-ng
将syslog-ng创建的文件组更改为syslog。
编辑syslog-ng主配置文件并将组更改为ADM。
# vi /etc/syslog-ng/syslog-ng.conf ......................... ......................... options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no); owner("root"); group("adm"); perm(0640); stats_freq(0); bad_hostname("^gconfd$"); threaded(yes); }; ......................... .........................
接下来,为OsQuery创建syslog-ng配置。
以下部分显示如何为系统日志配置Syslog-NG并以CSV格式重写这些日志。
然后,模板用于格式化消息/日志,以便日志字段与OsQuery的syslog表融合。
最后,将日志按到命名管道以用于OSQuery以消耗。
管道的权限必须至少允许syslog-ng读取/写入,并读取osquery。
# vi /etc/syslog-ng/conf.d/osquery.conf source s_osquery { system(); }; rewrite r_csv_message { set("$MESSAGE", value("CSVMESSAGE") ); subst("\"","\\"", value("CSVMESSAGE"), flags(global) ); }; template t_csv { template("\"${ISODATE}\", \"${HOST}\", \"${LEVEL_NUM}\", \"${FACILITY}\", \"${PROG内存}\", \"${MESSAGE}\"\n"); template_escape(no); }; destination d_osquery { pipe("/var/osquery/syslog_pipe" template(t_csv)); }; log { source(s_osquery); rewrite(r_csv_message); destination(d_osquery); };
我们之前创建的OsQuery配置文件(/etc/osquery/osquery.conf)需要对syslog-ng进行一点调整。
将logger_plugin更改为filesystem的syslog或者保留两者。
"logger_plugin": "syslog" or "logger_plugin": "filesystem,syslog"
Syslog摄取也需要以下选项。
................. ................. "enable_syslog": "true", "syslog_pipe_path": "/var/osquery/syslog_pipe", "disable_events": "false", ................. .................
因此,我们需要在/etc/osquery/osquery.conf中只编辑Logger_Plugin选项。
在配置文件中,我们已经创建的3个选项的其余部分中的剩余部分。
现在重新启动Syslog-NG并检查管道是否已使用适当的权限创建。
# sudo systemctl start syslog-ng # ls -l /var/osquery/syslog_pipe prw-r----- 1 root adm 0 Apr 27 14:29 /var/osquery/syslog_pipe
检查流过管道的原木
# cat /var/osquery/syslog_pipe "2016-04-27T14:42:33+00:00", "ubuntu", "6", "auth", "sshd", "Accepted password for root from 117.227.81.214 port 61849 ssh2" "2016-04-27T14:42:33+00:00", "ubuntu", "6", "authpriv", "sshd", "pam_unix(sshd:session): session opened for user root by (uid=0)" "2016-04-27T14:42:41+00:00", "ubuntu", "5", "local3", "osqueryi", "severity=0 location=options.cpp:61 message=Verbose logging enabled by config option" ................................... ...................................
启动OsQuery Interactive Shell。
# osqueryi I0427 14:32:07.981422 3730 options.cpp:61] Verbose logging enabled by config option I0427 14:32:08.085734 3730 syslog.cpp:97] Successfully opened pipe for syslog ingestion: /var/osquery/syslog_pipe I0427 14:32:08.101172 3730 file_events.cpp:68] Added file event listener to: /etc/** .................... I0427 14:32:08.101784 3730 audit.cpp:226] Adding audit rule: syscall=59 action=2 filter='' .................... I0427 14:32:08.278990 3737 events.cpp:749] Starting event publisher run loop: syslog I0427 14:32:08.279242 3736 events.cpp:749] Starting event publisher run loop: inotify I0427 14:32:08.279353 3735 events.cpp:749] Starting event publisher run loop: audit osquery>
现在查询syslog表。
osqueryi> select * from syslog;
上面的查询将显示通过命名管道/var/OsQuery/syslog_pipe消耗的OsQuery消耗的syslogs
4.威胁检测和DFIR通过Osqueryi
在本节中,我们将通过Osquery Interactive Shell探讨几个基本的安全检查。
a)运行以下查询以查找谁现在已登录系统中的用户。
osquery> select * from logged_in_users ;
b)找到以前的所有登录
osquery> select * from last ;
c)要查找防火墙规则,请运行以下查询。
如果下面的查询不会产生装置未配置防火墙任何输出。
osquery> select * from iptables ;
d)找到CRONTAB计划的所有作业,运行以下查询。
有了这个查询,你可以找到,如果有已被安排在特定的时间间隔运行任何恶意软件。
osquery> select command, path from crontab ;
e)查找已启用Sireduid的文件。
默认情况下,少量文件是在Ubuntu 16中启用了sireuid,但除此之外,还有哪些是启用sileuid的文件。
这将有助于检测后门二进制文件。
osquery> select * from suid_bin ;
f)找到已加载的内核模块列表。
osquery> select name, used_by, status from kernel_modules where status="Live" ;
g)找到所有侦听端口检查系统是否有后门。
如果有任何未配置的打开端口,那么我们可能需要检查打开此端口的进程。
osquery> select * from listening_ports ;
1H)与负责运行下面的查询的用户一起查找服务器上的文件的活动。
osquery> select * from file_events ;
i)通过驻留存储器大小查找前10名最大的进程。
osquery> select pid, name, uid, resident_size from processes order by resident_size desc limit 10;
j)查找所有正在运行的进程。
osquery> select * from processes;
k)的查找过程中计数,名称为10个最活跃的进程。
osquery> select count(pid) as total, name from processes group by name order by total desc limit 10;
l)通常,恶意软件将收听端口并将反向shell转发给攻击者。
运行以下查询,并找到与系统的任何已知安全状态的差异。
osquery> SELECT DISTINCT process.name, listening.port, listening.address, process.pid FROM processes AS process JOIN listening_ports AS listening ON process.pid = listening.pid;
在系统中运行之后M)攻击者往往会删除该恶意二进制文件。
要查找此类进程执行以下查询。
osquery> SELECT name, path, pid FROM processes WHERE on_disk = 0;
n)运行以下查询以查找是否有任何Bash反向shell转发到攻击者。
osquery> SELECT * FROM processes WHERE cmdline LIKE '/bin/bash -i >& /dev/tcp/%';
5.守护进程模式中的Osquery
正如我们所看到的,OsQuery将实时返回OS状态的结果,可以在稍后阶段查询。
但是可以所有时间运行查询以进行威胁检测。
除此之外,Osquery还不包括任何警报机制。
该解决方案是将OsQuery作为守护程序运行,该守护程序将以定期的时间间隔运行配置文件中包含的计划查询和包,并在文件中写入结果。
在/usr/share/OsQuery/Pack中创建自己的包,并包括用于在OsQuery配置文件中监视的包。
计划查询和包的结果是写在文件/var/log/osquery/osqueryd.results.log中,只有当OsQuery启动为守护程序模式和OsQueryD开始发送结果时,才会创建此日志文件。
该OSQUERY守护进程将读取相同的配置文件/etc/osquery/osquery.conf。
请记住将Logger_Plugin值恢复为/etc/osquery/osquery.conf中的文件系统如果我们之前更改为"syslog"。
要启动守护程序,请使用以下任何一个命令。
# sudo systemctl start osqueryd OR # sudo osqueryctl start
OsQueryD运行计划查询和包后,应在短时间内获得结果。
使用tail命令验证结果是否已写入文件/var/log/osquery/osqueryd.results.log
# tail -f /var/log/osquery/osqueryd.results.log
现在,我们可以将结果日志转发给任何外部应用程序,如ELK堆栈,用于日志分析和警报生成。