使用数据库查询操作,轻松获取系统信息。Linux提供了很多命令来帮助用户收集有关主机操作系统的信息:列出文件或目录的属性信息;开机查询已安装的软件包、正在执行的命令、启动的服务;或者了解系统的硬件。每个命令都使用自己的输出格式列出有关系统的信息。您需要使用grep、sed、awk等工具来过滤命令的输出以查找特定信息。此外,这些信息中的大部分经常变化,导致系统状态发生变化。将所有信息格式化以作为数据库SQL查询的输出查看将非常有帮助。想象一下,能够查询ps和rpm命令的输出,就好像它们是类似命名的SQL数据库表一样。幸运的是,有一个工具可以做到这一点甚至更多:Osquery是一个开源的“SQL驱动的操作系统检测、监控和分析框架”。许多处理安全性、DevOps、合规性和仓库管理(仅举几例)的应用程序在内部依赖于Osquery提供的核心功能。安装OsqueryOsquery适用于Linux、macOS、Windows、FreeBSD。请按照指南为您的操作系统安装最新版本。(我将在下面的示例中使用版本4.7.0。)安装后,确保Osquery正常工作:$rpm-qa|greposqueryosquery-4.7.0-1.linux.x86_64$$osqueryi--versionosqueryiversion4.7.0$OsqueryComponentsOsquery有两个主要组件:osqueri是一个交互式SQL查询控制台,可以独立运行而无需超级用户权限(除非被查询的表需要访问权限)。osqueryd就像一个安装在主机上的监控守护进程,可以周期性地调度查询操作执行,并从底层架构中收集信息。可以在不运行osqueryd的情况下执行osqueri。另一个工具osqueryctl控制启动、停止和检查守护进程的状态。$rpm-qlosquery-4.8.0-1.linux.x86_64|grepbin/usr/bin/osqueryctl/usr/bin/osqueryd/usr/bin/osqueryi$使用osqueryi交互式命令提示符与Osquery交互并使用SQL数据库非常相似。事实上,osqueryi是SQListshell的修改版本。执行osqueryi命令进入交互式命令提示符,可以执行Osquery命令,一般以.开头:$osqueryiUsingavirtualdatabase.Needhelp,type'.help'osquery>退出交互式命令提示符,执行.quit命令返回到操作系统在命令提示符下:osquery>osquery>.quit$找出可用的表如前所述,Osquery像SQL查询一样输出数据,而数据库中的信息通常存储在表中。但是你如何在不知道它们的名字的情况下查询这些表呢?您可以运行.tables命令列出所有可以查询的表。如果你是Linux老用户或系统管理员,表名会很熟悉,因为你一直在使用操作系统命令获取相同的信息:osquery>.tables=>acpi_tables=>apparmor_events=>apparmor_profiles=>apt_sources<>=>arp_cache=>user_ssh_keys=>users=>yara=>yara_events=>ycloud_instance_metadata=>yum_sourcesosquery>查看每个表的schema知道表名后,可以查看每个表提供的信息.由于ps命令经常用于获取进程信息,所以以进程为例。执行.schema命令加上表名可以查看表中保存的信息。如果要验证命令返回的结果,可以快速执行ps-ef或psaux将命令的输出与表中的内容进行比较:osquery>.schemaprocessesCREATETABLEprocesses(`pid`BIGINT,`name`TEXT,`path`TEXT,`cmdline`TEXT,`state`TEXT,`cwd`TEXT,`root`TEXT,`uid`BIGINT,`gid`BIGINT,`euid`BIGINT,`egid`BIGINT,`suid`BIGINT,`sgid`BIGINT,`on_disk`INTEGER,`wired_size`BIGINT,`resident_size`BIGINT,`total_size`BIGINT,`user_time`BIGINT,`system_time`BIGINT,`disk_bytes_read`BIGINT,`disk_bytes_written`BIGINT,`start_time`BIGINT,`parent`BIGINT,`pgroup`BIGINT,`threads`INTEGER,`nice`INTEGER,`is_elevated_token`INTEGERHIDDEN,`elapsed_time`BIGINTHIDDEN,`handle_count`BIGINTHIDDEN,`percent_processor_time`BIGINTHIDDEN,`upid`BIGINTHIDDEN,`uppid`BIGINTHIDDEN,`cpu_sub_type`INTEGERHIDDEN,`cpu`INTEGERHIDDEN,`phys_footprint`BIGINTHIDDEN,PRIMARYKEY(`pid`))WITHOUTROWID;osquery>进一步确认,可以使用如下命令查看RPM的结构信息包,然后将其与操作系统命令rpm-qa和rpm-qi的输出进行比较:osquery>osquery>.schemarpm_packagesCREATETABLErpm_packages(`name`TEXT,`version`TEXT,`release`TEXT,`sourcee`TEXT,`size`BIGINT,`sha1`TEXT,`arch`TEXT,`epoch`INTEGER,`install_time`INTEGER,`vendor`TEXT,`package_group`TEXT,`pid_with_namespace`INTEGERHIDDEN,`mount_namespace_id`TEXTHIDDEN,PRIMARYKEY(`name`,`version`,`release`,`arch`,`epoch`,`pid_with_namespace`))WITHOUTROWID;osquery>从Osquery的表文档中获取更多信息使用PRAGMA命令也许模式信息对你来说太多了难以阅读,还有另一种方法可以以详细的表格格式打印表中的信息:PRAGMA命令。比如我想通过PRAGMA以通俗易懂的格式查看rpm_packages表的信息:osquery>PRAGMAtable_info(rpm_packages);这种表格格式信息的一个好处是,你可以专注于你想查询的字段,查看命令提供的类型信息:osquery>PRAGMAtable_info(users);+-----+------------+--------+--------+------------+----+|cid|name|type|notnull|dflt_value|pk|+-----+------------+------+--------+-----------+----+|0|uid|BIGINT|1||1||1|gid|BIGINT|0||0||2|uid_signed|BIGINT|0||0||3|gid_signed|BIGINT|0||0||4|用户名|TEXT|1||2||5|描述|TEXT|0||0||6|目录|TEXT|0||0||7|shell|TEXT|0||0||8|uuid|TEXT|1||3|+-----+------------+--------+--------+------------+----+osquery>执行第一个查询从表、模式和条目中获取执行查询所需的所有信息后,执行第一个SQL查询以查看其中的信息。以下查询返回系统上的用户以及每个用户的用户ID、组ID、主目录和默认shell。Linux用户通过查看/etc/passwd文件的内容并执行grep、sed、awk命令获得相同的信息。osquery>osquery>selectuid,gid,directory,shell,uuidFROMusersLIMIT7;+-----+-----+----------------+----------------+-----+|uid|gid|目录|shell|uuid|+-----+-----+---------------+----------------+------+|0|0|/root|/bin/bash|||1|1|/bin|/sbin/nologin|||2|2|/sbin|/sbin/nologin|||3|4|/var/adm|/sbin/nologin|||4|7|/var/spool/lpd|/sbin/nologin|||5|0|/sbin|/bin/sync|||6|0|/sbin|/sbin/shutdown||+-----+-----+----------------+----------------+------+osquery>如果不进入交互模式查询如果不进入osqueri的交互模式就想查询怎么办?这对于编写带有查询操作的shell脚本很有用。在这种情况下,您可以直接从Bash解释器回显SQL查询并将其通过管道传递给osqueri:$echo"selectuid,gid,directory,shell,uuidFROMusersLIMIT7;"|osqueryi+-----+-----+---------------+----------------+------+|uid|gid|directory|shell|uuid|+-----+-----+----------------+----------------+------+|0|0|/root|/bin/bash|||1|1|/bin|/sbin/nologin|||2|2|/sbin|/sbin/nologin|||3|4|/var/adm|/sbin/nologin|||4|7|/var/spool/lpd|/sbin/nologin|||5|0|/sbin|/bin/sync|||6|0|/sbin|/sbin/shutdown||+-----+-----+----------------+-----------------+-----+$了解系统启动时启动的服务Osquery还可以列出系统启动时启动的所有服务。例如,您可以查询startup_items表来获取启动时启动的前五个服务的名称、状态和路径:osquery>SELECTname,type,status,pathFROMstartup_itemsLIMIT5;name=READMEtype=StartupItemstatus=enabledpath=/etc/rc.d/init.d/READMEname=anamontype=StartupItemstatus=enabledpath=/etc/rc.d/init.d/anamonname=functionstype=StartupItemstatus=enabledpath=/etc/rc.d/init.d/functionsname=osquerydtype=StartupItemstatus=enabledpath=/etc/rc.d/init.d/osquerydname=AT-SPID-BusBustype=StartupItemstatus=enabledpath=/usr/libexec/at-spi-bus-launcher--launch-immediatelyosquery>查找ELF信息如果您想了解有关ls二进制文件的更多详细信息,通常是通过readelf-h命令以及ls命令的路径。查询Osquery的elf_info表,可以得到相同的信息:osquery>SELECT*FROMelf_infoWHEREpath="/bin/ls";class=64abi=sysvabi_version=0type=dynmachine=62version=1entry=24064flags=0path=/bin/lsosquery>现在你应该对如何使用osqueri查询你想要的信息有了初步的了解。但是,此信息存储在大量表中;在我查询的一个系统中,有156个不同的表,这可能是一个惊人的数字:表:osquery>select*fromsystem_info;系统限制信息:osquery>select*fromulimit_info;各种进程打开的文件:osquery>select*fromprocess_open_files;打开系统上的端口:osquery>select*fromlistening_ports;运行进程信息:osquery>select*fromprocesses;安装包信息:osquery>select*fromrpm_packages;用户登录信息:osquery>select*fromlast;系统日志信息:osquery>select*fromsyslog_events;