osquery 介绍
发布时间:2026/9/7 1:20:30来源:尧图网络
osquery 是适用于 Windows、OS X (macOS) 和 Linux 的操作系统检测框架。这些工具使低级操作系统分析和监控既高效又直观。 osquery 将操作系统公开为高性能关系数据库。 这允许你编写基于 SQL 的查询来探索操作系统数据。 使用 osquerySQL table 表示抽象概念例如正在运行的进程、加载的内核模块、打开的网络连接、浏览器插件、硬件事件或文件哈希。对 OSs 进行查询就像操作数据库一样使用最基本的 SQL 命令对设备进行提问对 OSs 及系统里的资源设备等进行展示SQL 表是通过一个简单的插件和扩展 API 实现的。 已经存在各种表并且正在编写更多表osquery.io/schema。安装要下载最新的稳定版本以及存储库信息和安装说明请访问 osquery.io/downloads。你可以根据自己的操作系统来分别进行安装 Windows, macOS 及 Linux。 简单地说Red Hat, CentOS 及 Fedorabash代码解读复制代码1. curl -L https://pkg.osquery.io/rpm/GPG | tee /etc/pki/rpm-gpg/RPM-GPG-KEY-osquery 2. yum-config-manager --add-repo https://pkg.osquery.io/rpm/osquery-s3-rpm.repo 3. yum-config-manager --enable osquery-s3-rpm 4. yum install osquery基于 Debian 及 Ubuntu Linux 发行版sql代码解读复制代码1. echo deb [archamd64] https://pkg.osquery.io/deb deb main | sudo tee /etc/apt/sources.list.d/osquery.list 3. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B 5. sudo apt-get update 6. sudo apt-get install osqueryWindowsarduino代码解读复制代码https://pkg.osquery.io/windows/osquery-4.8.0.msi在今天的演示中我将使用 Ubuntu 20.04 来进行展示。具体安装步骤可以参阅 How to Install and Use Osquery in Ubuntu使用 osqueryiosqueryi 是 osquery 交互式查询控制台/shell。 在这种模式下它是完全独立的不与守护进程通信也不需要以管理员身份运行尽管某些表在以非管理员身份运行时可能返回较少的结果。 使用 osquery shell 对查询进行原型设计并探索操作系统的当前状态。执行 SQL queriesosqueryi 允许你运行元命令和查询 osquery 表。 有关表、类型和列描述的完整列表请参阅 schema API。 有关 SQL 语法帮助请参阅 SQLite 所理解的 SQL。我们可以在自己的 terminal 中运行 osqueryi代码解读复制代码osqueryiruby代码解读复制代码1. liuxgliuxgu:~$ osqueryi 2. Using a virtual database. Need help, type .help 3. osquery接下来我们尝试来做一些 help。首先我们想知道有哪些 table 可以供我们来进行查询dart代码解读复制代码1. osquery .table 2. acpi_tables 3. apparmor_events 4. apparmor_profiles 5. apt_sources 6. arp_cache 7. atom_packages 8. augeas 9. authorized_keys 10. azure_instance_metadata 11. azure_instance_tags 12. block_devices 13. bpf_process_events 14. bpf_socket_events 15. carbon_black_info 16. carves 17. chrome_extension_content_scripts 18. chrome_extensions 19. cpu_time 20. [...]我们可以通过 .table 命令来查询所有的 table。这些表格可以供我们查询使用。接下来我们可以使用如下的命令来查看感兴趣的 table 的 schemamarkdown代码解读复制代码1. osquery .schema routes 2. CREATE TABLE routes(destination TEXT, netmask INTEGER, gateway TEXT, source TEXT, flags INTEGER, interface TEXT, mtu INTEGER, metric INTEGER, type TEXT, hopcount INTEGER, PRIMARY KEY (destination, netmask, gateway, source, flags, interface, mtu, metric, type, hopcount)) WITHOUT ROWID;或者使用如下的命令markdown代码解读复制代码1. osquery pragma table_info(routes); 2. ---------------------------------------------------- 3. | cid | name | type | notnull | dflt_value | pk | 4. ---------------------------------------------------- 5. | 0 | destination | TEXT | 1 | | 1 | 6. | 1 | netmask | INTEGER | 1 | | 2 | 7. | 2 | gateway | TEXT | 1 | | 3 | 8. | 3 | source | TEXT | 1 | | 4 | 9. | 4 | flags | INTEGER | 1 | | 5 | 10. | 5 | interface | TEXT | 1 | | 6 | 11. | 6 | mtu | INTEGER | 1 | | 7 | 12. | 7 | metric | INTEGER | 1 | | 8 | 13. | 8 | type | TEXT | 1 | | 9 | 14. | 9 | hopcount | INTEGER | 1 | | 10 | 15. ----------------------------------------------------我们还可以列出来所有的可用的命令 .helpvbnet代码解读复制代码1. osquery .help 2. Welcome to the osquery shell. Please explore your OS! 3. You are connected to a transient in-memory virtual database. 5. .all [TABLE] Select all from a table 6. .bail ON|OFF Stop after hitting an error 7. .connect PATH Connect to an osquery extension socket 8. .disconnect Disconnect from a connected extension socket 9. .echo ON|OFF Turn command echo on or off 10. .exit Exit this program 11. .features List osquerys features and their statuses 12. .headers ON|OFF Turn display of headers on or off 13. .help Show this message 14. .mode MODE Set output mode where MODE is one of: 15. csv Comma-separated values 16. column Left-aligned columns see .width 17. line One value per line 18. list Values delimited by .separator string 19. pretty Pretty printed SQL results (default) 20. .nullvalue STR Use STRING in place of NULL values 21. .print STR... Print literal STRING 22. .quit Exit this program 23. .schema [TABLE] Show the CREATE statements 24. .separator STR Change separator used by output mode 25. .socket Show the local osquery extensions socket path 26. .show Show the current values for various settings 27. .summary Alias for the show meta command 28. .tables [TABLE] List names of tables 29. .types [SQL] Show result of getQueryColumns for the given query 30. .width [NUM1] Set column widths for column mode 31. .timer ON|OFF Turn the CPU timer measurement on or off如果你想退出那么使用 .exit 命令或者 ^D。接下来我们来做一些简单的 query。列出来所有的用户我们打入如下的命令sql代码解读复制代码SELECT * from users;上面的显示有些凌乱我们可以只显示部分的信息sql代码解读复制代码SELECT username, shell FROM users;我们甚至可以使用 WHERE 来限定特定的条件sql代码解读复制代码SELECT * FROM users WHERE user;我们可以显示我们感兴趣的字段sql代码解读复制代码SELECT username, gid FROM users WHERE user;列出所有的 processes我们可以通过在交互式 shell 中运行以下命令来列出在 ubuntu 中运行的前五个进程sql代码解读复制代码SELECT * FROM processes LIMIT 5;由于系统中有很多进程在运行所以我们使用 LIMIT 关键字只显示了五个进程。我们可以找到特定进程的进程ID例如我们想找到 Java 的进程 ID所以我们将在交互式 shell 中运行以下命令sql代码解读复制代码SELECT pid FROM processes WHERE ;查找 Ubuntu 版本信息我们可以通过在交互式 shell 中运行以下命令来找到我们的 Ubuntu 系统的版本sql代码解读复制代码SELECT * FROM os_version;检查网络接口和 IP 地址我们可以通过在交互式 shell 中运行以下查询来检查 IP 地址、网络接口的子网掩码。vbnet代码解读复制代码1. SELECT interface,address,mask FROM interface_addresses 2. WHERE interface NOT LIKE %lo%;检查登录用户我们还可以通过从 “logged_in_users” 表中查询数据来检查您系统上的登录用户。 运行以下命令以查找已登录的用户。sql代码解读复制代码SELECT user,host,time FROM logged_in_users WHERE tty NOT LIKE -;检查系统内存我们还可以通过在交互式 shell 中运行一些基于 SQL 的命令来检查总内存、空闲内存缓存内存等。 要检查总内存请运行以下命令。 这将为我们提供系统的总内存以字节为单位。sql代码解读复制代码SELECT memory_total FROM memory_info;我们还可以通过运行以下查询使用 memory_info 表检查系统的缓存内存。csharp代码解读复制代码select cached from memory_info;列出 groups我们可以通过在交互式 shell 中运行以下查询来找到系统中的所有组sql代码解读复制代码SELECT * FROM groups;显示监听端口我们可以通过在交互式 shell 中运行以下命令来显示我们系统的所有监听端口sql代码解读复制代码SELECT * FROM listening_ports;我们还可以通过在交互式 shell 中运行以下命令来检查端口是否正在侦听ini代码解读复制代码SELECT port, address, path,family,protocol FROM listening_ports WHERE port9200;检测一个正在运行的进程但是没有 binary 在磁盘上ini代码解读复制代码SELECT name, path, pid FROM processes WHERE on_disk 0;这通常是一个病毒。检测一个用户的登录时间sql代码解读复制代码1. SELECT * FROM last 2. WHERE username liuxg 3. AND time (( SELECT unix_time FROM time ) - 3600 );寻找侦听网络端口的新进程vbnet代码解读复制代码SELECT DISTINCT process.name, listening.port, listening.address, process.pid FROM processes AS process JOIN listening_ports AS listening ON process.pid listening.pid;查找 Python 安装的包csharp代码解读复制代码select name, version from python_packages;查找已经装载的 kernel 模块csharp代码解读复制代码select name from kernel_modules;查找消耗 CPU 最高的5个进程sql代码解读复制代码1. SELECT pid, uid, name, ROUND(( 2. (user_time system_time) / (cpu_time.tsb - cpu_time.itsb) 3. ) * 100, 2) AS percentage 4. FROM processes, ( 5. SELECT ( 6. SUM(user) SUM(nice) SUM(system) SUM(idle) * 1.0) AS tsb, 7. SUM(COALESCE(idle, 0)) SUM(COALESCE(iowait, 0)) AS itsb 8. FROM cpu_time 9. ) AS cpu_time 10. ORDER BY user_timesystem_time DESC 11. LIMIT 5;如上所示那个 java 进程就是 Elasticsearch 运行的进程。它占用的 CPU 时间比较多。对 Chrome 浏览器中的插件进行查询sql代码解读复制代码1. SELECT ext.name, ext.description, ext.version 2. FROM users 3. JOIN chrome_extensions ext using (uid);运动 osqueryd在有些时候我们希望运行 osquery 并让它作为一个服务一直运行并定期收集信息。这些信息可以写到一个日志文件中。为了能到这个目的我们必须创建一个 osquery 的配置文件。这个配置文件依赖于不同的操作系统它的位置有所改变javascript代码解读复制代码1. Windows: C:\Program Files\osquery\osquery.conf 2. Linux: /etc/osquery/osquery.conf and /etc/osquery/osquery.conf.d/ 3. macOS: /var/osquery/osquery.conf and /var/osquery/osquery.conf.d/你可以使用 --config_path/path/to/osquery.conf 覆盖文件系统插件的路径。针对 Linux 系统我们可以创建如下的文件/etc/osquery/osquery.confruby代码解读复制代码1. liuxgliuxgu:~$ ls /etc/osquery/osquery.conf 2. /etc/osquery/osquery.conf 3. liuxgliuxgu:~$ cat /etc/osquery/osquery.conf 4. { 5. options: { 6. config_plugin: filesystem, 7. logger_plugin: filesystem, 8. utc: true 9. }, 11. schedule: { 12. system_info: { 13. query: SELECT hostname, cpu_brand, physical_memory FROM system_info;, 14. interval: 20 15. }, 16. high_load_average: { 17. query: SELECT period, average, 70% AS threshold FROM load_average WHERE period 15m AND average 0.7;, 18. interval: 10, 19. description: Report if load charge is over 70 percent. 20. }, 21. low_free_memory: { 22. query: SELECT memory_total, memory_free, CAST(memory_free AS real) / memory_total AS memory_free_perc, 10% AS threshold FROM memory_info WHERE memory_free_perc 0.1;, 23. interval: 60, 24. description: Free RAM is under 10%. 25. } 26. } 27. }在上面的 schedule 里定义的时间间隔是以秒来计算的。它们定期收集信息并生成日志。我们来启动 osquerydmarkdown代码解读复制代码1. systemctl enable osqueryd 2. systemctl start osqueryd我们接下来进入到如下的路径ruby代码解读复制代码1. liuxgliuxgu:~$ cd /var/log/osquery/ 2. liuxgliuxgu:/var/log/osquery$ ls 3. osqueryd.INFO osqueryd.INFO.20220428-150819.82777 osqueryd.results.log 4. liuxgliuxgu:/var/log/osquery$我们差其中的 osqueryd.results.log 内容我们可以看到有些已经被收集起来的信息。这些信息可以被传送到一些系统中做更进一步的分析。结论Osquery 是一个非常有用的软件实用程序可用于查找有关你的系统的任何类型的信息。 如果你已经了解基于 SQL 的查询那么它对你来说非常容易使用或者如果你不了解基于 SQL 的查询那么我已尽力向你展示一些对查找数据有用的主要查询。 你可以通过运行类似的查询从任何表中找到任何类型的数据。在将来的文章中我将详细讲述如何使用 Elastic Agent来获取 osquery 信息。敬请期待参考【1】 Demos/Osquery at main · OpenSecureCo/Demos · GitHub作者Elasticsearch链接https://juejin.cn/post/7091637645234667534来源稀土掘金著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。
网站建设高端定制企业官网