像查詢資料庫一樣查詢你的 Linux 作業系統信息 | Linux 中國

2022-01-03 Linux

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

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

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

幸運的是,有一個工具剛好實現了這個功能,而且功能更多:Osquery 是一個 開源的 「由 SQL 驅動的作業系統儀表、監控和分析框架」。

許多處理安全、DevOps、合規性的應用,以及倉儲管理管理(僅舉幾例)在內部依賴 Osquery 提供的核心功能。

安裝 Osquery

Osquery 適用於 Linux、macOS、Windows、FreeBSD。請按照 指南 為你的作業系統安裝最新版本。(我會在下面的例子中使用 4.7.0 版本。)

安裝完成後,確保 Osquery 可以工作:

osquery-4.7.0-1.linux.x86_64

Osquery 組件

Osquery 有兩個主要組件:

◈ osqueri 是一個交互式的 SQL 查詢控制臺,可以獨立運行,不需要超級用戶權限(除非要查詢的表格需要訪問權限)。◈ osqueryd 像一個安裝在主機的監控守護進程,可以定期調度查詢操作執行,從底層架構收集信息。

可以在不運行 osqueryd 的情況下執行 osqueri。另一個工具,osqueryctl,控制守護進程的啟動、停止,並檢查其狀態。

$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin

使用 osqueryi 交互式命令提示符

你和 Osquery 的交互與使用 SQL 資料庫十分相似。事實上,osqueryi 是 SQList shell 的一個修改版。執行 osqueryi 命令進入交互式命令提示符 ,就可以執行 Osquery 的命令,通常以 . 開始:

Using a virtual database. Need help, type '.help'

要退出交互式命令提示符,執行 .quit 命令回到作業系統的命令提示符:

找出可用的表

如前所述,Osquery 像 SQL 查詢一樣輸出數據,資料庫中的信息通常保存在表中。但是如何在不知道表名的情況下查詢這些表呢?你可以運行 .tables 命令列出所有可以查詢的表。如果你是一個 Linux 長期用戶或者一個系統管理員 ,就會對表名十分熟悉,因為你一直在使用作業系統命令獲取同樣的信息:

=> ycloud_instance_metadata

檢查各個表的模式

知道表名後,可以查看每個表提供的信息。既然 ps 命令經常用於獲取進程信息,就以 processes 為例。執行 .schema 命令加上表名查看表中保存的信息。如果要驗證命令返回的結果,可以快速執行 ps -ef 或 ps aux,對比命令的輸出和表中的內容:

osquery> .schema processesCREATE 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;

要進一步確認,可以使用下面的命令查看 RPM 包的結構信息,然後與作業系統命令 rpm -qa 和 rpm -qi 的輸出比較:

osquery> .schema rpm_packagesCREATE 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 的 表格文檔 獲取更多信息。

使用 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 |++---+---+----+--+----+

進行你的第一次查詢

在你從表、模式、條目中獲取到所有進行查詢所需要的信息後,進行你的第一次 SQL 查詢查看其中的信息。下面的查詢返回系統中的用戶和每個用戶的用戶 ID、組 ID、主目錄和默認的命令行解釋器。Linux 用戶通過查看 /etc/passwd 文件的內容並執行 grep、sed、awk 命令獲取同樣的信息。

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 | |+++-+-+-+

不進入交互模式的查詢

如果你想要在不進入 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; path = /etc/rc.d/init.d/README path = /etc/rc.d/init.d/anamon path = /etc/rc.d/init.d/functions path = /etc/rc.d/init.d/osqueryd path = /usr/libexec/at-spi-bus-launcher --launch-immediately

查閱二進位文件的 ELF 信息

假如你想要弄清 ls 二進位文件的更多細節,通常會通過 readelf -h 命令,加上 ls 命令的路徑。查詢 Osquery 的 elf_info 表你可以得到同樣的信息:

osquery> SELECT * FROM elf_info WHERE path="/bin/ls";

