OSQUERY je open source nástroj vyvinutý společností Facebook pro dotazování na různé informace související se stavem vašich strojů, jako jsou běžící procesy, načtené moduly jádra, aktivní přihlášení uživatelé, aktivní naslouchací porty atd. Tento systém instrumentace umožňuje analytické a monitorování je efektivní a intuitivní. OSQUERY odhaluje operační systém jako vysoce výkonnou virtuální relační databázi, která vám umožňuje psát dotazy SQL pro prozkoumání dat operačního systému a dotazování koncových bodů (Windows, OS X, Linux a FreeBSD) za účelem identifikace, zkoumání a odstraňování různých typů hrozeb. . OSQUERY se liší od tradičního HIDS/IPS. Zde musíte zjistit, jaká data jsou v tabulce pro dotazovací a návrhové dotazy na základě těchto dat. Má také vestavěnou funkci pro sledování integrity souborů, audit síťových připojení a procesů a dokonce i protokolování změn hardwarových zařízení v reálném čase. V tomto článku nainstalujeme OSQUERY v ubuntu 16 a zkontrolujeme jeho použití prostřednictvím osqueryi a osqueryd.
1. Nainstalujte OSQUERY
Přidejte informace o úložišti OSQUERY do databáze apt a aktualizujte systém.
# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B
Chcete-li použít add-apt-repository, musíte nainstalovat vlastnosti softwaru python.
# sudo apt-get install software-properties-common python-software-properties
Přidejte data úložiště do apt-database
# sudo add-apt-repository "deb [arch=amd64] https://osquery-packages.s3.amazonaws.com/xenial xenial main"
Aktualizujte systém a nainstalujte OSQUERY
# sudo apt-get update
# sudo apt-get install osquery
OSQUERY můžete spustit buď prostřednictvím interaktivního shellu, nebo jako režim démona. Nejprve prozkoumáme, jak jej používat prostřednictvím rozhraní OSQUERY shell a poté zkontrolujeme režim démona. Chcete-li získat osquery shell, zadejte osqueryi do terminálu pro dotazování na tabulky osquery, které jsou k dispozici po vybalení.
# osqueryi
osquery>
Chcete-li zobrazit seznam všech přihlášených uživatelů v systému, spusťte následující dotaz.
osquery> select * from logged_in_users ;
Najděte všechny tabulky dostupné pro dotaz.
osquery> .tables
Chcete-li popsat schéma tabulky, proveďte následující příkaz.
osquery> .schema table-name
Opusťte shell
osquery> .exit
OSQUERY můžete také spustit předáním příznaků příkazového řádku. např.
# osqueryi --disable_events=false --worker_threads=2 --logger_plugin=filesystem --pidfile=/var/osquery/osquery.pidfile
Chcete-li zjistit další příznaky příkazového řádku dostupné pro interaktivní shell OSQUERY, spusťte z terminálu následující příkaz.
# osqueryi --help
Více dotazů prozkoumáme v samostatné sekci, ale nyní nakonfigurujeme OSQUERY.
2. Nakonfigurujte OSQUERY
Je jednodušší spustit OSQUERY s konfiguračním souborem. Namísto předávání mnoha parametrů příkazového řádku pro spuštění interaktivního shellu osquery lze tyto parametry zapsat do konfiguračního souboru osquery. Interaktivní shell OSQUERY (osqueryi) načte tyto parametry při spuštění osqueryi. OSQUERY se nedodává s konfiguračním souborem. Spíše existuje vzorový konfigurační soubor ( /usr/share/osquery/osquery.example.conf ), který můžete zkopírovat. Hledá konfigurační soubor v /etc/osquery/osquery.conf . Pokud konfigurační soubor není přítomen, osqueryi se spustí s výchozími možnostmi. Také konfigurační soubor je dostupný pro démona OSQUERY.
Konfigurační soubor OSQUERY obsahuje následující tři části.
→ Seznam možností a nastavení, které čte osqueryi i osquery démon ( osqueryd )
→ Plán dotazů:sada SQL dotazů a intervalů.
→ Seznam balíčků, které obsahují konkrétnější/cílené dotazy. např. File Change Monitoring Pack:kategorie a cesty monitorovaných souborů a adresářů
2.1 Možnosti a nastavení
Kompletní seznam možností a nastavení naleznete na této wiki. Možnosti a nastavení, které budou použity pro tento článek, jsou popsány níže.
config_plugin: Název konfiguračního pluginu. Typ načítání konfigurace, výchozí plugin souborového systému čte konfigurační JSON z disku.
logger_plugin: Název modulu Logger. Výchozí logger je filesystem. To zapíše různé typy protokolů jako JSON do konkrétních cest k souborům. Více logovacích zásuvných modulů lze používat současně a efektivně kopírovat logy do každého rozhraní. Při zadávání konfigurace oddělte názvy pluginů čárkou (--logger_plugin=filesystem,syslog).
cesta loggeru: Cesta k adresáři pro ERROR/WARN/INFO a protokolování výsledků.
disable_logging: Zakázat ERROR/WARNING/INFO (nazývané stavové protokoly) a protokolování výsledků dotazu.
schedule_splay_percent: Procento časů konfigurace zobrazení. Plán dotazů často obsahuje několik dotazů se stejným intervalem. Často není záměrem autora plánu spouštět tyto dotazy společně v tomto intervalu. Ale spíše by měl každý dotaz běžet přibližně v intervalu. Po načtení konfigurace se na každý dotaz použije výchozí rozložení plánu 10 %.
pidfile: Cesta k mutexu daemon pidfile. Soubor se používá k zabránění spuštění několika osqueryd procesů.
events_expiry: Časový limit do vypršení eventuelního publikování výsledků odběru ze záložního úložiště. Toto vypršení platnosti se použije pouze při dotazu na výsledky. Například, pokud --events_expiry=1, události budou prakticky existovat pouze pro jeden výběr od odběratele. Pokud nedojde k žádnému výběru, budou události uloženy v záložním úložišti na dobu neurčitou.
cesta_databáze: Pokud používáte úložiště zálohování na disku, zadejte cestu. osquery si ve výchozím nastavení zachová stav pomocí "záložního obchodu" pomocí RocksDB. Tento stav uchovává informace o události tak, že na ně může být dotazován později podle plánu. Obsahuje výsledky nejnovějšího dotazu pro každý dotaz v rámci plánu. Tento poslední dotazovaný výsledek umožňuje protokolování rozdílu dotazů.
podrobné: Povolit podrobné informační zprávy.
worker_threads: Počet vláken pro odeslání práce použitých ke zpracování dotazů.
enable_monitor: Používá se k povolení nebo zakázání sledování plánu.
disable_events: Zakázat rozhraní API pro publikování událostí operačního systému osquery. To implicitně zakáže několik tabulek, které hlásí na základě zaznamenaných událostí.
disable_audit: Používá se k zakázání příjmu událostí z auditního subsystému operačního systému.
audit_allow_config: Umožněte vydavateli auditu změnit konfiguraci auditu
host_identifier: Pole používané k identifikaci hostitele, na kterém běží osquery:název hostitele, uuid, efemérní, instance.
enable_syslog: Zapněte vydavatele události příjmu syslog. Toto je „explicitní“ povolení, protože vyžaduje externí konfiguraci rsyslog nebo syslog-ng.
audit_allow_sockets: To umožňuje vydavateli auditu instalovat pravidla související se soketem.
schedule_default_interval: Volitelně nastavte výchozí hodnotu intervalu. To se používá, pokud naplánujete dotaz, který nedefinuje interval.
# sudo vi /etc/osquery/osquery.conf
"options": {
"config_plugin": "filesystem",
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"disable_logging": "false",
"log_result_events": "true",
"schedule_splay_percent": "10",
"pidfile": "/var/osquery/osquery.pidfile",
"events_expiry": "3600",
"database_path": "/var/osquery/osquery.db",
"verbose": "false",
"worker_threads": "2",
"enable_monitor": "true",
"disable_events": "false",
"disable_audit": "false",
"audit_allow_config": "true",
"host_identifier": "hostname",
"enable_syslog": "true",
"audit_allow_sockets": "true",
"schedule_default_interval": "3600"
},
...........
...........
...........
2.2 Plán dotazů
Část plán obsahuje dotazy identifikované jedinečným klíčem, za kterým následuje interval udává frekvenci dotazů v sekundách. Konfigurace pro sekci plánu, kterou použijeme, vypadá níže-
...........
...........
{
"schedule": {
"crontab": {
"query": "SELECT * FROM crontab;",
"interval": 300
},
"largest_process": {
"query": "select pid, name, uid, resident_size from processes order by resident_size desc limit 10;",
"interval": 60
},
}
...........
...........
První dotaz se podívá do tabulky crontab každých 300 sekund a druhý dotaz prohlédne načtená rozšíření jádra každých 10 sekund. Výsledky dotazu se ukládají do mezipaměti na disku pomocí RocksDB. Při prvním spuštění dotazu jsou všechny výsledky uloženy v RocksDB. Při následných spuštěních se do RocksDB zaprotokolují pouze rozdíly v sadě výsledků (změny).
Další speciální dotazy nazývané dekorátoři se používají k přidání dat před další naplánované dotazy. Následující dekorátoři připojí ke každému naplánovanému dotazu UUID hostitele, na kterém běží osquery, a uživatelské jméno uživatele.
..........
..........
"decorators": {
"load": [
"SELECT uuid AS host_uuid FROM system_info;",
"SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;"
]
},
..........
..........
2.3 Query Pack
Konfigurace podporuje sady, nazývané balíčky, dotazů, které pomáhají definovat váš plán. Balíčky jsou distribuovány s osquery a označeny na základě širokých kategorií informací a viditelnosti. Například balíček „compliance“ bude obsahovat dotazy, které kontrolují změny v uzamčených funkcích operačního systému a uživatelských nastaveních. Balíček "správa zranitelnosti" může provádět obecné dotazy správy aktiv, které vytvářejí protokoly událostí kolem změn balíčků a instalací softwaru. Výchozí sada balíčků umístěná ve složce /usr/share/osquery/packs. Přidejte tyto balíčky do konfiguračního souboru.
..........
..........
"packs": {
"osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf",
"incident-response": "/usr/share/osquery/packs/incident-response.conf",
"it-compliance": "/usr/share/osquery/packs/it-compliance.conf",
"vuln-management": "/usr/share/osquery/packs/vuln-management.conf"
}
2.4 Vytvořit vlastní balíček pro monitorování integrity souborů
Balíčky, které jsme přidali v předchozí části, se dodávají po vybalení. Nyní chceme přidat vlastní balíček, jehož úkolem je monitorovat integritu souborů pro složky nakonfigurované pomocí file_paths. Vytvořte soubor s názvem fims.conf v /usr/share/osquery/packs/ a přidejte následující sekci.
# vi /usr/share/osquery/packs/fims.conf
{
"queries": {
"file_events": {
"query": "select * from file_events;",
"removed": false,
"interval": 300
}
},
"file_paths": {
"homes": [
"/root/.ssh/%%",
"/home/%/.ssh/%%"
],
"etc": [
"/etc/%%"
],
"home": [
"/home/%%"
],
"tmp": [
"/tmp/%%"
]
}
}
Dotaz file_events je naplánován tak, aby v pětiminutových intervalech shromáždil všechny události FIM, které se vyskytly u jakýchkoli souborů v rámci cest určených parametrem file_paths. Na vysoké úrovni to znamená, že události jsou ukládány do vyrovnávací paměti v osquery a odesílány do nakonfigurovaného loggeru každých pět minut.
Upravte sekci balíčků v osquery.conf tak, aby zahrnovala výše uvedený soubor.
# sudo vi /etc/osquery/osquery.conf
.................
"packs": {
"fim": "/usr/share/osquery/packs/fims.conf",
"osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf",
"incident-response": "/usr/share/osquery/packs/incident-response.conf",
"it-compliance": "/usr/share/osquery/packs/it-compliance.conf",
"vuln-management": "/usr/share/osquery/packs/vuln-management.conf"
}
Konečný konfigurační soubor OSQUERY vypadá takto-
{
"options": {
"config_plugin": "filesystem",
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"disable_logging": "false",
"log_result_events": "true",
"schedule_splay_percent": "10",
"pidfile": "/var/osquery/osquery.pidfile",
"events_expiry": "3600",
"database_path": "/var/osquery/osquery.db",
"verbose": "true",
"worker_threads": "2",
"enable_monitor": "true",
"disable_events": "false",
"disable_audit": "false",
"audit_allow_config": "true",
"host_identifier": "hostname",
"enable_syslog": "true",
"syslog_pipe_path": "/var/osquery/syslog_pipe",
"audit_allow_sockets": "true",
"schedule_default_interval": "3600"
},
"schedule": {
"crontab": {
"query": "SELECT * FROM crontab;",
"interval": 300
},
"largest_process": {
"query": "select pid, name, uid, resident_size from processes order by resident_size desc limit 10;",
"interval": 60
}
},
"decorators": {
"load": [
"SELECT uuid AS host_uuid FROM system_info;",
"SELECT user AS username FROM logged_in_users ORDER BY time DESC LIMIT 1;"
]
},
"packs": {
"fim": "/usr/share/osquery/packs/fims.conf",
"osquery-monitoring": "/usr/share/osquery/packs/osquery-monitoring.conf",
"incident-response": "/usr/share/osquery/packs/incident-response.conf",
"it-compliance": "/usr/share/osquery/packs/it-compliance.conf",
"vuln-management": "/usr/share/osquery/packs/vuln-management.conf",
"hardware-monitoring": "/usr/share/osquery/packs/hardware-monitoring.conf"
}
}
Zkontrolujte platnost konfiguračního souboru.
# sudo osqueryctl config-check
Spusťte interaktivní shell OSQUERY v podrobném režimu.
# osqueryi --verbose
3. Nakonfigurujte OSQUERY tak, aby využíval protokoly syslog-ng
V tomto kroku nakonfigurujeme OSQUERY tak, aby využíval syslogs. Ubuntu má výchozí aplikaci rsyslog, která generuje syslogs, ale v tomto článku zjistíme, jak nakonfigurovat syslog-ng tak, aby protokoly, které generuje, byly spotřebovány OSQUERY. Tabulka syslog dotazů OSQUERY přeposílá protokoly přes pojmenovaný kanál ze správně nakonfigurovaného démona syslog-ng. Jak je syslog přijímán do osquery, je zapsán do záložního úložiště (RocksDB) a zpřístupněn pro dotazování. Konfigurace syslog-ng proto vytvoří pojmenovaný kanál, jehož prostřednictvím bude OSQUERY používat protokoly.
Nainstalujte syslog-ng
# sudo apt-get install syslog-ng
Změňte skupinu souborů vytvořenou syslog-ng na syslog. Upravte hlavní konfigurační soubor syslog-ng a změňte skupinu na adm.
# vi /etc/syslog-ng/syslog-ng.conf
.........................
.........................
options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("adm"); perm(0640); stats_freq(0); bad_hostname("^gconfd$"); threaded(yes); }; ......................... .........................
Dále vytvořte konfiguraci syslog-ng pro OSQUERY. Následující část ukazuje, jak nakonfigurovat syslog-ng pro systémové protokoly a přepíše tyto protokoly do formátu CSV. Poté se použije šablona k formátování zprávy/protokolu tak, aby pole protokolu splývala s tabulkou syslog OSQUERY. Nakonec jsou protokoly přesunuty do pojmenované roury, aby je OSQUERY spotřeboval. Oprávnění pro kanál musí alespoň umožňovat syslog-ng číst/zapisovat a osquery číst.
# vi /etc/syslog-ng/conf.d/osquery.conf
source s_osquery {
system();
};
rewrite r_csv_message {
set("$MESSAGE", value("CSVMESSAGE") );
subst("\"","\\\"", value("CSVMESSAGE"), flags(global) );
};
template t_csv {
template("\"${ISODATE}\", \"${HOST}\", \"${LEVEL_NUM}\", \"${FACILITY}\", \"${PROGRAM}\", \"${MESSAGE}\"\n");
template_escape(no);
};
destination d_osquery {
pipe("/var/osquery/syslog_pipe" template(t_csv));
};
log {
source(s_osquery);
rewrite(r_csv_message);
destination(d_osquery);
};
Konfigurační soubor osquery ( /etc/osquery/osquery.conf ), který jsme vytvořili dříve, potřebuje malou úpravu pro syslog-ng. Změňte logger_plugin na syslog ze souborového systému nebo ponechte obojí.
"logger_plugin": "syslog" or "logger_plugin": "filesystem,syslog"
Následující možnosti jsou také potřebné pro příjem syslog.
.................
.................
"enable_syslog": "true",
"syslog_pipe_path": "/var/osquery/syslog_pipe",
"disable_events": "false",
.................
.................
Potřebujeme tedy upravit pouze možnosti logger_plugin v souboru /etc/osquery/osquery.conf, který jsme vytvořili dříve, a zbývající tři možnosti jsou již v konfiguračním souboru.
Nyní restartujte syslog-ng a zkontrolujte, zda byl kanál vytvořen se správnými oprávněními.
# sudo systemctl start syslog-ng
# ls -l /var/osquery/syslog_pipe
prw-r----- 1 root adm 0 Apr 27 14:29 /var/osquery/syslog_pipe
Zkontrolujte polena protékající potrubím
# cat /var/osquery/syslog_pipe
"2017-04-27T14:42:33+00:00", "ubuntu", "6", "auth", "sshd", "Accepted password for root from 117.227.81.214 port 61849 ssh2"
"2017-04-27T14:42:33+00:00", "ubuntu", "6", "authpriv", "sshd", "pam_unix(sshd:session): session opened for user root by (uid=0)"
"2017-04-27T14:42:41+00:00", "ubuntu", "5", "local3", "osqueryi", "severity=0 location=options.cpp:61 message=Verbose logging enabled by config option"
...................................
...................................
Spusťte interaktivní shell OSQUERY.
# osqueryi
I0427 14:32:07.981422 3730 options.cpp:61] Verbose logging enabled by config option
I0427 14:32:08.085734 3730 syslog.cpp:97] Successfully opened pipe for syslog ingestion: /var/osquery/syslog_pipe
I0427 14:32:08.101172 3730 file_events.cpp:68] Added file event listener to: /etc/**
....................
I0427 14:32:08.101784 3730 audit.cpp:226] Adding audit rule: syscall=59 action=2 filter=''
....................
I0427 14:32:08.278990 3737 events.cpp:749] Starting event publisher run loop: syslog
I0427 14:32:08.279242 3736 events.cpp:749] Starting event publisher run loop: inotify
I0427 14:32:08.279353 3735 events.cpp:749] Starting event publisher run loop: audit
osquery>
Nyní se dotazujte na tabulku syslog.
osqueryi> select * from syslog;
Výše uvedený dotaz zobrazí syslogy spotřebované osquery prostřednictvím pojmenovaného kanálu /var/osquery/syslog_pipe
4. Detekce hrozeb a DFIR prostřednictvím OSQUERYi
V této části prozkoumáme několik základních bezpečnostních kontrol prostřednictvím interaktivního shellu osquery.
a) Spusťte následující dotaz a zjistěte, kdo jsou nyní přihlášení uživatelé v systému.
osquery> select * from logged_in_users ;
b) Najděte všechna předchozí přihlášení
osquery> select * from last ;
c) Chcete-li najít pravidla brány firewall, spusťte následující dotaz. Pokud následující dotaz nevygeneruje žádný výstup, znamená to, že firewall není nakonfigurován.
osquery> select * from iptables ;
d) Chcete-li najít všechny úlohy naplánované pomocí crontab, spusťte následující dotaz. Pomocí tohoto dotazu můžete zjistit, zda existuje nějaký malware, jehož spuštění bylo naplánováno v určitém intervalu.
osquery> select command, path from crontab ;
e) Najděte soubory, které podporují setuid. Ve výchozím nastavení je v Ubuntu 16 povoleno setuid jen několik souborů, ale kromě těchto, jaké jsou další soubory, které mají povoleno setuid. To pomůže odhalit binární soubory backdoor.
osquery> select * from suid_bin ;
f) Najděte seznam načtených modulů jádra.
osquery> select name, used_by, status from kernel_modules where status="Live" ;
g) Najděte všechny naslouchací porty a zkontrolujte, zda do systému nejsou nějaká zadní vrátka. Pokud existuje nějaký otevřený port, který jste nenakonfigurovali, možná budete muset prozkoumat proces, který tento port otevřel.
osquery> select * from listening_ports ;
h) Spuštěním následujícího dotazu vyhledejte aktivitu souboru na serveru spolu s uživatelem, který je za ni zodpovědný.
osquery> select * from file_events ;
i) Najděte 10 největších procesů podle velikosti rezidentní paměti.
osquery> select pid, name, uid, resident_size from processes order by resident_size desc limit 10;
j) Najděte všechny běžící procesy.
osquery> select * from processes;
k) Najděte počet procesů, pojmenujte 10 nejaktivnějších procesů.
osquery> select count(pid) as total, name from processes group by name order by total desc limit 10;
l) Malware bude obecně naslouchat portům a předá zpětný shell útočníkovi. Spusťte následující dotaz a najděte rozdíly s jakýmkoli předchozím známým bezpečným stavem vašeho systému.
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;
m) Útočník často smaže škodlivý binární soubor po jeho spuštění v systému. Pro nalezení takových procesů spusťte následující dotaz.
osquery> SELECT name, path, pid FROM processes WHERE on_disk = 0;
n) Spusťte následující dotaz, abyste zjistili, zda je útočníkovi předán nějaký bash reverzní shell.
osquery> SELECT * FROM processes WHERE cmdline LIKE '/bin/bash -i >& /dev/tcp/%';
5. OSQUERY v režimu démon
Jak jsme viděli, OSQUERY vrátí výsledky stavu operačního systému v reálném čase, na které se lze v pozdější fázi dotazovat. Není však možné neustále spouštět dotaz pro detekci hrozeb. Kromě toho OSQUERY také neobsahuje žádný výstražný mechanismus. Řešením je spustit OSQUERY jako démona, který bude v pravidelných intervalech spouštět naplánované dotazy a balíčky zahrnuté v konfiguračním souboru a zapsat výsledky do souboru. Vytvořte si vlastní balíčky v /usr/share/osquery/packs a zahrňte balíčky pro monitorování do konfiguračního souboru OSQUERY. Výsledky naplánovaných dotazů a balíčků jsou zapsány do souboru /var/log/osquery/osqueryd.results.log Tento soubor protokolu bude vytvořen pouze tehdy, když se OSQUERY spustí jako režim démona a OSQUERYD začne odesílat výsledky. Démon OSQUERY bude číst stejný konfigurační soubor /etc/osquery/osquery.conf. Nezapomeňte vrátit hodnotu logger_plugin na souborový systém v /etc/osquery/osquery.conf, pokud jste ji dříve změnili na 'syslog'.
Chcete-li spustit démona, použijte některý z následujících příkazů.
# sudo systemctl start osqueryd
OR
# sudo osqueryctl start
Výsledky by měly být dostupné během krátké doby, jakmile OSQUERYD spustí naplánované dotazy a balíčky. Pomocí příkazu tail ověřte, zda jsou výsledky zapsány do souboru /var/log/osquery/osqueryd.results.log
# tail -f /var/log/osquery/osqueryd.results.log
Nyní můžete přeposlat protokoly výsledků jakékoli externí aplikaci, jako je zásobník ELK, pro analýzu protokolů a generování výstrah.
Závěr
OSQUERY je úžasný nástroj, který zpřístupňuje data OS virtuální relační databázi a umožňuje vám dotazovat se na systémová data pomocí SQL. osqueryi je užitečné pro spouštění jednorázových dotazů k nalezení jakýchkoliv zadních vrátek, malwaru, zombie procesu nebo zjištění přihlášených uživatelů atd., zatímco osqueryd lze použít pro spouštění plánovaných dotazů a vlastních balíčků pro ukládání výsledků pro dlouhodobé ukládání a generování výstrah pomocí libovolného externí aplikace.