osquery-rust-ng
By providing Rust bindings for Osquery this crate facilitates the implementation of Osquery extensions.
Features
- ✅ Table plugins - Create custom tables to query system information
- ✅ Logger plugins - Implement custom logging backends for osquery
- ✅ Config plugins - Provide custom configuration sources for osquery
- ✅ Writable tables - Support for INSERT, UPDATE, and DELETE operations
- 🦀 Pure Rust - No C/C++ dependencies, just safe Rust code
- 🚀 High performance - Minimal overhead for extensions
- 📦 Easy to use - Simple API with examples to get started quickly
Building
Clone the repository and build the workspace:
Run tests:
The project uses a workspace structure with the main library and several examples. All examples are built automatically when you build the workspace.
Quick Start
Here's a simple example of creating a read-only table plugin:
use *;
use ;
use BTreeMap;
;
Migrating to 2.0
Version 2.0 simplifies the shutdown API by removing ShutdownReason. If upgrading from 1.x:
Before (1.x):
After (2.0):
This affects all plugin traits: ReadOnlyTable, Table, LoggerPlugin, and ConfigPlugin.
The Server::stop() and ServerStopHandle::stop() methods also no longer take a reason parameter.
Usage Guide
Creating Table Plugins
Table plugins allow you to expose data as SQL tables in osquery. There are two types:
- Read-only tables - Implement the
ReadOnlyTabletrait - Writable tables - Implement the
Tabletrait for full CRUD operations
Creating Logger Plugins
Logger plugins receive log data from osquery and can forward it to various backends:
use ;
;
The features() method tells osquery what log types your plugin supports. By default, loggers receive status logs (INFO/WARNING/ERROR from osquery internals). Available features:
LoggerFeatures::BLANK- Query results onlyLoggerFeatures::LOG_STATUS- Status logs (default)LoggerFeatures::LOG_EVENT- Event logs
Creating Config Plugins
Config plugins provide configuration data to osquery, allowing dynamic configuration management:
use ConfigPlugin;
use HashMap;
;
Integration with osquery
There are three ways to run your extension:
- Direct loading:
osqueryi --extension /path/to/extension - Socket connection: Run extension separately with
--socket /path/to/osquery.sock - Auto-loading: Place extension in osquery's autoload directory
See the examples directory for complete implementations.
Graceful Shutdown
Extensions support graceful shutdown through multiple mechanisms:
Signal Handling (recommended for production)
Use run_with_signal_handling() to automatically handle SIGTERM and SIGINT:
Programmatic Shutdown
Use ServerStopHandle to stop the server from another thread:
let mut server = new?;
let handle = server.get_stop_handle;
// In another thread or signal handler:
spawn;
server.run?;
Shutdown Lifecycle
When shutdown is triggered (via signal, osquery RPC, or stop()):
- The server deregisters from osquery
- All plugins receive a
shutdown()callback - The socket file is cleaned up
run()returns
Examples
The repository includes several complete examples:
- table-proc-meminfo - Exposes
/proc/meminfoas a queryable table - writeable-table - Demonstrates INSERT, UPDATE, DELETE operations
- two-tables - Shows how to register multiple tables in one extension
- logger-file - Logger plugin that writes to files
- logger-syslog - Logger plugin that sends logs to syslog
- config-file - Config plugin that loads configuration from JSON files
- config-static - Config plugin that provides static configuration
Each example includes its own README with specific build and usage instructions.
Contributing
We welcome contributions! Here's how to get started:
Development Setup
- Fork and clone the repository
- Install the pre-commit hook:
Code Quality Standards
This project maintains high code quality standards:
- All code must pass
cargo fmt - No clippy warnings allowed (enforced by CI)
- All tests must pass
- Unsafe code must be documented
The pre-commit hook automatically runs these checks.
Testing
Run the full test suite:
Pull Request Process
- Create a feature branch from
main - Write tests for new functionality
- Ensure all checks pass
- Submit a PR with a clear description
- Address review feedback
Reporting Issues
Please report issues on GitHub with:
- osquery version
- Rust version
- Operating system
- Steps to reproduce
- Expected vs actual behavior
Project Structure
The project is organized as a Cargo workspace:
- osquery-rust/ - The main library crate with Thrift bindings and plugin framework
- examples/ - Working examples demonstrating different plugin types:
table-proc-meminfo/- Read-only table examplewriteable-table/- Full CRUD table exampletwo-tables/- Multiple tables in one extensionlogger-file/- File logger pluginlogger-syslog/- Syslog logger pluginconfig-file/- An example that loads a config from a json fileconfig-static/- An example that provides a static config
Additional Resources
- Examples: osquery-rust by example
- API Documentation: docs.rs/osquery-rust-ng
Related Projects
This project contributed the support for Unix Domain Sockets to Apache Thrift's Rust crate.
This project was initially forked from polarlab's osquery-rust project.