sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan reviderer du en PostgreSQL-database

Revision er en god måde at holde dine data så sikre som muligt og at vide, hvad der sker i dine databaser. Det er også påkrævet for mange sikkerhedsforskrifter eller standarder, såsom PCI - Payment Card Industry. Dette er ikke en undtagelse for din PostgreSQL-database.

PostgreSQL har opnået et stærkt ry for sin gennemprøvede arkitektur, pålidelighed, dataintegritet, robuste funktionssæt, udvidelsesmuligheder og dedikationen fra open source-fællesskabet bag softwaren til konsekvent at levere effektive og innovative løsninger.

Når det er sagt, burde det være en mulighed at revidere en PostgreSQL-database, ikke? Nå, svaret er ja. I denne blog vil vi se, hvad pgAudit-udvidelsen er, og hvordan du installerer og bruger den i din PostgreSQL-database.

Hvad er pgAudit?

PostgreSQL Audit Extension (pgAudit) giver detaljeret sessions- og objektauditlogning via standard PostgreSQL-logningsfaciliteten.

Grundlæggende logning af erklæringer kan leveres af standardlogningsfaciliteten med log_statement =alle. Dette er acceptabelt til overvågning og andre grundlæggende brug, men giver ikke det detaljeringsniveau, der generelt kræves til revision. Det er ikke nok at have en liste over alle de operationer, der udføres mod databasen. Det skal også være muligt at finde særlige erklæringer, som er af interesse for en revisor. Standardlogningsfaciliteten viser, hvad brugeren anmodede om, mens pgAudit fokuserer på detaljerne om, hvad der skete, mens databasen imødekom anmodningen.

Sådan installeres pgAudit på PostgreSQL

I dette eksempel vil vi bruge en CentOS 7-installation. På dette tidspunkt antog vi, at du har din PostgreSQL-database installeret, ellers kan du følge dette blogindlæg for at få det op at køre på en nem måde ved hjælp af ClusterControl.

Nu skulle du have PostgreSQL-lageret i dit OS, noget som dette:

$ 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

Hvis du tjekker de tilgængelige pgaudit-pakker, bør du have:

pgaudit14_12.x86_64 : PostgreSQL Audit Extension

Så lad os installere det:

$ yum install pgaudit14_12

Nu skal du tilføje den i postgresql.conf-konfigurationsfilen, der som standard findes i /var/lib/pgsql/12/data/postgresql.conf, og genstarte PostgreSQL-tjenesten for at anvende ændringen.

shared_preload_libraries = 'pgaudit, pg_stat_statements'

Efter genstart af din databasetjeneste, skal du oprette udvidelsen:

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)

pgAudit-konfiguration

Du kan bekræfte den aktuelle konfiguration ved at køre følgende forespørgsel:

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)

