Audit je dobrý způsob, jak udržet svá data v co nejvyšší bezpečnosti a zjistit, co se děje ve vašich databázích. Je také vyžadován pro mnoho bezpečnostních předpisů nebo standardů, jako je PCI - Payment Card Industry. Toto není výjimka pro vaši PostgreSQL databázi.
PostgreSQL si získal silnou reputaci pro svou osvědčenou architekturu, spolehlivost, integritu dat, robustní sadu funkcí, rozšiřitelnost a odhodlání komunity open source za softwarem trvale poskytovat výkonná a inovativní řešení.
Jak už bylo řečeno, měla by být možnost auditovat databázi PostgreSQL, ne? No, odpověď je ano. V tomto blogu uvidíme, co je rozšíření pgAudit a jak jej nainstalovat a používat ve vaší databázi PostgreSQL.
Co je pgAudit?
Rozšíření PostgreSQL Audit Extension (pgAudit) poskytuje podrobné protokolování auditu relací a objektů prostřednictvím standardního protokolovacího zařízení PostgreSQL.
Základní protokolování příkazů lze zajistit standardním protokolovacím zařízením s log_statement =all. To je přijatelné pro monitorování a další základní použití, ale neposkytuje úroveň podrobností obecně požadovanou pro audit. Nestačí mít seznam všech operací provedených proti databázi. Musí být také možné najít konkrétní prohlášení, která jsou pro auditora zajímavá. Standardní funkce protokolování ukazuje, co uživatel požadoval, zatímco pgAudit se zaměřuje na podrobnosti o tom, co se stalo, když databáze uspokojovala požadavek.
Jak nainstalovat pgAudit na PostgreSQL
V tomto příkladu použijeme instalaci CentOS 7. V tuto chvíli jsme předpokládali, že máte nainstalovanou databázi PostgreSQL, v opačném případě můžete sledovat tento blogový příspěvek, abyste ji mohli snadno zprovoznit pomocí ClusterControl.
Nyní byste měli mít ve svém OS repozitář PostgreSQL, něco takového:
$ cat /etc/yum.repos.d/postgresql.repo
# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions
[pgdg-common]
name=PostgreSQL common for RHEL/CentOS $releasever - $basearch
baseurl=http://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
# PGDG Red Hat Enterprise Linux / CentOS stable repositories:
[pgdg]
name=PostgreSQL 12 $releasever - $basearch
#baseurl=http://yum.postgresql.org/12/redhat/rhel-$releasever-$basearch
baseurl=http://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch/
enabled=1
gpgcheck=0
[pgdg-source]
name=PostgreSQL 12 $releasever - $basearch - Source
baseurl=http://yum.postgresql.org/srpms/12/redhat/rhel-$releasever-$basearch
enabled=0
gpgcheck=0
Pokud zkontrolujete dostupné balíčky pgaudit, měli byste mít:
pgaudit14_12.x86_64 : PostgreSQL Audit Extension
Takže, pojďme to nainstalovat:
$ yum install pgaudit14_12
Nyní jej budete muset přidat do konfiguračního souboru postgresql.conf, který se ve výchozím nastavení nachází v /var/lib/pgsql/12/data/postgresql.conf, a restartovat službu PostgreSQL, aby bylo možné použít změna.
shared_preload_libraries = 'pgaudit, pg_stat_statements'
Po restartování databázové služby je třeba vytvořit rozšíření:
postgres=# CREATE EXTENSION pgaudit;
CREATE EXTENSION
And now, you can run the following query to check the new extension created:
postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';
name | default_version | installed_version | comment
---------+-----------------+-------------------+---------------------------------
pgaudit | 1.4.1 | 1.4.1 | provides auditing functionality
(1 row)
Konfigurace pgAudit
Aktuální konfiguraci můžete ověřit spuštěním následujícího dotazu:
postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit%';
name | setting
----------------------------+---------
pgaudit.log | none
pgaudit.log_catalog | on
pgaudit.log_client | off
pgaudit.log_level | log
pgaudit.log_parameter | off
pgaudit.log_relation | off
pgaudit.log_statement_once | off
pgaudit.role |
(8 rows)
Podívejme se na tyto parametry jeden po druhém.
- pgaudit.log :Určuje, které třídy příkazů budou protokolovány protokolováním auditu relace. Výchozí hodnota je žádná. Možné hodnoty jsou:
- ČTĚTE:VYBERTE A KOPÍRUJTE, pokud je zdrojem vztah nebo dotaz.
- WRITE:INSERT, UPDATE, DELETE, TRUNCATE a COPY, pokud je cílem relace.
- FUNKCE:Volání funkcí a bloky DO.
- ROLE:Prohlášení týkající se rolí a oprávnění:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL:Všechny DDL, které nejsou zahrnuty do třídy ROLE.
- MISC:Různé příkazy, např. ZRUŠIT, NAČÍST, KONTROLNÍ BOD, VAKUOVAT, NASTAVIT.
- MISC_SET:Různé příkazy SET, např. NASTAVIT ROLE.
- VŠECHNY:Zahrňte vše výše uvedené.
- pgaudit.log_catalog :Určuje, že protokolování relace by mělo být povoleno v případě, kdy jsou všechny vztahy v příkazu v pg_catalog. Zakázáním tohoto nastavení snížíte šum v protokolu z nástrojů jako psql a PgAdmin, které se intenzivně dotazují na katalog. Výchozí nastavení je zapnuto.
- pgaudit.log_client :Určuje, zda budou zprávy protokolu viditelné pro klientský proces, jako je psql. Toto nastavení by obecně mělo být deaktivováno, ale může být užitečné pro ladění nebo jiné účely. Výchozí nastavení je vypnuto.
- pgaudit.log_level :Určuje úroveň protokolu, která bude použita pro položky protokolu. Toto nastavení se používá pro regresní testování a může být také užitečné pro koncové uživatele pro testování nebo jiné účely. Výchozí hodnota je log.
- pgaudit.log_parameter :Určuje, že protokolování auditu by mělo zahrnovat parametry, které byly předány s příkazem. Jsou-li parametry přítomny, budou zahrnuty ve formátu CSV za text příkazu. Výchozí nastavení je vypnuto.
- pgaudit.log_relation :Určuje, zda má protokolování auditu relace vytvořit samostatnou položku protokolu pro každý vztah (TABLE, VIEW atd.), na který odkazuje příkaz SELECT nebo DML. Toto je užitečná zkratka pro vyčerpávající protokolování bez použití protokolování auditu objektů. Výchozí nastavení je vypnuto.
- pgaudit.log_statement_once :Určuje, zda protokolování bude zahrnovat text příkazu a parametry s prvním záznamem protokolu pro kombinaci příkazu/dílčího příkazu nebo s každým záznamem. Deaktivace tohoto nastavení povede k méně podrobnému protokolování, ale může ztížit určení příkazu, který vygeneroval záznam protokolu, ačkoli pár příkaz/dílčí příkaz spolu s id procesu by měl stačit k identifikaci textu příkazu zaznamenaného s předchozím záznamem. Výchozí nastavení je vypnuto.
- pgaudit.role :Určuje hlavní roli, která se má použít pro protokolování auditu objektů. Lze definovat více rolí auditu jejich přidělením hlavní roli. To umožňuje více skupinám mít na starosti různé aspekty protokolování auditu. Neexistuje žádné výchozí nastavení.
Použití pgAudit
Nyní jsme zkontrolovali konfigurační parametry a podívejme se na příklad, jak to použít v reálném světě.
Chcete-li auditovat všechna čtení, zápisy a dotazy DDL, spusťte:
test1=# set pgaudit.log = 'read,write,ddl';
SET
A pak spusťte následující věty:
test1=# CREATE TABLE table1 (id int, name text);
CREATE TABLE
test1=# INSERT INTO table1 (id, name) values (1, 'name1');
INSERT 0 1
test1=# INSERT INTO table1 (id, name) values (2, 'name2');
INSERT 0 1
test1=# INSERT INTO table1 (id, name) values (3, 'name3');
INSERT 0 1
test1=# SELECT * FROM table1;
id | name
----+-------
1 | name1
2 | name2
3 | name3
(3 rows)
Pokud zkontrolujete soubor protokolu PostgreSQL, uvidíte toto:
2020-11-20 19:17:13.848 UTC [25142] LOG: AUDIT: SESSION,3,1,DDL,CREATE TABLE,,,"CREATE TABLE table1 (id int, name text);",<not logged>
2020-11-20 19:18:45.334 UTC [25142] LOG: AUDIT: SESSION,4,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (1, 'name1');",<not logged>
2020-11-20 19:18:52.332 UTC [25142] LOG: AUDIT: SESSION,5,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (2, 'name2');",<not logged>
2020-11-20 19:18:58.103 UTC [25142] LOG: AUDIT: SESSION,6,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (3, 'name3');",<not logged>
2020-11-20 19:19:07.261 UTC [25142] LOG: AUDIT: SESSION,7,1,READ,SELECT,,,SELECT * FROM table1;,<not logged>
Toto je samozřejmě základní příklad. Konfigurační parametry popsané v předchozí části můžete použít, aby vyhovovaly vašemu podnikání.
Povolení pgAudit pomocí ClusterControl
Namísto ruční instalace a aktivace pgAudit je další možností použití ClusterControl CLI, aby to udělalo za vás. Za tímto účelem můžete ze serveru ClusterControl spustit následující příkaz:
$ s9s cluster --setup-audit-logging --cluster-id=ID
Kde ID je ID clusteru PostgreSQL.
Zatímco běží, můžete sledovat stav kontrolou úlohy ClusterControl. Nejprve budete potřebovat ID úlohy, které můžete získat ze seznamu úloh:
$ s9s job --list
163 18 RUNNING test_dba admins 19:41:45 90% Setup Audit Logging
Nyní zkontrolujte podrobnosti úlohy:
$ s9s job --log --job-id=163
Using SSH credentials from cluster.
Cluster ID is 18.
The username is 'root'.
10.10.10.129:5432: Configuring audit logging.
10.10.10.129:5432: Installing 'pgaudit14_12'.
10.10.10.129:5432: Setting pgaudit.log to ROLE,DDL,MISC.
Writing file '10.10.10.129:/var/lib/pgsql/12/data/postgresql.conf'.
10.10.10.129:5432: Restarting PostgreSQL node.
10.10.10.129: waiting for server to shut down.... done
server stopped
waiting for server to start....2020-11-20 19:41:52.069 UTC [25137] LOG: pgaudit extension initialized
2020-11-20 19:41:52.069 UTC [25137] LOG: starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
2020-11-20 19:41:52.069 UTC [25137] LOG: listening on IPv4 address "0.0.0.0", port 5432
2020-11-20 19:41:52.069 UTC [25137] LOG: listening on IPv6 address "::", port 5432
2020-11-20 19:41:52.080 UTC [25137] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-11-20 19:41:52.102 UTC [25137] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2020-11-20 19:41:52.130 UTC [25137] LOG: redirecting log output to logging collector process
2020-11-20 19:41:52.130 UTC [25137] HINT: Future log output will appear in directory "log".
done
server started
10.10.10.129:5432: Waiting for node to be accessible.
10.10.10.129:5432: pgaudit 1.4.1 is enabled.
Tato akce bude vyžadovat restartování databázové služby, které provede ClusterControl ve stejné úloze. Po restartování je rozšíření pgAudit povoleno a připraveno k použití:
postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';
name | default_version | installed_version | comment
---------+-----------------+-------------------+---------------------------------
pgaudit | 1.4.1 | 1.4.1 | provides auditing functionality
(1 row)
To je ono! Nyní můžete konfigurovat a používat pgAudit stejným způsobem, který jsme si ukázali dříve.
Závěr
Audit je vyžadován pro mnoho bezpečnostních předpisů a je také užitečný, pokud chcete vědět, co se stalo ve vaší databázi a kdy a kdo za to byl zodpovědný.
V tomto blogu jsme hovořili o rozšíření pgAudit PostgreSQL jako o dobrém způsobu auditování vašich PostgreSQL databází a také jsme vám ukázali, jak jej implementovat ručně a pomocí CLI ClusterControl.
Mějte na paměti, že v závislosti na konfiguraci může pgAudit generovat obrovské množství dat. Takže byste měli být opatrní, abyste určili, co potřebujete auditovat a jak dlouho.