logo-big
Echo “Hallo Welt!”;
Ich habe ein bisschen in Github gestöbert und habe Folgendes ausgegraben.
OSQuery ist ein schickes Projekt der Firma “Facebook”, welches zum Zweck ihrer eigenen Systemüberwachnung entstanden ist.
Es bildet Systeminformationen in einer schnellen SQLite- bzw. Postgresdatenbank ab.
Nach der Installation als Package osquery-1.5.1.pkg kann man direkt loslegen.
In der Bash kann man mit dem Aufruf von “osqueryi” die interaktive Query Shell starten.
Hier eröffnet einem die interne Hilfe mehr Information zu dem was hier möglich ist.

osquery> .help
Welcome to the osquery shell. Please explore your OS!
You are connected to a transient 'in-memory' virtual database.
.all [TABLE]       Select all from a table
.bail ON|OFF       Stop after hitting an error; default OFF
.echo ON|OFF       Turn command echo on or off
.exit              Exit this program
.header(s) ON|OFF  Turn display of headers on or off
.help              Show this message
.mode MODE         Set output mode where MODE is one of:
                     csv      Comma-separated values
                     column   Left-aligned columns.  (See .width)
                     line     One value per line
                     list     Values delimited by .separator string
                     pretty   Pretty printed SQL results
.nullvalue STR     Use STRING in place of NULL values
.print STR...      Print literal STRING
.quit              Exit this program
.schema [TABLE]    Show the CREATE statements
.separator STR     Change separator used by output mode and .import
.show              Show the current values for various settings
.tables [TABLE]    List names of tables
.trace FILE|off    Output each SQL statement as it is run
.width [NUM1]+     Set column widths for "column" mode
.timer ON|OFF      Turn the CPU timer measurement on or off
osquery>

Wir sind mal neugierig und schiessen auf der osquery Shell das folgende Kommando ab:

osquery> .tables
..
  => os_version
  => osquery_extensions
  => osquery_flags
  => osquery_info
  => osquery_packs
  => osquery_registry
  => osquery_schedule
  => package_bom
  => package_receipts
  => passwd_changes
  => pci_devices
  => preferences
  => process_envs
  => process_events
  => process_memory_map
  => process_open_files
  => process_open_sockets
  => processes
  => routes
  => safari_extensions
  => sandboxes
  => shell_history
  => smbios_tables
  => startup_items
  => suid_bin
  => system_controls
  => time
..

Was wir hier erhalten, sind die Systemfakten welche automatisch im Hintergrund in festgelegten Intervallen abgefragt werden.
Beispiel 1)
Fragen wir zum Test die ‘os_version’ ab.
Dies tun wir folgendermaßen:

osquery> select * from os_version;
+----------+-------+-------+-------+-------+
| name     | major | minor | patch | build |
+----------+-------+-------+-------+-------+
| Mac OS X | 10    | 10    | 4     | 14E46 |
+----------+-------+-------+-------+-------+

Dies ist ein Beispiel für ein einfaches Abfragestatement. (Wenn wir wissen wollen welche OS-Version unsere Rechnerflotte hat.)
Beispiel 2)
Ein Komplexeres Beispiel in SQL:

osquery> select distinct process.name, listening.port, listening.address, process.pid FROM processes AS process JOIN listening_ports AS listening ON process.pid = listening.pid;
+----------------+-------+---------+-----+
| name           | port  | address | pid |
+----------------+-------+---------+-----+
| UserEventAgent | 0     | 0.0.0.0 | 251 |
| UserEventAgent | 0     |         | 251 |
| Adium          | 55648 | 0.0.0.0 | 261 |
| SystemUIServer | 59036 | 0.0.0.0 | 265 |
+----------------+-------+---------+-----+

Dies wird alles mit durch OSQuery in festgelegten Intervalle in das Logfile überführt.
Es liegt in unserem Beispielsystem unter

/var/log/osquery.log

und kann mit einer geeigneten Software wie Icinga & Logstash weiter ausgewertet werden.
Nun noch der knifflige Teil des Setups: Ich habe kurz angerissen, wie die SQL Syntax von OSQuery funktioniert und angedeutet, wie flexibel das Ganze ist.
Die unbeantwortete Frage ist allerdings, wie ich meine eigenen Checks in einem Interval definiere.
Dies erfolgt bei OSQuery über eine simple ‘.conf’-Datei. In diesem Beispiel liegt diese unter /var/osquery/osquery.conf.
In der osquery.conf wird beispielsweise ein Check mit der folgenden Syntax erstellt:

.. excerpt
 "schedule": {
        "info": {
        "query": "select * from startup_items"
        "interval": 3600
        }
 }
../excerpt

Fazit:
Aufgrund der simplen Abfragestatements und den kleinen Footprint durch eine SQLite Datenbank kann man im Hintergrund auf Linux & OS X Clients/Servern einen Faktencheck durchführen und durch andere Tools “in der Ferne” auswerten lassen.
Kurzum, man bekommt ein mächtiges Werkzeug für Devops und Systemadministratoren, welches an die meisten Umgebungen angepasst werden kann.
Bis zum nächsten Post!

David Okon
David Okon
Senior Consultant

Weltenbummler David hat aus Berlin fast den direkten Weg zu uns nach Nürnberg genommen. Bevor er hier anheuerte, gab es einen kleinen Schlenker nach Irland, England, Frankreich und in die Niederlande. Alles nur, damit er sein Know How als IHK Geprüfter DOSenöffner so sehr vertiefen konnte, dass er vom Apple Consultant den Sprung in unser Professional Services-Team wagen konnte. Er ist stolzer Papa eines Sohnemanns und bei uns mit der Mission unterwegs, unsere Kunden zu...