Linux中國

像查詢資料庫一樣查詢你的 Linux 操作系統信息

Linux 提供了很多幫助用戶收集主機操作系統信息的命令:列出文件或者目錄的屬性信息;查詢安裝的軟體包、正在執行的命令、開機時啟動的服務;或者了解系統的硬體。

每個命令使用自己的輸出格式列出系統的信息。你需要使用 grepsedawk 這樣的工具過濾命令輸出的結果,以便找到特定的信息。此外,很多這樣的信息會頻繁變動,導致系統狀態的改變。

將所有的信息格式化為一個資料庫的 SQL 查詢的輸出進行查看將會十分有益。想像一下,你能夠像查詢具有類似名稱的 SQL 資料庫表一樣查詢 psrpm 命令的輸出。

幸運的是,有一個工具剛好實現了這個功能,而且功能更多: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
  => 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 -efps aux,對比命令的輸出和表中的內容:

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 -qarpm -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);

這種表格式信息的一個好處是你可以關注想要查詢的欄位,查看命令提供的類型信息:

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 文件的內容並執行 grepsedawk 命令獲取同樣的信息。

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 解釋器 echo SQL 查詢,通過管道輸出到 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;

了解更多

Osquery 是一個強大的工具,提供了許多可以用於解決各種使用案例的主機信息。你可以閱讀 文檔 了解更多 Osquery 的信息。

via: https://opensource.com/article/21/6/osquery-linux

作者:Gaurav Kamathe 選題:lujun9972 譯者:YungeG 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國