Linux nabízí mnoho příkazů, které uživatelům pomohou získat informace o jejich hostitelském operačním systému:výpis souborů nebo adresářů pro kontrolu atributů; dotazování, zda jsou nainstalovány balíčky, běží procesy a služby začínají při startu; nebo se dozvědět o hardwaru systému.
Každý příkaz používá svůj vlastní výstupní formát pro výpis těchto informací. Musíte použít nástroje jako grep
, sed
a awk
filtrovat výsledky, abyste našli konkrétní informace. Mnoho těchto informací se také často mění, což vede ke změnám ve stavu systému.
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Bylo by užitečné zobrazit všechny tyto informace ve formátu jako výstup databázového SQL dotazu. Představte si, že byste se mohli dotazovat na výstup ps
a rpm
příkazy, jako byste se dotazovali na tabulku databáze SQL s podobnými názvy.
Naštěstí existuje nástroj, který dělá právě to a mnohem víc:Osquery je open source „systém pro instrumentaci, monitorování a analýzu operačního systému s podporou SQL.“
Mnoho aplikací, které se zabývají zabezpečením, DevOps, dodržováním předpisů a správou zásob (abychom jmenovali alespoň některé), závisí na základních funkcích poskytovaných Osquery v jejich srdci.
Instalovat Osquery
Osquery je k dispozici pro Linux, macOS, Windows a FreeBSD. Nainstalujte nejnovější verzi pro váš operační systém podle pokynů k instalaci. (V těchto příkladech použiji verzi 4.7.0.)
Po instalaci ověřte, že funguje:
$ rpm -qa | grep osquery
osquery-4.7.0-1.linux.x86_64
$
$ osqueryi --version
osqueryi version 4.7.0
$
Komponenty Osquery
Osquery má dvě hlavní součásti:
- osqueri je interaktivní konzola dotazů SQL. Jedná se o samostatný nástroj, který nepotřebuje oprávnění superuživatele (pokud se neptáte na tabulky, které tuto úroveň přístupu vyžadují).
- osqueryd je jako monitorovací démon pro hostitele, na kterém je nainstalován. Tento démon může naplánovat provádění dotazů v pravidelných intervalech, aby shromáždil informace z infrastruktury.
Obslužný program osqueri můžete spustit, aniž byste měli spuštěný démon osqueryd. Další nástroj, osqueryctl , řídí spouštění, zastavování a kontrolu stavu démona.
$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin
/usr/bin/osqueryctl
/usr/bin/osqueryd
/usr/bin/osqueryi
$
Použití interaktivní výzvy osqueryi
S Osquery komunikujete podobně, jako byste používali databázi SQL. Ve skutečnosti je osqueryi upravenou verzí shellu SQLite. Spuštění osqueryi
příkaz vás přenese do interaktivního prostředí, kde můžete spouštět příkazy specifické pro Osquery, které často začínají .
:
$ osqueryi
Using a virtual database. Need help, type '.help'
osquery>
Pro ukončení interaktivního shellu spusťte .quit
příkaz pro návrat do shellu operačního systému:
osquery>
osquery> .quit
$
Zjistěte, jaké stoly jsou k dispozici
Jak již bylo zmíněno, Osquery zpřístupňuje data jako výstup SQL dotazů. Informace v databázích se často ukládají do tabulek. Ale jak se můžete dotazovat na tyto tabulky, když neznáte jejich názvy? Můžete spustit .tables
příkaz k zobrazení seznamu všech tabulek, které můžete dotazovat. Pokud jste dlouholetým uživatelem Linuxu nebo správcem systému, názvy tabulek vám budou známé, protože tyto informace získáváte pomocí příkazů operačního systému:
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>
Zkontrolujte schéma pro jednotlivé tabulky
Nyní, když znáte názvy tabulek, můžete vidět, jaké informace každá tabulka poskytuje. Jako příklad vyberte processes
, protože ps
k získání těchto informací se poměrně často používá. Spusťte .schema
příkaz následovaný názvem tabulky, abyste viděli, jaké informace jsou v této tabulce uloženy. Pokud chcete zkontrolovat výsledky, můžete rychle spustit ps -ef
nebo ps aux
a porovnejte výstup s obsahem tabulky:
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>
Chcete-li se vrátit domů, použijte následující příkaz k zobrazení schématu pro balíčky RPM a porovnejte informace s rpm -qa
a rpm -qi
příkazy operačního systému:
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>
Více se dozvíte v dokumentaci tabulek Osquery.
Použijte příkaz PRAGMA
V případě, že jsou pro vás informace o schématu příliš záhadné, existuje další způsob, jak vytisknout informace v tabulce ve podrobném tabulkovém formátu:PRAGMA
příkaz. Například použiji PRAGMA
zobrazíte informace pro rpm_packages
tabulka v pěkném formátu:
osquery> PRAGMA table_info(rpm_packages);
Jednou z výhod těchto tabulkových informací je, že se můžete zaměřit na pole, na které se chcete dotazovat, a zobrazit typ informací, které poskytuje:
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>
Spusťte svůj první dotaz
Nyní, když máte všechny požadované informace z tabulky, schématu a položek, které chcete dotazovat, spusťte svůj první dotaz SQL a zobrazte informace. Dotaz níže vrátí uživatele, kteří jsou přítomni v systému, a každého z nich ID uživatele, ID skupiny, domovský adresář a výchozí shell. Uživatelé Linuxu mohou tyto informace získat zobrazením obsahu /etc/passwd
soubor a dělá nějaký grep
, sed
a 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>
Spouštět dotazy bez vstupu do interaktivního režimu
Co když chcete spustit dotaz bez vstupu do interaktivního režimu osqueri? To by mohlo být velmi užitečné, pokud kolem toho píšete skripty shellu. V tomto případě můžete echo
SQL dotaz a přenést jej do osqueri přímo z prostředí Bash:
$ 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 | |
+-----+-----+----------------+----------------+------+
$
Zjistěte, jaké služby se spouštějí při spouštění
Osquery může také vrátit všechny služby nastavené tak, aby se spouštěly při startu. Například pro dotaz na startup_items
a získejte název, stav a cestu prvních pěti služeb, které se spouštějí při spuštění:
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>
Vyhledat informace ELF pro binární kód
Představte si, že chcete zjistit více podrobností o ls
binární. Obvykle byste to udělali pomocí readelf -h
za ním následuje ls
cesta příkazu. Můžete se zeptat na elf_info
tabulky s Osquery a získejte stejné informace:
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>
Nyní máte možnost ochutnat, jak používat osqueri k hledání informací, které vás zajímají. Tyto informace jsou však uloženy na obrovském množství tabulek; jeden systém, na který jsem se dotazoval, měl 156 různých tabulek, což může být ohromující:
$ echo ".tables" | osqueryi | wc -l
156
$
Abyste si to usnadnili, můžete začít s těmito tabulkami, abyste získali informace o svém systému Linux:
Tabulka informací o systému
osquery> select * from system_info;
Informace o limitu systému
osquery> select * from ulimit_info;
Soubory otevřené různými procesy
osquery> select * from process_open_files;
Otevření portů v systému
osquery> select * from listening_ports;
Informace o spuštěných procesech
osquery> select * from processes;
Informace o nainstalovaných balíčcích
osquery> select * from rpm_packages;
Přihlašovací údaje uživatele
osquery> select * from last;
Informace protokolu systému
osquery> select * from syslog_events;
Další informace
Osquery je výkonný nástroj, který poskytuje spoustu informací o hostiteli, které lze použít k řešení různých případů použití. Více o Osquery se můžete dozvědět v jeho dokumentaci.