Osquery Mastery: SQL for Infrastructure (Artikel 352)
Beherrschung von osquery zur Systemanalyse mittels SQL. Erfahren Sie, wie Sie Hardware, Prozesse und Netzwerk-Zustände mit einfachen Datenbank-Abfragen in Echtzeit überwachen.
# Osquery Mastery: Die Infrastruktur als Datenbank abfragen
TL;DR / Management Summary Wer wissen will, welche USB-Geräte eingesteckt sind oder welcher Prozess auf Port 80 lauscht, muss normalerweise dutzende CLI-Befehle beherrschen. Osquery verändert dies radikal: Es stellt das gesamte Betriebssystem als relationale Datenbank dar. Ein Senior Admin nutzt SQL-Abfragen, um hunderte Server gleichzeitig zu auditieren. Mit osquery finden wir in Sekunden heraus, welche Hosts veraltete Kernel-Versionen nutzen oder welche Prozesse ohne gültige Signatur laufen.
# 1. Einführung & Architektur
Das OS als Tabelle.
Osquery nutzt SQLite-Tabellen, um Kernel-Daten im RAM abzubilden. Es schreibt keine Daten, sondern liest sie nur – blitzschnell und ohne Systemlast.
# Die Architektur-Elemente (Mermaid)
graph TD
A[Admin / SIEM] -->|SQL Query| B[osquery CLI / Daemon]
B --> C{Abstraction Layer}
C --> D[Table: users]
C --> E[Table: processes]
C --> F[Table: listening_ports]
C --> G[Table: kernel_modules]
D/E/F/G --> H[Linux Kernel / proc / sys]
# 2. Die osquery Shell (osqueryi)
Interaktive Diagnose.
Starten Sie die Shell:
osqueryi
# Praxisbeispiele für Admins
-- 1. Wer ist aktuell eingeloggt?
SELECT user, host, time FROM logged_in_users;
-- 2. Welche Prozesse lauschen am Netzwerk?
SELECT pid, name, port FROM listening_ports JOIN processes USING (pid);
-- 3. Finde alle SUID-Binaries in /usr/bin
SELECT * FROM file WHERE path LIKE '/usr/bin/%' AND mode LIKE '%s%';
# 3. Der Dämon (osqueryd)
Kontinuierliche Überwachung.
In Enterprise-Umgebungen läuft osquery als Hintergrunddienst.
- Schedules: Führt Abfragen alle X Minuten aus und meldet nur die Differenz (Differenzial-Logging).
- Packs: Sammlungen von Abfragen für spezifische Zwecke (z.B. IT-Compliance, Incident Response).
# 4. Day-2 Operations: Security Monitoring
Anomaly Detection.
Nutzen Sie osquery, um Abweichungen vom Standard zu finden.
# Beispiel: Suche nach neuen Kernel-Modulen
-- Meldet Module, die nicht zum Standard-Set gehören
SELECT name, size FROM kernel_modules WHERE name NOT IN ('ext4', 'virtio', ...);
# 5. Troubleshooting & “War Stories”
Wenn die Abfrage zu teuer wird.
# Story 1: “Der Performance-Fresser (File-Table)”
Symptom: Der osqueryd verbraucht plötzlich 100% CPU und blockiert das System.
Ursache: Der Admin hat eine Abfrage wie SELECT * FROM file WHERE path LIKE '/%%' gestartet. Dies zwingt osquery, die gesamte Festplatte rekursiv zu scannen.
Lösung: Nutzen Sie die file Tabelle niemals ohne Filter auf spezifische Pfade (/etc/, /bin/). Nutzen Sie für globale Suchen lieber spezialisierte Tools wie find.
# Story 2: “Das leere Log (Permissions)”
Symptom: Osquery meldet für die Tabelle processes keine Pfade oder Cmdlines für manche PIDs.
Ursache: Der Admin führt osquery als normaler User aus. Der Zugriff auf /proc/<PID>/ für Prozesse anderer User ist nur Root erlaubt.
Lösung: Führen Sie osquery für Security-Audits immer mit sudo aus.
# 6. Fazit & Empfehlung
- Pflicht: Installieren Sie osquery auf jedem Server. Es ist das effizienteste Audit-Tool auf dem Markt.
- Zentralisierung: Senden Sie die JSON-Logs von
osquerydan einen ELK-Stack (Artikel 045). So haben Sie ein “Google für Ihre Hardware”. - Wahl: Nutzen Sie fertige Query-Packs (z.B. von Facebook oder Palantir), um sofort einen hohen Sicherheitsstandard zu erreichen.
# Anhang: Cheatsheet
| Aufgabe | SQL Abfrage |
|---|---|
| OS Version | SELECT * FROM os_version; |
| Uptime | SELECT * FROM uptime; |
| Top 5 CPU-Fresser | SELECT name, pid, total_size FROM processes ORDER BY total_size DESC LIMIT 5; |
| Crontab prüfen | SELECT * FROM crontab; |
| ARP Cache | SELECT * FROM arp_cache; |
| USB Geräte | SELECT * FROM usb_devices; |
| Installierte RPMs | SELECT name, version FROM rpm_packages; |
| Kernel Params | SELECT name, value FROM system_info; |
| Hilfe anzeigen | .help (innerhalb der Shell) |
| Tabellen listen | .tables |