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

Revision af PostgreSQL ved hjælp af pgAudit

Revision i informationsteknologi (IT) er en proces, hvor man undersøger en organisations it-infrastruktur for at sikre overholdelse af de krav, der stilles af anerkendte standarder eller etablerede politikker. Databeskyttelsesregler, såsom de nye GDPR-regler, bliver stadig mere stringente for at beskytte brugerdata, så det er vigtigt, at dine databaserevisioner er sat ordentligt op for at sikre, at både din applikation og brugerdata er sikret mod sårbarheder. I dette blogindlæg vil vi diskutere pgAudit – et værktøj, der genererer de revisionslogfiler, der er nødvendige for at lette revisionen af ​​PostgreSQL.

Hvad er pgAudit?

PostgreSQL Audit Extension, pgAudit, er en open source-udvidelse, der logger hændelserne i en PostgreSQL-database i en detaljeret revisionslog. Den bruger den oprindelige PostgreSQL-logningsfacilitet, så revisionsloggene vil være en del af PostgreSQL-logfilerne. Udvidelsen er baseret på 2ndQuadrant pgAudit-projektet forfattet af Simon Riggs, Abhijit Menon-Sen og Ian Barwick og inkluderer forbedringer af David Steele fra Crunchy Data.

Hvorfor pgAudit over log_statement=all?

Vi kan logge alle udsagn i PostgreSQL blot ved at indstille log_statement=all . Så hvorfor overhovedet bruge pgAudit? Den grundlæggende sætningslogning (ved hjælp af log_statement ) vil kun vise de operationer, der udføres mod databasen. Det giver ikke mulighed for at filtrere operationer, og logfilerne vil ikke være i den korrekte formatering, der kræves til revision. pgAudit giver desuden granularitet til at logge specifikke klasser af udsagn som READ (VÆLG og COPY ), SKRIV (INDSÆT , OPDATERING , SLET osv.), DDL osv. Desuden giver det objektniveau revision, hvor kun operationer på specifikke relationer vil blive logget.

En anden fordel ved pgAudit i forhold til grundlæggende logning af erklæringer er, at det giver detaljerne om den udførte operation i stedet for blot at logge den anmodede handling. Overvej f.eks. at udføre den anonyme kodeblok ved hjælp af en DO-sætning.

DO $$
BEGIN
	EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

Den grundlæggende sætningslogning vil resultere i:

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 vil logge den samme handling som:

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>

Ovenstående angiver tydeligt pgAudit-funktionaliteten, der logger operationen og dens interne funktioner med struktureret output, der letter søgningen.

Sådan reviderer du PostgreSQL ved hjælp af pgAuditKlik for at tweete

Hvordan installeres pgAudit?

pgAudit er en udvidelse, der er tilgængelig til download fra PostgreSQL-lageret, eller som kan kompileres og bygges fra kilden. Som et første trin skal pakken downloades og installeres på maskinen, der kører PostgreSQL (denne udvidelsespakke er forudinstalleret på alle ScaleGrid PostgreSQL-implementeringer).

Når den er installeret, skal den indlæses i PostgreSQL. Dette opnås ved at tilføje pgaudit til shared_preload_libraries konfigurationsparameter. En genstart af PostgreSQL er påkrævet for at denne konfigurationsændring er effektiv. Det næste trin er at aktivere udvidelsen på databasen ved at køre CREATE EXTENSION pgaudit .

Nu hvor udvidelsen er klar, skal vi sørge for at indstille konfigurationsparametrene for udvidelsen for at begynde at logge. Dette kan være så simpelt som at indstille parameteren pgaudit.log at værdisætte alle og pgAudit vil begynde at logge på session tilstand.

Nu hvor vi ved, hvordan man installerer og aktiverer pgAudit, lad os diskutere de to revisionslogningstilstande, det tilbyder, session og objekt.

Sessionsrevisionslogning

I sessionstilstand vil pgAudit logge alle handlinger udført af en bruger. Indstilling af pgaudit.log parameter til enhver af de definerede værdier, bortset fra NONE , vil aktivere logning af sessionsrevision. pgaudit.log parameter angiver de klasser af udsagn, der vil blive logget i sessionstilstand. De mulige værdier er:READ , SKRIV , FUNKTION , ROLE , DDL , MISC , MISC_SET , ALLE og INGEN .

Indstilling af pgaudit.log parameter til ALL vil logge alle udsagn. Parameteren kan acceptere flere klasser ved hjælp af en kommasepareret liste, og specifikke klasser kan udelukkes med et –-tegn. For eksempel, hvis du vil logge alle udsagn undtagen MISC klasse, værdien af ​​pgaudit.log vil være ALL, -MISC, -MISC_SET . Du kan også aktivere pgAudit til at oprette en separat logindgang for hver relationsreference i en sætning ved at indstille pgaudit.log_relation til på.