Lad os se disse parametre én efter én.

  • pgaudit.log :Specificerer, hvilke klasser af udsagn, der vil blive logget af sessionsrevisionslogning. Standard er ingen. Mulige værdier er:
    • LÆS:VÆLG og KOPIér, når kilden er en relation eller en forespørgsel.
    • SKRIV:INDSÆT, OPDATER, SLET, AFSKRIV og KOPI, når destinationen er en relation.
    • FUNKTION:Funktionskald og DO-blokke.
    • ROLE:Udsagn relateret til roller og privilegier:TILDEL, TILBAGE, OPRET/ÆNDRE/SLIP ROLLE.
    • DDL:Alt DDL, der ikke er inkluderet i ROLE-klassen.
    • MISC:Diverse kommandoer, f.eks. Kassér, HENT, KONTROLPUNKT, STØVSUG, SÆT.
    • MISC_SET:Diverse SET-kommandoer, f.eks. ANGIV ROLLE.
    • ALLE:Medtag alt ovenstående.
  • pgaudit.log_catalog :Specificerer, at sessionslogning skal være aktiveret i det tilfælde, hvor alle relationer i en sætning er i pg_catalog. Deaktivering af denne indstilling vil reducere støj i loggen fra værktøjer som psql og PgAdmin, der forespørger kraftigt i kataloget. Standard er slået til.
  • pgaudit.log_client :Specificerer, om logmeddelelser vil være synlige for en klientproces, såsom psql. Denne indstilling bør generelt lades deaktiveret, men kan være nyttig til fejlfinding eller andre formål. Standarden er slået fra.
  • pgaudit.log_level :Specificerer logniveauet, der vil blive brugt til logindtastninger. Denne indstilling bruges til regressionstest og kan også være nyttig for slutbrugere til test eller andre formål. Standard er log.
  • pgaudit.log_parameter :Specificerer, at revisionslogning skal omfatte de parametre, der blev sendt sammen med erklæringen. Når parametre er til stede, vil de blive inkluderet i CSV-format efter sætningsteksten. Standarden er slået fra.
  • pgaudit.log_relation :Specificerer, om sessionsrevisionslogning skal oprette en separat logpost for hver relation (TABLE, VIEW osv.), der refereres til i en SELECT- eller DML-sætning. Dette er en nyttig genvej til udtømmende logning uden brug af objektrevisionslogning. Standarden er slået fra.
  • pgaudit.log_statement_once :Specificerer, om logning vil inkludere erklæringsteksten og parametrene med den første logindgang for en sætning/delsætningskombination eller med hver indtastning. Deaktivering af denne indstilling vil resultere i mindre omfattende logning, men kan gøre det sværere at bestemme den sætning, der genererede en logindgang, selvom sætningen/delsætningsparret sammen med proces-id'et burde være tilstrækkeligt til at identificere sætningsteksten, der er logget med en tidligere indtastning. Standarden er slået fra.
  • pgaudit.role :Specificerer masterrollen, der skal bruges til logning af objektrevision. Flere revisionsroller kan defineres ved at tildele dem til masterrollen. Dette gør det muligt for flere grupper at være ansvarlige for forskellige aspekter af revisionslogning. Der er ingen standard.

pgAudit-brug

Nu har vi gennemgået konfigurationsparametrene, lad os se et eksempel på, hvordan man bruger det i den virkelige verden.

For at revidere alle læse-, skrive- og DDL-forespørgsler skal du køre:

test1=# set pgaudit.log = 'read,write,ddl';

SET

Kør derefter følgende sætninger:

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)

Hvis du tjekker PostgreSQL-logfilen, vil du se dette:

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>

Selvfølgelig er dette et grundlæggende eksempel. Du kan bruge konfigurationsparametrene beskrevet i det foregående afsnit, så de passer til din virksomhed.

Aktivering af pgAudit med ClusterControl

I stedet for at installere og aktivere pgAudit manuelt, er en anden mulighed at bruge ClusterControl CLI til at udføre jobbet for dig. Til dette kan du køre følgende kommando fra din ClusterControl-server:

$ s9s cluster --setup-audit-logging --cluster-id=ID

Hvor ID er PostgreSQL-klynge-id'et.

Mens den kører, kan du overvåge status ved at kontrollere ClusterControl-jobbet. Først skal du bruge job-id'et, som du kan få fra joblisten:

$ s9s job --list

163  18 RUNNING  test_dba                     admins 19:41:45            90% Setup Audit Logging

Tjek nu jobdetaljerne:

$ 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.

Denne handling kræver en genstart af databasetjenesten, som udføres af ClusterControl i samme opgave. Efter genstart er pgAudit-udvidelsen aktiveret og klar til brug:

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)

Det var det! Du kan nu konfigurere og bruge pgAudit på samme måde, som vi viste tidligere.

Konklusion

Revision er påkrævet for mange sikkerhedsforskrifter, og det er også nyttigt, hvis du vil vide, hvad der skete i din database, og hvornår og hvem der var ansvarlig for det.

I denne blog talte vi om pgAudit PostgreSQL-udvidelsen som en god måde at revidere dine PostgreSQL-databaser på, og vi viste dig også, hvordan du implementerer den både manuelt og ved hjælp af ClusterControl CLI.

Husk på, at det, afhængigt af konfigurationen, er muligt for pgAudit at generere en enorm mængde data. Så du bør være omhyggelig med at bestemme, hvad du skal revidere og hvor længe.


  1. Den flerdelte identifikator kunne ikke bindes

  2. Oracle-proceduren returnerer ikke resultater, når den udføres fra scriptopgave på SSIS

  3. Få visningsoplysninger med VIEWS Information Schema View i SQL Server

  4. er der en fordel ved varchar(500) frem for varchar(8000)?