sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL controleren met pgAudit

Auditing in de informatietechnologie (IT) is een proces waarbij de IT-infrastructuur van een organisatie wordt onderzocht om te zorgen dat wordt voldaan aan de vereisten die worden opgelegd door erkende normen of vastgesteld beleid. Regels voor gegevensbescherming, zoals de nieuwe AVG-regelgeving, worden steeds strenger om gebruikersgegevens te beschermen, dus het is belangrijk dat uw database-audits goed zijn opgezet om ervoor te zorgen dat zowel uw toepassings- als gebruikersgegevens beschermd zijn tegen kwetsbaarheden. In deze blogpost bespreken we pgAudit – een tool die de auditlogboeken genereert die nodig zijn om de audit van PostgreSQL te vergemakkelijken.

Wat is pgAudit?

De PostgreSQL-auditextensie, pgAudit, is een open source-extensie die de gebeurtenissen in een PostgreSQL-database registreert in een gedetailleerd auditlogboek. Het maakt gebruik van de native PostgreSQL-logboekregistratie, dus de auditlogboeken zullen deel uitmaken van de PostgreSQL-logboeken. De extensie is gebaseerd op het 2ndQuadrant pgAudit-project, geschreven door Simon Riggs, Abhijit Menon-Sen en Ian Barwick, en bevat verbeteringen door David Steele van Crunchy Data.

Waarom pgAudit over log_statement=all?

We kunnen alle statements in PostgreSQL loggen door gewoon log_statement=all in te stellen . Dus waarom überhaupt pgAudit gebruiken? De basisregistratie van instructies (met behulp van log_statement ) geeft alleen de bewerkingen weer die op de database zijn uitgevoerd. Het biedt niet de mogelijkheid om bewerkingen te filteren en de logboeken hebben niet de juiste opmaak die vereist is voor controle. pgAudit biedt bovendien granulariteit voor het loggen van specifieke klassen van instructies zoals READ (SELECT en COPY ), WRITE (INSERT , UPDATE , DELETE , enz.), DDL enz. Verder biedt het auditing op objectniveau waarbij alleen bewerkingen op specifieke relaties worden vastgelegd.

Een ander voordeel van pgAudit boven het loggen van basisstatements is dat het de details van de uitgevoerde bewerking geeft in plaats van alleen de gevraagde bewerking te loggen. Overweeg bijvoorbeeld om het anonieme codeblok uit te voeren met een DO-statement.

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

Het loggen van basisstatements resulteert in:

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 zal dezelfde bewerking loggen als:

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>

Het bovenstaande geeft duidelijk de pgAudit-functionaliteit aan die de bewerking en de interne onderdelen ervan logt met gestructureerde uitvoer die het zoeken vergemakkelijkt.

PostgreSQL controleren met pgAuditClick To Tweet

Hoe pgAudit installeren?

pgAudit is een extensie die kan worden gedownload van de PostgreSQL-repository, of kan worden gecompileerd en gebouwd vanaf de broncode. Als eerste stap moet het pakket worden gedownload en geïnstalleerd op de machine waarop PostgreSQL draait (dit uitbreidingspakket is vooraf geïnstalleerd op alle ScaleGrid PostgreSQL-implementaties).

Eenmaal geïnstalleerd, moet het in PostgreSQL worden geladen. Dit wordt bereikt door pgaudit . toe te voegen naar de shared_preload_libraries configuratieparameter. Een herstart van PostgreSQL is vereist om deze configuratiewijziging effectief te laten zijn. De volgende stap is om de extensie op de database in te schakelen door CREATE EXTENSION pgaudit uit te voeren. .

Nu de extensie gereed is, moeten we ervoor zorgen dat de configuratieparameters voor de extensie zijn ingesteld om te beginnen met loggen. Dit kan zo simpel zijn als het instellen van de parameter pgaudit.log waarde toekennen aan all en de pgAudit begint in te loggen in session modus.

Nu we weten hoe we pgAudit moeten installeren en inschakelen, gaan we de twee modi voor auditregistratie bespreken, sessie en object.

Sessie-auditregistratie

In de sessiemodus logt pgAudit alle bewerkingen die door een gebruiker zijn uitgevoerd. Instellen van de pgaudit.log parameter naar een van de gedefinieerde waarden, behalve NONE , schakelt het loggen van sessie-audits in. De pgaudit.log parameter specificeert de klassen van instructies die worden gelogd in de sessiemodus. De mogelijke waarden zijn:READ , WRITE , FUNCTION , ROLE , DDL , MISC , MISC_SET , ALL en NONE .

De pgaudit.log instellen parameter naar ALL logt alle verklaringen. De parameter kan meerdere klassen accepteren met behulp van een door komma's gescheiden lijst en specifieke klassen kunnen worden uitgesloten met een – teken. Als u bijvoorbeeld alle verklaringen wilt loggen behalve MISC class, de waarde van pgaudit.log wordt ALL, -MISC, -MISC_SET . U kunt pgAudit ook inschakelen om een ​​aparte logboekvermelding te maken voor elke relatieverwijzing in een instructie door pgaudit.log_relation in te stellen. aan.

