Audit v informačních technologiích (IT) je proces zkoumání IT infrastruktury organizace, aby byla zajištěna shoda s požadavky stanovenými uznávanými standardy nebo zavedenými zásadami. Pravidla ochrany dat, jako jsou nová nařízení GDPR, se stávají stále přísnějšími pro ochranu uživatelských dat, takže je důležité, aby byly vaše databázové audity správně nastaveny, aby byla zajištěna bezpečnost vaší aplikace i uživatelských dat před zranitelností. V tomto příspěvku na blogu probereme pgAudit – nástroj, který generuje protokoly auditu potřebné k usnadnění auditování PostgreSQL.
Co je pgAudit?
Rozšíření PostgreSQL Audit Extension, pgAudit, je rozšíření s otevřeným zdrojovým kódem, které zaznamenává události v databázi PostgreSQL do podrobného protokolu auditu. Používá nativní protokolovací zařízení PostgreSQL, takže protokoly auditu budou součástí protokolů PostgreSQL. Rozšíření je založeno na projektu 2ndQuadrant pgAudit, jehož autory jsou Simon Riggs, Abhijit Menon-Sen a Ian Barwick, a zahrnuje vylepšení od Davida Steela z Crunchy Data.
Proč pgAudit před log_statement=all?
Všechny příkazy můžeme protokolovat v PostgreSQL pouze nastavením log_statement=all
. Proč tedy pgAudit vůbec používat? Základní protokolování příkazů (pomocí log_statement
) zobrazí pouze operace provedené proti databázi. Neposkytne možnost filtrovat operace a protokoly nebudou ve správném formátu požadovaném pro audit. pgAudit navíc poskytuje granularitu pro protokolování specifických tříd příkazů jako READ
(SELECT
a COPY
), WRITE
(INSERT
, UPDATE
, DELETE
, atd.), DDL
atd. Dále poskytuje auditování na úrovni objektů, kde budou protokolovány pouze operace se specifickými vztahy.
Další výhodou pgAudit oproti základnímu protokolování příkazů je to, že poskytuje podrobnosti o provedené operaci namísto pouhého protokolování požadované operace. Zvažte například provedení bloku anonymního kódu pomocí příkazu DO.
DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;
Základní protokolování příkazů bude mít za následek:
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: statement: DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;
pgAudit zaznamená stejnou operaci jako:
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: AUDIT: SESSION,4,1,FUNCTION,DO,,,"DO $$ BEGIN EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)'; END $$;",<not logged> 2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG: AUDIT: SESSION,4,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT),<not logged>
Výše uvedené jasně ukazuje funkci pgAudit, která zaznamenává operaci a její vnitřnosti se strukturovaným výstupem, který usnadňuje vyhledávání.
Jak auditovat PostgreSQL pomocí pgAuditClick To TweetJak nainstalovat pgAudit?
pgAudit je rozšíření, které je k dispozici ke stažení z úložiště PostgreSQL nebo jej lze zkompilovat a sestavit ze zdroje. Jako první krok je třeba stáhnout a nainstalovat balíček do počítače se systémem PostgreSQL (tento balíček rozšíření je předinstalován ve všech nasazeních ScaleGrid PostgreSQL).
Po instalaci je třeba jej načíst do PostgreSQL. Toho je dosaženo přidáním pgaudit
do shared_preload_libraries
konfigurační parametr. Aby byla tato změna konfigurace účinná, je vyžadován restart PostgreSQL. Dalším krokem je povolení rozšíření v databázi spuštěním CREATE EXTENSION pgaudit
.
Nyní, když je rozšíření připraveno, se musíme ujistit, že jsme pro rozšíření nastavili konfigurační parametry, aby se spustilo protokolování. To může být stejně jednoduché jako nastavení parametru pgaudit.log
na hodnotu all
a pgAudit se začne přihlašovat do session
režimu.
Nyní, když víme, jak nainstalovat a aktivovat pgAudit, pojďme si probrat dva režimy protokolování auditu, které nabízí, session a object.
Protokolování auditu relace
V režimu relace zaznamená pgAudit všechny operace provedené uživatelem. Nastavení pgaudit.log
parametr na kteroukoli z definovaných hodnot, kromě NONE
, povolí protokolování auditu relace. Soubor pgaudit.log
parametr určuje třídy příkazů, které budou protokolovány v režimu relace. Možné hodnoty jsou:READ
, WRITE
, FUNCTION
, ROLE
, DDL
, MISC
, MISC_SET
, ALL
a NONE
.
Nastavení pgaudit.log
parametr na ALL
zaznamená všechny výpisy. Parametr může přijímat více tříd pomocí seznamu odděleného čárkami a konkrétní třídy lze vyloučit znaménkem –. Například pokud chcete protokolovat všechny příkazy kromě MISC
class, hodnota pgaudit.log
bude ALL, -MISC, -MISC_SET
. Můžete také povolit pgAudit, aby vytvořil samostatnou položku protokolu pro každý odkaz na vztah v příkazu nastavením pgaudit.log_relation
na.
Podívejte se na příklad vytvoření tabulky. Příkaz SQL by byl:
CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));
Odpovídající záznamy protokolu auditu jsou:
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE TABLE,TABLE,public.persons,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,CREATE INDEX,INDEX,public.persons_pkey,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged> 2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG: AUDIT: SESSION,5,1,DDL,ALTER SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
Protokolování auditu objektů
V určitých případech může být vyžadováno auditování pouze určité sady vztahů. V takových případech bude mít použití režimu relace za následek pouze zbytečně velký počet protokolů auditu, které neodpovídají požadovaným vztahům. Objektový režim je pro tento účel zvláště vhodný a může auditovat pouze určitou sadu vztahů.
Protokolování auditu objektů se provádí pomocí rolí PostgreSQL. Roli lze vytvořit a přiřadit jí oprávnění pro přístup pouze k určité sadě vztahů. Tato role by měla být specifikována v konfiguračním parametru pgaudit.role
. Objektový režim podporuje pouze SELECT
, INSERT
, UPDATE
a DELETE
prohlášení. Třídy příkazů, které jsou protokolovány, závisí na oprávněních udělených roli. Pokud má například role oprávnění provádět pouze SELECT
, pak pouze SELECT
výpisy budou protokolovány.
Níže je uveden příklad protokolování auditu objektu:
Vytvořte roli a udělte pouze SELECT
oprávnění. Nastavte pgaudit.role
na tuto roli a spusťte SELECT
SQL příkaz:
CREATE ROLE audit_person; GRANT SELECT ON persons TO audit_person; SET pgaudit.role = 'audit_person'; SELECT * FROM persons WHERE ID=404;
Výše uvedený příkaz bude zaznamenán jako:
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG: AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>
|
Jak interpretovat záznam protokolu auditu?
Zatím jsme poskytli podrobnosti o tom, jak záznam protokolu auditu vypadá, nyní se podívejme na formát záznamu protokolu auditu. Každý záznam začíná prefixem log_line_prefix zmíněným pro protokolování PostgreSQL a poté bude zbytek výstupu ve formátu CSV. Zvažte následující jednoduchý záznam protokolu auditu:
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG: AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>
Ve výše uvedené položce je hodnota
2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]:
je z formátu log_line_prefix %t:%r:%u@%d:[%p]:
. Obsah auditního záznamu začíná od LOG: AUDIT:
a má formát CSV. Formát hodnoty je ve tvaru:
AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER
Pojďme se podívat na jednotlivá pole:
Pole | Popis | Hodnota z příkladu auditního záznamu |
---|---|---|
AUDIT_TYPE | Označuje režim auditu:SESSION nebo OBJECT | OBJEKT |
STATEMENT_ID | Jedinečný identifikátor příkazu pro každou relaci | 10 |
ID SUBSTATEMENT_ID | Identifikátor pro každý dílčí příkaz v hlavním příkazu | 1 |
TŘÍDA | Udává třídu příkazů jako READ, WRITE atd., které jsou definovanými hodnotami pro parametr pgaudit.log. | ČTĚTE |
PŘÍKAZ | Příkaz použitý v příkazu SQL | VYBRAT |
OBJECT_TYPE | Může být TABLE, INDEX, VIEW atd. | TABLE |
NÁZEV_OBJEKTU | Plně kvalifikovaný název objektu | public.persons |
PROHLÁŠENÍ | Skutečně provedený příkaz | vyberte * z osob, kde ID=404; |
PARAMETR | Když je parametr pgaudit.log_parameter nastaven na hodnotu true, je uveden uvozovaný soubor CSV parametrů, pokud je přítomen, nebo „none“, pokud nejsou žádné parametry. Když parametr pgaudit.log_parameter není nastaven, hodnota bude „ |
Odvození
pgAudit se všemi svými možnostmi zjednodušuje proces auditování generováním protokolu auditu. I když existuje několik výhrad, jako je protokolování přejmenovaných objektů pod stejným názvem, stále se jedná o robustní nástroj, který poskytuje požadovanou funkčnost. Informace o auditu zapsané v protokolech však nemusí být právě ideální pro proces auditu – proces auditu je ještě lepší, když lze tyto protokoly převést na schéma databáze a data auditu lze načíst do databáze, takže můžete snadno dotazovat informace. Zde je užitečný PostgreSQL Audit Log Analyzer (pgAudit Analyze). Další informace najdete na stránkách github pgAudit a pgAudit Analyze.