sql >> Databasteknik >  >> RDS >> PostgreSQL

Granskning av PostgreSQL med pgAudit

Revision inom informationsteknologi (IT) är en process för att undersöka en organisations IT-infrastruktur för att säkerställa överensstämmelse med de krav som ställs av erkända standarder eller etablerade policyer. Dataskyddsregler, som de nya GDPR-bestämmelserna, blir allt strängare för att skydda användardata, så det är viktigt att dina databasrevisioner är korrekt inställda för att säkerställa att både din applikation och användardata är säkra från sårbarheter. I det här blogginlägget kommer vi att diskutera pgAudit – ett verktyg som genererar de revisionsloggar som behövs för att underlätta granskningen av PostgreSQL.

Vad är pgAudit?

PostgreSQL Audit Extension, pgAudit, är ett tillägg med öppen källkod som loggar händelserna i en PostgreSQL-databas i en detaljerad granskningslogg. Den använder den inbyggda PostgreSQL-loggningsfunktionen, så granskningsloggarna kommer att vara en del av PostgreSQL-loggarna. Tillägget är baserat på 2ndQuadrant pgAudit-projektet författat av Simon Riggs, Abhijit Menon-Sen och Ian Barwick, och inkluderar förbättringar av David Steele från Crunchy Data.

Varför pgAudit över log_statement=all?

Vi kan logga alla uttalanden i PostgreSQL bara genom att ställa in log_statement=all . Så varför använda pgAudit överhuvudtaget? Den grundläggande satsloggningen (med log_statement ) kommer endast att lista de operationer som utförs mot databasen. Det kommer inte att ge möjligheten att filtrera operationer, och loggarna kommer inte att ha rätt formatering som krävs för granskning. pgAudit ger dessutom granularitet för att logga specifika klasser av uttalanden som READ (VÄLJ och COPY ), SKRIV (INSERT , UPPDATERA , RADERA , etc.), DDL etc. Dessutom tillhandahåller det granskning på objektnivå där endast operationer på specifika relationer kommer att loggas.

En annan fördel med pgAudit jämfört med grundläggande uttalandeloggning är att det ger detaljerna om den utförda operationen istället för att bara logga den begärda operationen. Överväg till exempel att köra det anonyma kodblocket med en DO-sats.

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

Den grundläggande satsloggningen kommer att resultera 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 loggar samma operation 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>

Ovanstående indikerar tydligt pgAudit-funktionen som loggar operationen och dess interna funktioner med strukturerad utdata som förenklar sökningen.

Hur man granskar PostgreSQL med pgAuditKlicka för att tweeta

Hur installerar man pgAudit?

pgAudit är ett tillägg som är tillgängligt för nedladdning från PostgreSQL-förvaret, eller kan kompileras och byggas från källkod. Som ett första steg måste paketet laddas ner och installeras på maskinen som kör PostgreSQL (det här tilläggspaketet är förinstallerat på alla ScaleGrid PostgreSQL-distributioner).

När den har installerats måste den laddas in i PostgreSQL. Detta uppnås genom att lägga till pgaudit till shared_preload_libraries konfigurationsparameter. En omstart av PostgreSQL krävs för att denna konfigurationsändring ska bli effektiv. Nästa steg är att aktivera tillägget på databasen genom att köra CREATE EXTENSION pgaudit .

Nu när tillägget är klart måste vi se till att ställa in konfigurationsparametrarna för att tillägget ska börja logga. Detta kan vara så enkelt som att ställa in parametern pgaudit.log att värdera all och pgAudit kommer att börja logga in session läge.

Nu när vi vet hur man installerar och aktiverar pgAudit, låt oss diskutera de två revisionsloggningslägen som den erbjuder, session och objekt.

Sessionsgranskningsloggning

I sessionsläge loggar pgAudit alla operationer som utförs av en användare. Ställa in pgaudit.log parameter till något av de definierade värdena, annat än NONE , kommer att aktivera sessionsgranskningsloggning. pgaudit.log parametern anger klasserna av satser som kommer att loggas i sessionsläget. De möjliga värdena är:READ , SKRIV , FUNKTION , ROL , DDL , MISC , MISC_SET , ALLA och INGEN .

Ställa in pgaudit.log parameter till ALL kommer att logga alla uttalanden. Parametern kan acceptera flera klasser med hjälp av en kommaseparerad lista och specifika klasser kan uteslutas med ett –-tecken. Till exempel, om du vill logga alla satser utom MISC class, värdet för pgaudit.log kommer att vara ALL, -MISC, -MISC_SET . Du kan också göra det möjligt för pgAudit att skapa en separat loggpost för varje relationsreferens i en sats genom att ställa in pgaudit.log_relation till på.

