sql >> Databáze >  >> RDS >> PostgreSQL

Auditování PostgreSQL pomocí pgAudit

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 Tweet

Jak 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>

Zajímá vás plně spravované řešení PostgreSQL?

Chcete-li se dozvědět více o tom, jak vám poskytovatel DBaaS, jako je ScaleGrid, může pomoci spravovat vaše databáze PostgreSQL, podívejte se na naši stránku PostgreSQL. Podívejte se, jak vám ScaleGrid umožní soustředit se více na vývoj vašeho produktu a méně na správu databází.

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.


  1. Flexibilní a ovladatelné návrhy kusovníků (BOM).

  2. Jak vytisknete výsledek dotazu PostgreSQL ve formátu CSV nebo TSV z příkazového řádku?

  3. Jak přežít audit Oracle

  4. Práce s daty ODBC v DbVisualizer