Linux bietet viele Befehle, mit denen Benutzer Informationen über ihr Host-Betriebssystem sammeln können:Auflisten von Dateien oder Verzeichnissen zum Überprüfen von Attributen; Abfragen, um zu sehen, welche Pakete installiert sind, Prozesse ausgeführt werden und Dienste beim Booten gestartet werden; oder sich über die Hardware des Systems informieren.
Jeder Befehl verwendet sein eigenes Ausgabeformat, um diese Informationen aufzulisten. Sie müssen Tools wie grep
verwenden , sed
, und awk
um die Ergebnisse zu filtern, um bestimmte Informationen zu finden. Außerdem ändern sich viele dieser Informationen häufig, was zu Änderungen des Systemzustands führt.
Weitere Linux-Ressourcen
- Spickzettel für Linux-Befehle
- Spickzettel für fortgeschrittene Linux-Befehle
- Kostenloser Online-Kurs:RHEL Technical Overview
- Spickzettel für Linux-Netzwerke
- SELinux-Spickzettel
- Spickzettel für allgemeine Linux-Befehle
- Was sind Linux-Container?
- Unsere neuesten Linux-Artikel
Es wäre hilfreich, alle diese Informationen formatiert wie die Ausgabe einer SQL-Datenbankabfrage anzuzeigen. Stellen Sie sich vor, Sie könnten die Ausgabe von ps
abfragen und rpm
Befehle, als würden Sie eine SQL-Datenbanktabelle mit ähnlichen Namen abfragen.
Glücklicherweise gibt es ein Tool, das genau das und noch viel mehr kann:Osquery ist ein Open-Source-Framework für Instrumentierung, Überwachung und Analyse von Betriebssystemen auf SQL-Basis.
Viele Anwendungen, die sich mit Sicherheit, DevOps, Compliance und Bestandsverwaltung befassen (um nur einige zu nennen), hängen von den Kernfunktionen ab, die von Osquery im Kern bereitgestellt werden.
Installieren Sie Osquery
Osquery ist für Linux, macOS, Windows und FreeBSD verfügbar. Installieren Sie die neueste Version für Ihr Betriebssystem, indem Sie die Installationsanweisungen befolgen. (In diesen Beispielen verwende ich Version 4.7.0.)
Überprüfen Sie nach der Installation, ob es funktioniert:
$ rpm -qa | grep osquery
osquery-4.7.0-1.linux.x86_64
$
$ osqueryi --version
osqueryi version 4.7.0
$
Osquery-Komponenten
Osquery besteht aus zwei Hauptkomponenten:
- Osqueri ist eine interaktive SQL-Abfragekonsole. Es ist ein eigenständiges Dienstprogramm, das keine Superuser-Privilegien benötigt (es sei denn, Sie fragen Tabellen ab, die diese Zugriffsebene benötigen).
- osqueryd ist wie ein Überwachungsdämon für den Host, auf dem es installiert ist. Dieser Daemon kann Abfragen so planen, dass sie in regelmäßigen Abständen ausgeführt werden, um Informationen von der Infrastruktur zu sammeln.
Sie können das Dienstprogramm osqueri ausführen, ohne dass der Dämon osqueryd ausgeführt wird. Ein weiteres Dienstprogramm, osqueryctl , steuert das Starten, Stoppen und Überprüfen des Status des Daemons.
$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin
/usr/bin/osqueryctl
/usr/bin/osqueryd
/usr/bin/osqueryi
$
Verwenden Sie die interaktive Eingabeaufforderung von osqueryi
Sie interagieren mit Osquery ähnlich wie mit einer SQL-Datenbank. Tatsächlich ist osqueryi eine modifizierte Version der SQLite-Shell. osqueryi
ausführen command bringt Sie in eine interaktive Shell, wo Sie Osquery-spezifische Befehle ausführen können, die oft mit einem .
beginnen :
$ osqueryiein
Using a virtual database. Need help, type '.help'
osquery>
Um die interaktive Shell zu beenden, führen Sie .quit
aus Befehl, um zur Shell des Betriebssystems zurückzukehren:
osquery>
osquery> .quit
$
Finden Sie heraus, welche Tische verfügbar sind
Wie bereits erwähnt, stellt Osquery Daten als Ausgabe von SQL-Abfragen zur Verfügung. Informationen in Datenbanken werden häufig in Tabellen gespeichert. Aber wie können Sie diese Tabellen abfragen, wenn Sie ihre Namen nicht kennen? Nun, Sie können die .tables
ausführen Befehl, um alle Tabellen aufzulisten, die Sie abfragen können. Wenn Sie ein langjähriger Linux-Benutzer oder Systemadministrator sind, werden Ihnen die Tabellennamen vertraut sein, da Sie Betriebssystembefehle verwendet haben, um diese Informationen zu erhalten:
osquery> .tables
=> acpi_tables
=> apparmor_events
=> apparmor_profiles
=> apt_sources
<< snip >>
=> arp_cache
=> user_ssh_keys
=> users
=> yara
=> yara_events
=> ycloud_instance_metadata
=> yum_sources
osquery>
Überprüfen Sie das Schema für einzelne Tabellen
Da Sie nun die Tabellennamen kennen, können Sie sehen, welche Informationen jede Tabelle bereitstellt. Wählen Sie als Beispiel processes
, da das ps
Der Befehl wird häufig verwendet, um diese Informationen zu erhalten. Führen Sie .schema
aus Befehl gefolgt vom Tabellennamen, um zu sehen, welche Informationen in dieser Tabelle gespeichert sind. Wenn Sie die Ergebnisse überprüfen möchten, können Sie schnell ps -ef
ausführen oder ps aux
und vergleichen Sie die Ausgabe mit dem Inhalt der Tabelle:
osquery> .schema processes
CREATE TABLE processes(`pid` BIGINT, `name` TEXT, `path` TEXT, `cmdline` TEXT, `state` TEXT, `cwd` TEXT, `root` TEXT, `uid` BIGINT, `gid` BIGINT, `euid` BIGINT, `egid` BIGINT, `suid` BIGINT, `sgid` BIGINT, `on_disk` INTEGER, `wired_size` BIGINT, `resident_size` BIGINT, `total_size` BIGINT, `user_time` BIGINT, `system_time` BIGINT, `disk_bytes_read` BIGINT, `disk_bytes_written` BIGINT, `start_time` BIGINT, `parent` BIGINT, `pgroup` BIGINT, `threads` INTEGER, `nice` INTEGER, `is_elevated_token` INTEGER HIDDEN, `elapsed_time` BIGINT HIDDEN, `handle_count` BIGINT HIDDEN, `percent_processor_time` BIGINT HIDDEN, `upid` BIGINT HIDDEN, `uppid` BIGINT HIDDEN, `cpu_type` INTEGER HIDDEN, `cpu_subtype` INTEGER HIDDEN, `phys_footprint` BIGINT HIDDEN, PRIMARY KEY (`pid`)) WITHOUT ROWID;
osquery>
Um den Punkt zu verdeutlichen, verwenden Sie den folgenden Befehl, um das Schema für die RPM-Pakete anzuzeigen und die Informationen mit rpm -qa
zu vergleichen und rpm -qi
Betriebssystembefehle:
osquery>
osquery> .schema rpm_packages
CREATE TABLE rpm_packages(`name` TEXT, `version` TEXT, `release` TEXT, `source` TEXT, `size` BIGINT, `sha1` TEXT, `arch` TEXT, `epoch` INTEGER, `install_time` INTEGER, `vendor` TEXT, `package_group` TEXT, `pid_with_namespace` INTEGER HIDDEN, `mount_namespace_id` TEXT HIDDEN, PRIMARY KEY (`name`, `version`, `release`, `arch`, `epoch`, `pid_with_namespace`)) WITHOUT ROWID;
osquery>
Weitere Informationen finden Sie in der Tabellendokumentation von Osquery.
Verwenden Sie den PRAGMA-Befehl
Falls Ihnen Schemainformationen zu kryptisch sind, gibt es eine andere Möglichkeit, die Tabelleninformationen in einem ausführlichen, tabellarischen Format auszudrucken:das PRAGMA
Befehl. Ich verwende zum Beispiel PRAGMA
um Informationen für die rpm_packages
anzuzeigen Tabelle in einem schönen Format:
osquery> PRAGMA table_info(rpm_packages);
Ein Vorteil dieser tabellarischen Informationen besteht darin, dass Sie sich auf das Feld konzentrieren können, das Sie abfragen möchten, und die Art der bereitgestellten Informationen sehen können:
osquery> PRAGMA table_info(users);
+-----+-------------+--------+---------+------------+----+
| cid | name | type | notnull | dflt_value | pk |
+-----+-------------+--------+---------+------------+----+
| 0 | uid | BIGINT | 1 | | 1 |
| 1 | gid | BIGINT | 0 | | 0 |
| 2 | uid_signed | BIGINT | 0 | | 0 |
| 3 | gid_signed | BIGINT | 0 | | 0 |
| 4 | username | TEXT | 1 | | 2 |
| 5 | description | TEXT | 0 | | 0 |
| 6 | directory | TEXT | 0 | | 0 |
| 7 | shell | TEXT | 0 | | 0 |
| 8 | uuid | TEXT | 1 | | 3 |
+-----+-------------+--------+---------+------------+----+
osquery>
Führen Sie Ihre erste Abfrage aus
Nachdem Sie nun über alle erforderlichen Informationen aus der Tabelle, dem Schema und den abzufragenden Elementen verfügen, führen Sie Ihre erste SQL-Abfrage aus, um die Informationen anzuzeigen. Die folgende Abfrage gibt die Benutzer zurück, die auf dem System vorhanden sind, sowie die Benutzer-ID, die Gruppen-ID, das Home-Verzeichnis und die Standard-Shell jedes einzelnen. Linux-Benutzer können diese Informationen erhalten, indem sie den Inhalt von /etc/passwd
anzeigen Datei und mache etwas grep
, sed
, und awk
Magie.
osquery>
osquery> select uid,gid,directory,shell,uuid FROM users LIMIT 7;
+-----+-----+----------------+----------------+------+
| uid | gid | directory | shell | uuid |
+-----+-----+----------------+----------------+------+
| 0 | 0 | /root | /bin/bash | |
| 1 | 1 | /bin | /sbin/nologin | |
| 2 | 2 | /sbin | /sbin/nologin | |
| 3 | 4 | /var/adm | /sbin/nologin | |
| 4 | 7 | /var/spool/lpd | /sbin/nologin | |
| 5 | 0 | /sbin | /bin/sync | |
| 6 | 0 | /sbin | /sbin/shutdown | |
+-----+-----+----------------+----------------+------+
osquery>
Führen Sie Abfragen aus, ohne in den interaktiven Modus zu wechseln
Was ist, wenn Sie eine Abfrage ausführen möchten, ohne in den interaktiven Modus von osqueri zu wechseln? Dies kann sehr nützlich sein, wenn Sie Shell-Skripte darum herum schreiben. In diesem Fall könnten Sie echo
verwenden die SQL-Abfrage und leiten Sie sie direkt von der Bash-Shell an osqueri weiter:
$ echo "select uid,gid,directory,shell,uuid FROM users LIMIT 7;" | osqueryi
+-----+-----+----------------+----------------+------+
| uid | gid | directory | shell | uuid |
+-----+-----+----------------+----------------+------+
| 0 | 0 | /root | /bin/bash | |
| 1 | 1 | /bin | /sbin/nologin | |
| 2 | 2 | /sbin | /sbin/nologin | |
| 3 | 4 | /var/adm | /sbin/nologin | |
| 4 | 7 | /var/spool/lpd | /sbin/nologin | |
| 5 | 0 | /sbin | /bin/sync | |
| 6 | 0 | /sbin | /sbin/shutdown | |
+-----+-----+----------------+----------------+------+
$
Erfahren Sie, welche Dienste beim Hochfahren gestartet werden
Osquery kann auch alle Dienste zurückgeben, die so eingestellt sind, dass sie beim Booten gestartet werden. Zum Beispiel, um die startup_items
abzufragen Tabelle und rufen Sie den Namen, den Status und den Pfad der ersten fünf Dienste ab, die beim Start ausgeführt werden:
osquery> SELECT name,type,status,path FROM startup_items LIMIT 5;
name = README
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/README
name = anamon
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/anamon
name = functions
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/functions
name = osqueryd
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/osqueryd
name = AT-SPI D-Bus Bus
type = Startup Item
status = enabled
path = /usr/libexec/at-spi-bus-launcher --launch-immediately
osquery>
Nachschlagen von ELF-Informationen für eine Binärdatei
Stellen Sie sich vor, Sie möchten mehr Details über ls
erfahren binär. Normalerweise würden Sie dies mit readelf -h
tun Befehl gefolgt von ls
Befehlspfad. Sie können die elf_info
abfragen Tabelle mit Osquery und erhalten die gleichen Informationen:
osquery> SELECT * FROM elf_info WHERE path="/bin/ls";
class = 64
abi = sysv
abi_version = 0
type = dyn
machine = 62
version = 1
entry = 24064
flags = 0
path = /bin/ls
osquery>
Jetzt haben Sie einen Vorgeschmack darauf, wie Sie mit osqueri nach für Sie interessanten Informationen suchen können. Diese Informationen werden jedoch in einer Vielzahl von Tabellen gespeichert. Ein System, das ich abgefragt habe, hatte 156 verschiedene Tabellen, was überwältigend sein kann:
$ echo ".tables" | osqueryi | wc -l
156
$
Zur Vereinfachung können Sie mit diesen Tabellen beginnen, um Informationen über Ihr Linux-System zu erhalten:
Systeminformationstabelle
osquery> select * from system_info;
Systembegrenzungsinformationen
osquery> select * from ulimit_info;
Dateien, die von verschiedenen Prozessen geöffnet wurden
osquery> select * from process_open_files;
Ports auf einem System öffnen
osquery> select * from listening_ports;
Informationen zu laufenden Prozessen
osquery> select * from processes;
Informationen zu installierten Paketen
osquery> select * from rpm_packages;
Anmeldeinformationen des Benutzers
osquery> select * from last;
Systemprotokollinformationen
osquery> select * from syslog_events;
Weitere Informationen
Osquery ist ein leistungsstarkes Tool, das viele Hostinformationen bereitstellt, die zur Lösung verschiedener Anwendungsfälle verwendet werden können. Sie können mehr über Osquery erfahren, indem Sie seine Dokumentation lesen.