使用数据库查询操作轻松获取系统信息。
Linux 提供了很多帮助用户收集主机操作系统信息的命令:列出文件或者目录的属性信息;查询安装的软件包、正在执行的命令、开机时启动的服务;或者了解系统的硬件。
每个命令使用自己的输出格式列出系统的信息。你需要使用 grep
、sed
、awk
这样的工具过滤命令输出的结果,以便找到特定的信息。此外,很多这样的信息会频繁变动,导致系统状态的改变。
将所有的信息格式化为一个数据库的 SQL 查询的输出进行查看将会十分有益。想象一下,你能够像查询具有类似名称的 SQL 数据库表一样查询 ps
和 rpm
命令的输出。
幸运的是,有一个工具刚好实现了这个功能,而且功能更多:Osquery 是一个 开源的 “由 SQL 驱动的操作系统仪表、监控和分析框架”。
许多处理安全、DevOps、合规性的应用,以及仓储管理管理(仅举几例)在内部依赖 Osquery 提供的核心功能。
安装 Osquery
Osquery 适用于 Linux、macOS、Windows、FreeBSD。请按照 指南 为你的操作系统安装最新版本。(我会在下面的例子中使用 4.7.0 版本。)
安装完成后,确保 Osquery 可以工作:
“`
$ rpm -qa | grep osquery
osquery-4.7.0-1.linux.x86_64
$
$ osqueryi –version
osqueryi version 4.7.0
$
“`
Osquery 组件
Osquery 有两个主要组件:
osqueri
是一个交互式的 SQL 查询控制台,可以独立运行,不需要超级用户权限(除非要查询的表格需要访问权限)。osqueryd
像一个安装在主机的监控守护进程,可以定期调度查询操作执行,从底层架构收集信息。
可以在不运行 osqueryd
的情况下执行 osqueri
。另一个工具,osqueryctl
,控制守护进程的启动、停止,并检查其状态。
“`
$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin
/usr/bin/osqueryctl
/usr/bin/osqueryd
/usr/bin/osqueryi
$
“`
使用 osqueryi 交互式命令提示符
你和 Osquery 的交互与使用 SQL 数据库十分相似。事实上,osqueryi
是 SQList shell 的一个修改版。执行 osqueryi
命令进入交互式命令提示符 ,就可以执行 Osquery 的命令,通常以 .
开始:
“`
$ osqueryi
Using a virtual database. Need help, type ‘.help’
osquery>
“`
要退出交互式命令提示符,执行 .quit
命令回到操作系统的命令提示符:
“`
osquery>
osquery> .quit
$
“`
找出可用的表
如前所述,Osquery 像 SQL 查询一样输出数据,数据库中的信息通常保存在表中。但是如何在不知道表名的情况下查询这些表呢?你可以运行 .tables
命令列出所有可以查询的表。如果你是一个 Linux 长期用户或者一个系统管理员 ,就会对表名十分熟悉,因为你一直在使用操作系统命令获取同样的信息:
“`
osquery> .tables
=> acpitables
=> apparmorevents
=> apparmorprofiles
=> aptsources
<<裁剪>>
=> arpcache
=> usersshkeys
=> users
=> yara
=> yaraevents
=> ycloudinstancemetadata
=> yum_sources
osquery>
“`
检查各个表的模式
知道表名后,可以查看每个表提供的信息。既然 ps
命令经常用于获取进程信息,就以 processes
为例。执行 .schema
命令加上表名查看表中保存的信息。如果要验证命令返回的结果,可以快速执行 ps -ef
或 ps aux
,对比命令的输出和表中的内容:
“
pid
osquery> .schema processes
CREATE TABLE processes(BIGINT,
nameTEXT,
pathTEXT,
cmdlineTEXT,
stateTEXT,
cwdTEXT,
rootTEXT,
uidBIGINT,
gidBIGINT,
euidBIGINT,
egidBIGINT,
suidBIGINT,
sgidBIGINT,
ondiskINTEGER,
wiredsizeBIGINT,
residentsizeBIGINT,
totalsizeBIGINT,
usertimeBIGINT,
systemtimeBIGINT,
diskbytesreadBIGINT,
diskbyteswrittenBIGINT,
starttimeBIGINT,
parentBIGINT,
pgroupBIGINT,
threadsINTEGER,
niceINTEGER,
iselevatedtokenINTEGER HIDDEN,
elapsedtimeBIGINT HIDDEN,
handlecountBIGINT HIDDEN,
percentprocessortimeBIGINT HIDDEN,
upidBIGINT HIDDEN,
uppidBIGINT HIDDEN,
cputypeINTEGER HIDDEN,
cpusubtypeINTEGER HIDDEN,
physfootprintBIGINT HIDDEN, PRIMARY KEY (
pid`)) WITHOUT ROWID;
osquery>
“`
要进一步确认,可以使用下面的命令查看 RPM 包的结构信息,然后与操作系统命令 rpm -qa
和 rpm -qi
的输出比较:
“
name
osquery>
osquery> .schema rpm_packages
CREATE TABLE rpm_packages(TEXT,
versionTEXT,
releaseTEXT,
sourceTEXT,
sizeBIGINT,
sha1TEXT,
archTEXT,
epochINTEGER,
installtimeINTEGER,
vendorTEXT,
packagegroupTEXT,
pidwithnamespaceINTEGER HIDDEN,
mountnamespaceidTEXT HIDDEN, PRIMARY KEY (
name,
version,
release,
arch,
epoch,
pidwithnamespace`)) WITHOUT ROWID;
osquery>
“`
从 Osquery 的 表格文档 获取更多信息。
使用 PRAGMA 命令
或许模式信息对你来说太难看懂,还有另一种途径能够以详细的表格格式打印表中的信息:PRAGMA
命令。例如,我想通过 PRAGMA
用一种易于理解的格式查看 rpm_packages
表的信息:
“`
osquery> PRAGMA tableinfo(rpmpackages);
“`
这种表格式信息的一个好处是你可以关注想要查询的字段,查看命令提供的类型信息:
“`
osquery> PRAGMA tableinfo(users);
+++–+-+–+-+
| 0 | uid | BIGINT | 1 | | 1 |
| 1 | gid | BIGINT | 0 | | 0 |
| 2 | uidsigned | BIGINT | 0 | | 0 |
| 3 | gid_signed | BIGINT | 0 | | 0 |
| 4 | username | TEXT | 1 | | 2 |
| 5 | description | TEXT | 0 | | 0 |
| 6 | directory | TEXT | 0 | | 0 |
| 7 | shell | TEXT | 0 | | 0 |
| 8 | uuid | TEXT | 1 | | 3 |
+++–+-+–+-+–+-+–+-+–+-+–+-+
via: https://opensource.com/article/21/6/osquery-linux
作者:Gaurav Kamathe 选题:lujun9972 译者:YungeG 校对:wxy
主题测试文章,只做测试使用。发布者:eason,转转请注明出处:https://aicodev.cn/2021/07/14/%e5%83%8f%e6%9f%a5%e8%af%a2%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%80%e6%a0%b7%e6%9f%a5%e8%af%a2%e4%bd%a0%e7%9a%84-linux-%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af/