Tänk på ett exempel på hur du skapar en tabell. SQL-satsen skulle vara:

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

Motsvarande granskningsloggposter är:

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>

Loggning av objektgranskning

I vissa fall kan det krävas att endast granska en specifik uppsättning relationer. I sådana fall kommer användning av sessionsläge endast att resultera i ett onödigt stort antal granskningsloggar som inte motsvarar de nödvändiga relationerna. Objektläget är speciellt lämpat för detta ändamål och kan endast granska en specifik uppsättning relationer.

Objektgranskningsloggning uppnås med hjälp av PostgreSQL-rollerna. En roll kan skapas och tilldelas behörighet för att bara komma åt en specifik uppsättning relationer. Denna roll bör specificeras i konfigurationsparametern pgaudit.role . Objektläget stöder endast SELECT , INSERT , UPPDATERA och DELETE uttalanden. Klasserna av uttalanden som loggas beror på de behörigheter som ges till rollen. Till exempel, om rollen har behörighet att endast utföra SELECT , sedan bara SELECT uttalanden kommer att loggas.

Nedan är ett exempel på objektgranskningsloggning:

Skapa en roll och bevilja endast SELECT behörigheter. Ställ in pgaudit.role till den rollen och kör SELECT SQL-sats:

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

Select-satsen ovan kommer att loggas 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>

Intresserad av en helt hanterad PostgreSQL-lösning?

För att lära dig mer om hur en DBaaS-leverantör som ScaleGrid kan hjälpa dig att hantera dina PostgreSQL-databaser, kolla in vår PostgreSQL-sida. Se hur ScaleGrid kan låta dig fokusera mer på att utveckla din produkt och mindre på att hantera databaser.

Hur tolkar man granskningsloggposten?

Hittills har vi tillhandahållit detaljer om hur granskningsloggposten ser ut, låt oss nu ta en titt på granskningsloggpostens format. Varje post börjar med log_line_prefixet som nämns för PostgreSQL-loggning, och sedan kommer resten av utdata att vara i CSV-format. Tänk på följande enkla granskningsloggpost:

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 ovanstående post är värdet

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

är från formatet log_line_prefix %t:%r:%u@%d:[%p]: . Granskningspostens innehåll börjar från LOGG:AUDIT: värde och det följer CSV-format. Värdeformatet har formen:

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

Låt oss ta en titt på vart och ett av fälten ett efter ett:

Fält Beskrivning Värde från exemplet revisionsinlägg
AUDIT_TYPE Indikerar granskningsläget:SESSION eller OBJECT OBJEKT
STATEMENT_ID Unik satsidentifierare för varje session 10
SUBSTATEMENT_ID En identifierare för varje delsats i huvudsatsen 1
KLASS Inger klassen av uttalanden som READ, WRITE etc som är definierade värden för parametern pgaudit.log. LÄS
KOMMANDO Kommandot som används i SQL-satsen VÄLJ
OBJECT_TYPE Kan vara TABLE, INDEX, VIEW, etc. TABELL
OBJECT_NAME Det fullständiga objektnamnet public.persons
UTTALANDE Det faktiska uttalandet som körs välj * bland personer där ID=404;
PARAMETER När pgaudit.log_parametern är satt till true, listas den citerade CSV-filen med parametrar om den finns, eller "ingen" om det inte finns några parametrar. När pgaudit.log_parameter inte är inställd kommer värdet att vara ""

Inferens

pgAudit, med alla dess möjligheter, förenklar revisionsprocessen genom att generera granskningsloggen. Även om det finns några varningar, som att logga omdöpta objekt under samma namn, är det fortfarande ett robust verktyg som ger den funktionalitet som krävs. Men granskningsinformationen som skrivs i loggar är kanske inte bara idealisk för granskningsprocessen – granskningsprocessen är ännu bättre när dessa loggar kan konverteras till ett databasschema och granskningsdata kan laddas till databasen så att du enkelt kan fråga information. Det är här som PostgreSQL Audit Log Analyzer (pgAudit Analyze) är till hjälp. För mer information, se github-sidorna för pgAudit och pgAudit Analyze.


  1. Åsidosätt frågeoptimeraren för dina T-SQL-anslutningar med FORCEPLAN

  2. Förstå Java Support for Persistence med JPA

  3. Hur man får senaste 1 timmes data i MySQL

  4. PostgreSQL accepterar inte kolumnalias i WHERE-satsen