Il controllo è un buon modo per mantenere i tuoi dati il più al sicuro possibile e per sapere cosa sta succedendo nei tuoi database. È anche richiesto per molte normative o standard di sicurezza, come PCI - Payment Card Industry. Questa non è un'eccezione per il tuo database PostgreSQL.
PostgreSQL si è guadagnato una solida reputazione per la sua comprovata architettura, affidabilità, integrità dei dati, solido set di funzionalità, estensibilità e dedizione della comunità open source dietro il software per fornire costantemente soluzioni performanti e innovative.
Detto questo, dovrebbe essere un'opzione per controllare un database PostgreSQL, giusto? Ebbene, la risposta è sì. In questo blog vedremo cos'è l'estensione pgAudit e come installarla e usarla nel tuo database PostgreSQL.
Cos'è pgAudit?
L'estensione di verifica PostgreSQL (pgAudit) fornisce una registrazione dettagliata di verifica delle sessioni e degli oggetti tramite la funzione di registrazione standard di PostgreSQL.
La registrazione delle istruzioni di base può essere fornita dalla funzione di registrazione standard con log_statement =all. Ciò è accettabile per il monitoraggio e altri usi di base, ma non fornisce il livello di dettaglio generalmente richiesto per l'audit. Non è sufficiente avere un elenco di tutte le operazioni eseguite sul database. Deve inoltre essere possibile trovare dichiarazioni particolari che interessano un revisore dei conti. La funzione di registrazione standard mostra ciò che l'utente ha richiesto, mentre pgAudit si concentra sui dettagli di ciò che è accaduto mentre il database stava soddisfacendo la richiesta.
Come installare pgAudit su PostgreSQL
Per questo esempio, utilizzeremo un'installazione di CentOS 7. A questo punto, supponiamo che tu abbia installato il tuo database PostgreSQL, altrimenti puoi seguire questo post del blog per averlo installato e funzionante in modo semplice utilizzando ClusterControl.
Ora dovresti avere il repository PostgreSQL nel tuo sistema operativo, qualcosa del genere:
$ 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
Se controlli i pacchetti pgaudit disponibili, dovresti avere:
pgaudit14_12.x86_64 : PostgreSQL Audit Extension
Allora installiamolo:
$ yum install pgaudit14_12
Ora, dovrai aggiungerlo nel file di configurazione postgresql.conf, che si trova per impostazione predefinita in /var/lib/pgsql/12/data/postgresql.conf, e riavviare il servizio PostgreSQL per applicarlo il cambiamento.
shared_preload_libraries = 'pgaudit, pg_stat_statements'
Dopo aver riavviato il servizio database, devi creare l'estensione:
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)
Configurazione pgAudit
Puoi verificare la configurazione corrente eseguendo la seguente query:
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)
Vediamo questi parametri uno per uno.
- pgaudit.log :specifica quali classi di istruzioni verranno registrate dalla registrazione di controllo della sessione. Il valore predefinito è nessuno. I valori possibili sono:
- LEGGI:SELEZIONA e COPIA quando l'origine è una relazione o una query.
- SCRIVI:INSERT, UPDATE, DELETE, TRUNCATE e COPY quando la destinazione è una relazione.
- FUNZIONE:chiamate di funzione e blocchi DO.
- RUOLO:Dichiarazioni relative a ruoli e privilegi:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL:tutti i DDL non inclusi nella classe ROLE.
- MISC:comandi vari, ad es. SCARTARE, RECUPERARE, PUNTO DI CONTROLLO, VUOTO, IMPOSTARE.
- MISC_SET:vari comandi SET, ad es. IMPOSTA RUOLO.
- TUTTI:includi tutto quanto sopra.
- pgaudit.log_catalog :specifica che la registrazione della sessione deve essere abilitata nel caso in cui tutte le relazioni in un'istruzione siano in pg_catalog. La disabilitazione di questa impostazione ridurrà il rumore nel registro da strumenti come psql e PgAdmin che interrogano pesantemente il catalogo. L'impostazione predefinita è attiva.
- pgaudit.log_client :specifica se i messaggi di registro saranno visibili a un processo client come psql. Questa impostazione dovrebbe generalmente essere lasciata disabilitata, ma può essere utile per il debug o altri scopi. L'impostazione predefinita è disattivata.
- pgaudit.log_level :specifica il livello di registro che verrà utilizzato per le voci di registro. Questa impostazione viene utilizzata per i test di regressione e può essere utile anche agli utenti finali per test o altri scopi. L'impostazione predefinita è registro.
- pgaudit.log_parameter :specifica che la registrazione di controllo deve includere i parametri passati con l'istruzione. Quando i parametri sono presenti, saranno inclusi in formato CSV dopo il testo della dichiarazione. L'impostazione predefinita è disattivata.
- pgaudit.log_relation :specifica se la registrazione del controllo della sessione deve creare una voce di registro separata per ciascuna relazione (TABLE, VIEW e così via) a cui si fa riferimento in un'istruzione SELECT o DML. Questa è una scorciatoia utile per una registrazione esaustiva senza utilizzare la registrazione di controllo degli oggetti. L'impostazione predefinita è disattivata.
- pgaudit.log_statement_once :specifica se la registrazione includerà il testo e i parametri dell'istruzione con la prima voce di registro per una combinazione di istruzione/sottoistruzione o con ogni voce. La disabilitazione di questa impostazione comporterà una registrazione meno dettagliata, ma potrebbe rendere più difficile determinare l'istruzione che ha generato una voce di registro, sebbene la coppia istruzione/sottoistruzione insieme all'ID processo dovrebbero essere sufficienti per identificare il testo dell'istruzione registrato con una voce precedente. L'impostazione predefinita è disattivata.
- pgaudit.role :specifica il ruolo principale da utilizzare per la registrazione del controllo degli oggetti. È possibile definire più ruoli di controllo concedendoli al ruolo principale. Ciò consente a più gruppi di essere responsabili di diversi aspetti della registrazione dell'audit. Non ci sono impostazioni predefinite.
Utilizzo di pgAudit
Ora abbiamo rivisto i parametri di configurazione, vediamo un esempio di come utilizzarlo nel mondo reale.
Per controllare tutte le letture, scritture e query DDL, eseguire:
test1=# set pgaudit.log = 'read,write,ddl';
SET
E poi, esegui le seguenti frasi:
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)
Se controlli il file di registro di PostgreSQL, vedrai questo:
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>
Naturalmente, questo è un esempio di base. Puoi utilizzare i parametri di configurazione descritti nella sezione precedente per adattarli alla tua attività.
Abilitazione di pgAudit con ClusterControl
Invece di installare e abilitare pgAudit manualmente, un'altra opzione consiste nell'utilizzare ClusterControl CLI per eseguire il lavoro per te. A tale scopo, è possibile eseguire il seguente comando dal server ClusterControl:
$ s9s cluster --setup-audit-logging --cluster-id=ID
Dove ID è l'ID del cluster PostgreSQL.
Mentre è in esecuzione, puoi monitorare lo stato controllando il lavoro ClusterControl. Innanzitutto, avrai bisogno dell'ID lavoro, che puoi ottenere dall'elenco dei lavori:
$ s9s job --list
163 18 RUNNING test_dba admins 19:41:45 90% Setup Audit Logging
Ora, controlla i dettagli del lavoro:
$ 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.
Questa azione richiederà il riavvio del servizio database che verrà eseguito da ClusterControl nella stessa attività. Dopo averlo riavviato, l'estensione pgAudit è abilitata e pronta per l'uso:
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)
Ecco fatto! Ora puoi configurare e utilizzare pgAudit nello stesso modo mostrato in precedenza.
Conclusione
Il controllo è richiesto per molte normative di sicurezza ed è utile anche se vuoi sapere cosa è successo nel tuo database, quando e chi ne era responsabile.
In questo blog, abbiamo parlato dell'estensione pgAudit PostgreSQL come un buon modo per controllare i tuoi database PostgreSQL e ti abbiamo anche mostrato come implementarla sia manualmente che usando ClusterControl CLI.
Tieni presente che, a seconda della configurazione, è possibile che pgAudit generi un enorme volume di dati. Quindi, dovresti fare attenzione a determinare cosa devi controllare e per quanto tempo.