译者:YungeGuo
Linux提供了好多帮助用户搜集主机操作系统信息的命令:列举文件或则目录的属性信息;查询安装的软件包、正在执行的命令、开机时启动的服务;或则了解系统的硬件。
每位命令使用自己的输出格式列举系统的信息。你须要使用grep、sed、awk这样的工具过滤命令输出的结果linux查看操作系统信息,便于找到特定的信息。据悉linux 下载,好多这样的信息会频繁变动,造成系统状态的改变。
将所有的信息低格为一个数据库的SQL查询的输出进行查看将会非常有益。想像一下,你就能像查询具有类似名称的SQL数据库表一样查询ps和rpm命令的输出。
辛运的是linux查看操作系统信息,有一个工具恰好实现了这个功能,但是功能更多: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是SQListshell的一个更改版。执行osqueryi命令步入交互式命令提示符,就可以执行Osquery的命令,一般以.开始:
$ osqueryi
Using a virtual database. Need help, 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_sources
osquery>
检测各个表的模式
晓得表名后,可以查看每位表提供的信息。既然ps命令常常用于获取进程信息,就以processes为例。执行.schema命令加上表名查看表中保存的信息。假如要验证命令返回的结果,可以快速执行ps-ef或psaux,对比命令的输出和表中的内容:
osquery> .schema processes
CREATE TABLE processes(`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` INTEGER HIDDEN, `elapsed_time` BIGINT HIDDEN, `handle_count` BIGINT HIDDEN, `percent_processor_time` BIGINT HIDDEN, `upid` BIGINT HIDDEN, `uppid` BIGINT HIDDEN, `cpu_type` INTEGER HIDDEN, `cpu_subtype` INTEGER HIDDEN, `phys_footprint` BIGINT HIDDEN, PRIMARY KEY (`pid`)) WITHOUT ROWID;
osquery>
要进一步确认,可以使用下边的命令查看RPM包的结构信息,之后与操作系统命令rpm-qa和rpm-qi的输出比较:
osquery>
osquery> .schema rpm_packages
CREATE TABLE rpm_packages(`name` TEXT, `version` TEXT, `release` TEXT, `source` TEXT, `size` BIGINT, `sha1` TEXT, `arch` TEXT, `epoch` INTEGER, `install_time` INTEGER, `vendor` TEXT, `package_group` TEXT, `pid_with_namespace` INTEGER HIDDEN, `mount_namespace_id` TEXT HIDDEN, PRIMARY KEY (`name`, `version`, `release`, `arch`, `epoch`, `pid_with_namespace`)) WITHOUT ROWID;
osquery>
从Osquery的表格文档获取更多信息。
使用PRAGMA命令
其实模式信息对你来说太难看懂,还有另一种途径才能以详尽的表格格式复印表中的信息:PRAGMA命令。比如,我想通过PRAGMA用一种便于理解的格式查看rpm_packages表的信息:
osquery> PRAGMA table_info(rpm_packages);
这些表格式信息的一个用处是你可以关注想要查询的数组linux计划任务,查看命令提供的类型信息:
osquery> PRAGMA table_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 | username | TEXT | 1 | | 2 |
| 5 | description | TEXT | 0 | | 0 |
| 6 | directory | TEXT | 0 | | 0 |
| 7 | shell | TEXT | 0 | | 0 |
| 8 | uuid | TEXT | 1 | | 3 |
+-----+-------------+--------+---------+------------+----+
osquery>
进行你的第一次查询
在你从表、模式、条目中获取到所有进行查询所须要的信息后,进行你的第一次SQL查询查看其中的信息。下边的查询返回系统中的用户和每位用户的用户ID、组ID、主目录和默认的命令行类库。Linux用户通过查看/etc/passwd文件的内容并执行grep、sed、awk命令获取同样的信息。
osquery>
osquery> select uid,gid,directory,shell,uuid FROM users LIMIT 7;
+-----+-----+----------------+----------------+------+
| 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>
不步入交互模式的查询
假如你想要在不步入osqueri交互模式的情况下进行查询,该如何办?要用查询操作写命令行类库脚本,这些方法可能非常有用。这些情况下,可以直接从Bash类库echoSQL查询,通过管线输出到osqueri:
$ echo "select uid,gid,directory,shell,uuid FROM users LIMIT 7;" | 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> SELECT name,type,status,path FROM startup_items LIMIT 5;
name = README
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/README
name = anamon
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/anamon
name = functions
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/functions
name = osqueryd
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/osqueryd
name = AT-SPI D-Bus Bus
type = Startup Item
status = enabled
path = /usr/libexec/at-spi-bus-launcher --launch-immediately
osquery>
查阅二补码文件的ELF信息
如果你想要弄清ls二补码文件的更多细节,一般会通过readelf-h命令,加上ls命令的路径。查询Osquery的elf_info表你可以得到同样的信息:
osquery> SELECT * FROM elf_info WHERE path="/bin/ls";
class = 64
abi = sysv
abi_version = 0
type = dyn
machine = 62
version = 1
entry = 24064
flags = 0
path = /bin/ls
osquery>
如今你应当初步了解怎样使用osqueri查询自己想要的信息。但是,这种信息保存在数目巨大的表中;我查询过的一个系统中,有156个不同的表,这个数字可能是非常惊人的:
$ echo ".tables" | osqueryi | wc -l
156
$
要让事情显得更容易,可以从这种表开始获取你的Linux系统的信息:
系统信息表:
osquery> select * from system_info;
系统限制信息:
osquery> select * from ulimit_info;
由各类进程打开的文件:
osquery> select * from process_open_files;
系统上开放的端口:
osquery> select * from listening_ports;
运行中的进程信息:
osquery> select * from processes;
已安装的包信息:
osquery> select * from rpm_packages;
用户登入信息:
osquery> select * from last;
系统日志信息:
osquery> select * from syslog_events;