Overvej et eksempel på oprettelse af en tabel. SQL-sætningen ville være:

CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));

De tilsvarende revisionslogposter er:

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>

Logføring af objektrevision

I særlige tilfælde kan det være nødvendigt kun at revidere et specifikt sæt af relationer. I sådanne tilfælde vil brug af sessionstilstand kun resultere i et unødvendigt stort antal revisionslogfiler, der ikke svarer til de påkrævede relationer. Objekttilstand er specielt velegnet til dette formål og kan kun auditere et specifikt sæt af relationer.

Objektrevisionslogning opnås ved hjælp af PostgreSQL-rollerne. En rolle kan oprettes og tildeles tilladelser til kun at få adgang til et specifikt sæt af relationer. Denne rolle skal angives i konfigurationsparameteren pgaudit.role . Objekttilstand understøtter kun SELECT , INDSÆT , OPDATERING og SLET udsagn. Klasserne af udsagn, der logges, afhænger af de tilladelser, der er givet til rollen. For eksempel, hvis rollen kun har tilladelse til at udføre SELECT , derefter kun SELECT udsagn vil blive logget.

Nedenfor er et eksempel på logning af objektrevision:

Opret en rolle og tildel kun SELECT tilladelser. Indstil pgaudit.role til den rolle og kør SELECT SQL-sætning:

CREATE ROLE audit_person;
GRANT SELECT ON persons TO audit_person;
SET pgaudit.role = 'audit_person';
SELECT * FROM persons WHERE ID=404;

Ovenstående valgudsagn vil blive logget som:

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>

Er du interesseret i en fuldt administreret PostgreSQL-løsning?

For at lære mere om, hvordan en DBaaS-udbyder som ScaleGrid kan hjælpe dig med at administrere dine PostgreSQL-databaser, tjek vores PostgreSQL-side. Se, hvordan ScaleGrid kan lade dig fokusere mere på at udvikle dit produkt og mindre på at administrere databaser.

Hvordan fortolker man revisionslogposten?

Indtil videre har vi givet detaljer om, hvordan revisionslogposten ser ud, lad os nu tage et kig på revisionslogindtastningsformatet. Hver post starter med log_line_prefix nævnt for PostgreSQL-logning, og derefter vil resten af ​​outputtet være i CSV-format. Overvej følgende simple revisionslogpost:

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>

I ovenstående post er værdien

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: 

er fra log_line_prefix-formatet %t:%r:%u@%d:[%p]: . Revisionspostens indhold starter fra LOG:AUDIT: værdi, og den følger CSV-format. Værdiformatet har formen:

AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER

Lad os tage et kig på hvert af felterne et efter et:

Felt Beskrivelse Værdi fra eksempel på revisionsindtastning
AUDIT_TYPE Angiver revisionstilstanden:SESSION eller OBJECT OBJEKT
STATEMENT_ID Unik sætnings-id for hver session 10
SUBSTATEMENT_ID En identifikator for hver undersætning i hovedsætningen 1
KLASSE Angiver klassen af ​​udsagn som READ, WRITE osv., der er definerede værdier for pgaudit.log parameter. LÆS
KOMMANDO Kommandoen brugt i SQL-sætningen VÆLG
OBJECT_TYPE Kan være TABLE, INDEX, VIEW osv. TABEL
OBJECT_NAME Det fuldt kvalificerede objektnavn public.persons
UDTALELSE Den faktiske sætning udført vælg * blandt personer, hvor ID=404;
PARAMETER Når pgaudit.log_parameter er sat til sand, vises den citerede CSV af parametre, hvis de er til stede, eller "ingen", hvis der ikke er nogen parametre. Når pgaudit.log_parameter ikke er indstillet, vil værdien være ""

Inferens

pgAudit med alle dens muligheder forenkler revisionsprocessen ved at generere revisionssporloggen. Selvom der er nogle få forbehold, såsom logning af omdøbte objekter under samme navn, er det stadig et robust værktøj, der giver den nødvendige funktionalitet. Revisionsinformationen, der er skrevet i logfiler, er muligvis ikke bare ideelle til revisionsprocessen – revisionsprocessen er endnu bedre, når disse logfiler kan konverteres til et databaseskema, og revisionsdata kan indlæses til databasen, så du nemt kan forespørge Information. Det er her, PostgreSQL Audit Log Analyzer (pgAudit Analyze) er nyttig. For mere information henvises til github-siderne i pgAudit og pgAudit Analyze.


  1. Hvordan udtrækkes det n'te ord og tælles ordforekomster i en MySQL-streng?

  2. Sådan håndteres datoer korrekt i forespørgselsbegrænsninger

  3. 3 måder at udtrække året fra en dato i SQL Server (T-SQL)

  4. Sådan opretter du en login.sql-fil til SQLcl