現在你應該初步了解如何使用 osqueri 查詢自己想要的信息。然而,這些信息保存在數量巨大的表中;我查詢過的一個系統中,有 156 個不同的表,這個數字可能是十分驚人的:

$ echo ".tables" | osqueryi | wc -l

要讓事情變得更容易,可以從這些表開始獲取你的 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 系統查詢機器最近重啟時間 | Linux 中國
    在你的 Linux 或類 UNIX 系統中,你是如何查詢系統上次重新啟動的日期和時間?怎樣顯示系統關機的日期和時間? last 命令不僅可以按照時間從近到遠的順序列出該會話的特定用戶、終端和主機名,而且還可以列出指定日期和時間登錄的用戶。輸出到終端的每一行都包括用戶名、會話終端、主機名、會話開始和結束的時間、會話持續的時間。
  • Linux本地信息收集
    我們在獲取到webshell之後,經常會遇到Linux的作業系統,這是我們需要對Linux系統本地的敏感資源進行信息收集
  • kali linux工具包簡介整理(1)——信息收集
    首先在虛擬機上安裝了kali linux,這個版本的linux上集成了大量滲透測試相關的工具,安裝好之後有點犯難了,這上邊的工具太多了,而且基本都是英文,所以我準備整理一套kali linux的工具簡介,同時逐個進行淺嘗輒止(精力有限)的測試,長期更新。
  • Linux 運維必備 150 個命令匯總
    定位你需要使用的命令,然後去這個網站查詢詳細用法即可。地址:wangchujiang.com/linux-command/圖片這個網站來自 GitHub 項目:linux-command.利用netstat指令可讓你得知整個Linux系統的網絡情況。ss :全拼Socket Statistics,用來獲取socket統計信息,它可以顯示和netstat類似的內容。ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。
  • Linux個人專題
    個人感覺學習linux的話最好的前提是了解各命令的作用。
  • linux每日命令(19):locate 命令
    linux每日命令(19):locate 命令locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案
  • Kali Linux滲透基礎知識整理(一):信息搜集
    簡單說,whois就是一個用來查詢域名是否已經被註冊,以及註冊域名的詳細信息的資料庫(如域名所有人、域名註冊商)。在whois查詢中,註冊人姓名和郵箱信息,通常對於測試個人站點非常有用,因為我們可以通過搜尋引擎,社交網絡,挖掘出很多域名所有人的信息。而對於小站點而言,域名所有人往往就是管理員。
  • Linux系統運維必備150個命令匯總
    基礎網絡操作命令(11個)    telnet:telnet命令使用TELNET協議遠程登錄。執行telnet指令開啟終端機階段作業,並登入遠端主機。    ssh:使用SSH加密協議遠程登錄。    netstat:顯示網絡狀態。利用netstat指令可讓你得知整個Linux系統的網絡情況。    ss:全拼Socket Statistics,用來獲取socket統計信息,它可以顯示和netstat類似的內容。
  • 檔案信息系統查詢利用安全保護
    主機系統安全的目標是確保在查詢利用過程中,檔案信息在進入、離開或駐留主機時保持可用性、完整性和保密性。它包含一系列關於主機安全的策略和技術手段,通過採用相應的身份認證、訪問控制等手段阻止未授權訪問,採用防火牆、入侵檢測等技術確保主機系統的安全,進行事件日誌審核以發現入侵企圖,在安全事件發生後通過對事件日誌的分析進行審計追蹤,確認事件對主機的影響以進行後續處理。
  • Linux的3個文件時間
    相信大家都已經很熟悉windows作業系統了,當我們在windows系統下創建一個文件時,系統同時會為這個文件建立相關的參數去描述這個文件,如圖:現在你可能會明白剛才修改文件的mtime時為什麼文件的ctime也會跟著被改變了吧,因為當文件的內容被修改,文件的大小即size是一定會發生改變的,所以文件的狀態時間會隨著文件的內容被修改從而被更新。
  • linux每日命令(24):Linux 目錄結構
    ,了解Linux文件系統的目錄結構,是學好Linux的至關重要的一步.深入了解linux文件目錄結構的標準和每個目錄的詳細功能,對於我們用好linux系統至關重要,下面我們就開始了解一下linux目錄結構的相關知識。
  • 每天一個 Linux 命令(23):Linux 目錄結構
    文件系統的是用來組織和排列文件存取的,所以她是可見的,在 Linux 中,我們可以通過 ls 等工具來查看其結構,在 Linux 系統中,我們見到的都是樹形結構;比如作業系統安裝在一個文件系統中,他表現為由/ 起始的樹形結構。linux 文件系統的最頂端是/,我們稱/為 Linux 的 root,也就是 Linux 作業系統的文件系統。
  • Kali Linux 是什麼,你需要它嗎? | Linux 中國
    Kali 並不要求你自己去維護一個 Linux 系統,或者你自己去收集軟體和依賴項。它是一個「交鑰匙工程」。所有這些繁雜的工作都不需要你去考慮,因此,你只需要專注於要審計的真實工作上,而不需要去考慮準備測試系統。如何使用它?Kali 是一個 Linux 發行版。與任何一個其它的 Linux 發行版一樣,你可以將它永久安裝到一個硬碟上。
  • Linux常用命令 & 實用命令萬字總結
    是一個多任務,多用戶的作業系統。多個用戶可以在同一時間作業系統執行不同的任務,一個用戶也可以多個人登陸操作。一般來說root的權限最大,我們經常使用的資料庫一般會用一個mysql的用戶,網頁相關的我們可能用一個www的帳號,大家都是知道刪除跑路的故事,因此有一些操作權限是要交給一些專人管理的。為了系統的學習,我覺得有必要了解一下它的基本知識。
  • linux作業系統還可以實時?
    Linux系統作為一個GPOS(通用作業系統)發展至今已經非常成熟可靠了,並且由於遵循GPL協議,開放所有系統原始碼,非常易於裁剪。更重要的是,與其他開源的GPOS或RTOS相比,Linux系統支持多種處理器、開發板,提供多種軟體開發工具,同時Linux系統對網絡和圖形界面的支持非常出色。顯然,選擇Linux作業系統在產品的開發周期和成本控制方面都有巨大優勢。
  • 安裝linux作業系統
    linux系統現在作為一個知名度很高的系統,如果是學計算機或者軟體開發相關工作的,Linux是一套免費使用和自由傳播的類Unix作業系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的作業系統,那怎樣安裝Linux系統?下面,小編給大家帶來了安裝Linux系統的操作圖文。
  • 【Linux】命令每日一個:Linux 目錄結構
    文件系統的是用來組織和排列文件存取的,所以她是可見的,在Linux中,我們可以通過ls等工具來查看其結構,在Linux系統中,我們見到的都是樹形結構;比如作業系統安裝在一個文件系統中,他表現為由/ 起始的樹形結構。linux文件系統的最頂端是/,我們稱/為Linux的root,也就是 Linux作業系統的文件系統。
  • 如何在 Linux 中實時監控日誌文件 | Linux 中國
    https://linux.cn/article-13733-1.html作者:Arindam譯者:geekpi當你在你的 Linux 桌面、伺服器或任何應用中遇到問題時,你會首先查看各自的日誌文件。日誌文件通常是來自應用的文本和信息流,上面有一個時間戳。它可以幫助你縮小具體的實例,並幫助你找到任何問題的原因。它也可以幫助從網絡上獲得援助。
  • 手把手教你快速使用Vmware虛擬機安裝Linux作業系統實驗環境
    使用Vmware虛擬機學習Linux系統,即是你不需要去真實的安裝一個Linux系統,通過虛擬機你就可以獲得和真實Linux系統大部分功能的體驗