Skip to main content

osquery-python

osquery-python-logo

osquery exposes an operating system as a high-performance relational database. This allows you to write SQL-based queries to explore operating system data. With osquery, SQL tables represent abstract concepts such as running processes, loaded kernel modules, open network connections, browser plugins, hardware events or file hashes.

If you're interested in learning more about osquery, visit the GitHub project, the website, and the users guide.

What is osquery-python?

Build Status

In osquery, SQL tables, configuration retrieval, log handling, etc are implemented via a simple, robust plugin and extensions API. This project contains the official Python bindings for creating osquery extensions in Python. Consider the following example:

#!/usr/bin/env python

import osquery

@osquery.register_plugin
class MyTablePlugin(osquery.TablePlugin):
    def name(self):
        return "foobar"

    def columns(self):
        return [
            osquery.TableColumn(name="foo", type=osquery.STRING),
            osquery.TableColumn(name="baz", type=osquery.STRING),
        ]

    def generate(self, context):
        query_data = []

        for _ in range(2):
            row = {}
            row["foo"] = "bar"
            row["baz"] = "baz"
            query_data.append(row)

        return query_data

if __name__ == "__main__":
    osquery.start_extension(name="my_awesome_extension", version="1.0.0")

To test this code start an osquery shell:

osqueryi --nodisable_extensions
osquery> select value from osquery_flags where name = 'extensions_socket';
+-----------------------------------+
| value                             |
+-----------------------------------+
| /Users/USERNAME/.osquery/shell.em |
+-----------------------------------+

Then start the Python extension:

python ./my_table_plugin.py --socket /Users/USERNAME/.osquery/shell.em

Alternatively, you can also autoload your extension when starting an osquery shell:

osqueryi --extension path_to_my_table_plugin.py

This will register a table called "foobar". As you can see, the table will return two rows:

osquery> select * from foobar;
+-----+-----+
| foo | baz |
+-----+-----+
| bar | baz |
| bar | baz |
+-----+-----+
osquery>

This is obviously a contrived example, but it's easy to imagine the possibilities.

Using the instructions found on the wiki, you can easily deploy your extension with an existing osquery deployment.

Extensions are the core way that you can extend and customize osquery. At Facebook, we use extensions extensively to implement many plugins that take advantage of internal APIs and tools.

Execute queries in Python

The same Thrift bindings can be used to create a Python client for the osqueryd or osqueryi's extension socket. There are helper classes provided that spawn an ephemeral osquery process for consecutive or long running client instances.

import osquery

if __name__ == "__main__":
    # Spawn an osquery process using an ephemeral extension socket.
    instance = osquery.SpawnInstance()
    instance.open()  # This may raise an exception

    # Issues queries and call osquery Thrift APIs.
    instance.client.query("select timestamp from time")

Connect to an existing socket

In the example above the SpawnInstance() method is used to fork and configure an osquery instance. We can use similar APIs to connect to the Thrift socket of an existing osquery instance. Remember, normal UNIX permissions apply to the Thrift socket.

Imagine if you started osqueryd:

$ osqueryd --ephemeral --disable_logging --disable_database \
    --extensions_socket /home/you/.osquery/osqueryd.sock &

Then use the Python bindings:

import osquery

if __name__ == "__main__":
    # You must know the Thrift socket path
    # For an installed and running system osqueryd, this is:
    #   Linux and macOS: /var/osquery/osquery.em
    #   FreeBSD: /var/run/osquery.em
    #   Windows: \\.\pipe\osquery.em
    instance = osquery.ExtensionClient('/home/you/.osquery/osqueryd.sock')
    instance.open()  # This may raise an exception

    # Issue queries and call osquery Thrift APIs.
    client = instance.extension_client()
    client.query('select timestamp from time')

Install

To install from PyPi, run the following:

pip install osquery

Alternatively, to install from this repo, run the following:

python setup.py build
python setup.py install

Development

See CONTRIBUTING.md and the osquery wiki for development information.

How To Release

  1. Pick a version number
  2. Update osquery/__init__.py to match
  3. Use the GitHub release
  4. Make sure the GitHub Action ran

Vulnerabilities

Facebook has a bug bounty program that includes osquery. If you find a security vulnerability in osquery, please submit it via the process outlined on that page and do not file a public issue. For more information on finding vulnerabilities in osquery, see a recent blog post about bug-hunting osquery.

Release files for osquery 3.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for osquery 3.1.1
File Size Uploaded
osquery-3.1.1.tar.gz 24.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for osquery 3.1.1
File Interpreter ABI Platform
osquery-3.1.1-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 52.1 kB

Release files / osquery-3.1.1.tar.gz

Download URL osquery-3.1.1.tar.gz
Size 24.5 kB
Tags Source
SHA-256 checksum
How to use checksums
8dbafbcb19d733b390e94ecf2423967f95610655c927200feef03ea7b265699d
BLAKE2b-256 checksum
How to use checksums
027a3b5060835ba7c153097ac103c5827f3fcf5add4e0c156816e6eeeb0036e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.0 CPython/3.12.4

Release files / osquery-3.1.1-py2.py3-none-any.whl

Download URL osquery-3.1.1-py2.py3-none-any.whl
Size 27.6 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
a334a1ea867a1028b314f54669c13c6825299a6a17a88b3c2af496f8ff3d0345
BLAKE2b-256 checksum
How to use checksums
9b55b0461ca9bad25a4a565f7dd25818be97d7e698af5c92cb3cd455100a0254
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/5.1.0 CPython/3.12.4

Release history Release notifications | RSS feed

This release

3.1.1 This release

2 release files

3.1.0

2 release files

3.0.7

2 release files

3.0.6

2 release files

3.0.5

1 release file

3.0.4

1 release file

3.0.3

1 release file

3.0.2

1 release file

3.0.1

1 release file

3.0.0

1 release file

2.2.1

1 release file

2.2.0

1 release file

1.8.0

1 release file

0.1.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page