Bekijk een voorbeeld van het maken van een tabel. De SQL-instructie zou zijn:

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

De corresponderende vermeldingen in het controlelogboek zijn:

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>

Object Audit Logging

In bepaalde gevallen kan het nodig zijn om alleen een specifieke set relaties te controleren. In dergelijke gevallen zal het gebruik van de sessiemodus alleen resulteren in een onnodig groot aantal auditlogs die niet overeenkomen met de vereiste relaties. Objectmodus is speciaal geschikt voor dit doel en kan alleen een specifieke set relaties controleren.

Logboekregistratie van objectcontroles wordt bereikt met behulp van de PostgreSQL-rollen. Er kan een rol worden gemaakt en de machtigingen worden toegewezen om alleen toegang te krijgen tot een specifieke set relaties. Deze rol moet worden gespecificeerd in de configuratieparameter pgaudit.role . Objectmodus ondersteunt alleen SELECT , INSERT , UPDATE en DELETE verklaringen. De klassen van instructies die worden vastgelegd, zijn afhankelijk van de machtigingen die aan de rol zijn verleend. Als de rol bijvoorbeeld machtigingen heeft om alleen SELECT . uit te voeren , dan alleen SELECT verklaringen worden gelogd.

Hieronder ziet u een voorbeeld van objectcontrolelogboekregistratie:

Maak een rol aan en verleen alleen SELECT rechten. Stel de pgaudit.role . in aan die rol en voer de SELECT SQL-instructie:

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

De bovenstaande select-instructie wordt gelogd als:

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>

Geïnteresseerd in een volledig beheerde PostgreSQL-oplossing?

Bekijk onze PostgreSQL-pagina voor meer informatie over hoe een DBaaS-provider zoals ScaleGrid u kan helpen bij het beheren van uw PostgreSQL-databases. Bekijk hoe u zich met ScaleGrid meer kunt concentreren op het ontwikkelen van uw product en minder op het beheren van databases.

Hoe interpreteer ik de invoer in het controlelogboek?

Tot nu toe hebben we details gegeven over hoe de invoer in het controlelogboek eruitziet. Laten we nu eens kijken naar het invoerformaat van het controlelogboek. Elk item begint met de log_line_prefix die wordt genoemd voor PostgreSQL-logboekregistratie, en de rest van de uitvoer is in CSV-indeling. Overweeg de volgende eenvoudige invoer in het auditlogboek:

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>

In het bovenstaande item, de waarde

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

is van het log_line_prefix formaat %t:%r:%u@%d:[%p]: . De inhoud van de auditinvoer begint vanaf LOG: AUDIT: waarde en het volgt het CSV-formaat. Het waardeformaat is van de vorm:

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

Laten we elk van de velden een voor een bekijken:

Veld Beschrijving Waarde uit voorbeeld controle-invoer
AUDIT_TYPE Geeft de controlemodus aan:SESSION of OBJECT OBJECT
STATEMENT_ID Unieke instructie-ID voor elke sessie 10
SUBSTATEMENT_ID Een identifier voor elke sub-instructie binnen de hoofd-instructie 1
KLASSE Geeft de klasse aan van statements zoals READ, WRITE etc die gedefinieerde waarden zijn voor de pgaudit.log parameter. LEZEN
COMMANDO De opdracht die in de SQL-instructie wordt gebruikt SELECTEER
OBJECT_TYPE Kan TABLE, INDEX, VIEW, etc. zijn TABEL
OBJECT_NAME De volledig gekwalificeerde objectnaam public.persons
VERKLARING Het daadwerkelijke uitgevoerde statement selecteer * uit personen waarbij ID=404;
PARAMETER Als de pgaudit.log_parameter is ingesteld op true, wordt de geciteerde CSV van parameters vermeld indien aanwezig, of "none" als er geen parameters zijn. Als de pgaudit.log_parameter niet is ingesteld, is de waarde ""

Inferentie

pgAudit, met al zijn mogelijkheden, vereenvoudigt het auditproces door het audittrail-logboek te genereren. Hoewel er een paar kanttekeningen zijn, zoals het loggen van hernoemde objecten onder dezelfde naam, is het nog steeds een robuust hulpmiddel dat de vereiste functionaliteit biedt. De audit-informatie die in logboeken is geschreven, is misschien niet alleen ideaal voor het auditproces - het auditproces is zelfs nog beter wanneer die logs kunnen worden geconverteerd naar een databaseschema en auditgegevens in de database kunnen worden geladen, zodat u eenvoudig de informatie. Dit is waar de PostgreSQL Audit Log Analyzer (pgAudit Analyze) nuttig is. Raadpleeg voor meer informatie de github-pagina's van pgAudit en pgAudit Analyze.


  1. Stopwoorden en Stoplist gebruiken om SQL Server Full-Text Search (FTS) te verbeteren

  2. Volledige MariaDB-codering in rust en tijdens transport voor maximale gegevensbescherming - deel twee

  3. PayPal ODBC-stuurprogramma

  4. node.js mysql-fout:ECONNREFUSED