Auditing is een goede manier om uw gegevens zo veilig mogelijk te houden en te weten wat er in uw databases gebeurt. Het is ook vereist voor veel beveiligingsvoorschriften of -normen, zoals PCI - Payment Card Industry. Dit is geen uitzondering voor uw PostgreSQL-database.
PostgreSQL heeft een sterke reputatie opgebouwd vanwege zijn bewezen architectuur, betrouwbaarheid, gegevensintegriteit, robuuste functieset, uitbreidbaarheid en de toewijding van de open source-gemeenschap achter de software om consequent performante en innovatieve oplossingen te leveren.
Dat gezegd hebbende, zou het toch een optie moeten zijn om een PostgreSQL-database te controleren? Nou, het antwoord is ja. In deze blog zullen we zien wat de pgAudit-extensie is en hoe u deze kunt installeren en gebruiken in uw PostgreSQL-database.
Wat is pgAudit?
De PostgreSQL Audit Extension (pgAudit) biedt gedetailleerde logboekregistratie van sessies en objecten via de standaard PostgreSQL-registratiefaciliteit.
Het loggen van basisstatements kan worden geleverd door de standaard logfunctie met log_statement =all. Dit is acceptabel voor monitoring en ander basisgebruik, maar biedt niet het detailniveau dat doorgaans vereist is voor auditing. Het is niet voldoende om een lijst te hebben van alle bewerkingen die op de database zijn uitgevoerd. Ook moet het mogelijk zijn om bepaalde uitspraken te vinden die voor een accountant van belang zijn. De standaard logfunctie laat zien wat de gebruiker heeft gevraagd, terwijl pgAudit zich richt op de details van wat er is gebeurd terwijl de database aan het verzoek voldeed.
PgAudit installeren op PostgreSQL
Voor dit voorbeeld gebruiken we een CentOS 7-installatie. Op dit moment gingen we ervan uit dat u uw PostgreSQL-database had geïnstalleerd, anders kunt u deze blogpost volgen om deze op een gemakkelijke manier in gebruik te nemen met ClusterControl.
Nu zou u de PostgreSQL-repository in uw besturingssysteem moeten hebben, ongeveer als volgt:
$ 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
Als je de beschikbare pgaudit-pakketten controleert, zou je het volgende moeten hebben:
pgaudit14_12.x86_64 : PostgreSQL Audit Extension
Dus laten we het installeren:
$ yum install pgaudit14_12
Nu moet je het toevoegen aan het postgresql.conf-configuratiebestand, dat zich standaard bevindt in /var/lib/pgsql/12/data/postgresql.conf, en de PostgreSQL-service opnieuw starten om toe te passen de verandering.
shared_preload_libraries = 'pgaudit, pg_stat_statements'
Nadat u uw databaseservice opnieuw hebt opgestart, moet u de extensie maken:
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-configuratie
U kunt de huidige configuratie verifiëren door de volgende query uit te voeren:
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)
Laten we deze parameters een voor een bekijken.
- pgaudit.log :Specificeert welke klassen van instructies worden gelogd door sessie-auditregistratie. De standaardwaarde is geen. Mogelijke waarden zijn:
- LEES:SELECTEER en KOPIEER als de bron een relatie of een zoekopdracht is.
- SCHRIJF:INSERT, UPDATE, DELETE, TRUNCATE en COPY wanneer de bestemming een relatie is.
- FUNCTIE:Functieaanroepen en DO-blokken.
- ROLE:Verklaringen met betrekking tot rollen en privileges:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL:alle DDL die niet is opgenomen in de ROLE-klasse.
- MISC:Diverse opdrachten, b.v. WEGGOOIEN, OPHALEN, CONTROLEPUNT, VACUM, INSTELLEN.
- MISC_SET:Diverse SET-commando's, b.v. ROL INSTELLEN.
- ALLE:al het bovenstaande opnemen.
- pgaudit.log_catalog :Specificeert dat het loggen van sessies moet worden ingeschakeld in het geval dat alle relaties in een instructie in pg_catalog staan. Als u deze instelling uitschakelt, wordt de ruis in het logboek verminderd van tools zoals psql en PgAdmin die de catalogus intensief doorzoeken. De standaard is ingeschakeld.
- pgaudit.log_client :Specificeert of logberichten zichtbaar zijn voor een clientproces zoals psql. Deze instelling moet over het algemeen uitgeschakeld blijven, maar kan handig zijn voor foutopsporing of andere doeleinden. De standaard is uitgeschakeld.
- pgaudit.log_level :Specificeert het logniveau dat zal worden gebruikt voor loginvoeren. Deze instelling wordt gebruikt voor regressietesten en kan ook nuttig zijn voor eindgebruikers voor test- of andere doeleinden. De standaard is log.
- pgaudit.log_parameter :geeft aan dat controlelogboekregistratie de parameters moet bevatten die met de instructie zijn doorgegeven. Als er parameters aanwezig zijn, worden ze in CSV-formaat achter de instructietekst opgenomen. De standaard is uitgeschakeld.
- pgaudit.log_relation :Geeft aan of logboekregistratie van sessie-audits een afzonderlijk logboekitem moet maken voor elke relatie (TABLE, VIEW, enz.) waarnaar wordt verwezen in een SELECT- of DML-instructie. Dit is een handige snelkoppeling voor uitgebreide logboekregistratie zonder gebruik te maken van objectcontroleregistratie. De standaard is uitgeschakeld.
- pgaudit.log_statement_once :Specificeert of het loggen de instructietekst en parameters zal bevatten bij het eerste logitem voor een combinatie van een statement/substatement of bij elk item. Het uitschakelen van deze instelling resulteert in minder uitgebreide logboekregistratie, maar kan het moeilijker maken om de instructie te bepalen die een logboekitem heeft gegenereerd, hoewel het statement/substatement-paar samen met het proces-ID voldoende zou moeten zijn om de instructietekst te identificeren die is vastgelegd met een vorig item. De standaard is uitgeschakeld.
- pgaudit.role :Specificeert de hoofdrol die moet worden gebruikt voor objectcontrolelogboekregistratie. Er kunnen meerdere auditrollen worden gedefinieerd door ze aan de masterrol toe te kennen. Hierdoor kunnen meerdere groepen verantwoordelijk zijn voor verschillende aspecten van auditlogging. Er is geen standaard.
pgAudit-gebruik
Nu hebben we de configuratieparameters bekeken, laten we een voorbeeld bekijken van hoe het in de echte wereld te gebruiken.
Als u alle lees-, schrijf- en DDL-query's wilt controleren, voert u het volgende uit:
test1=# set pgaudit.log = 'read,write,ddl';
SET
En voer dan de volgende zinnen uit:
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)
Als u het PostgreSQL-logbestand controleert, ziet u dit:
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>
Natuurlijk is dit een eenvoudig voorbeeld. U kunt de configuratieparameters gebruiken die in het vorige gedeelte zijn beschreven om bij uw bedrijf te passen.
pgAudit inschakelen met ClusterControl
In plaats van pgAudit handmatig te installeren en in te schakelen, is een andere optie om de ClusterControl CLI te gebruiken om het werk voor u te doen. Hiervoor kunt u vanaf uw ClusterControl-server het volgende commando uitvoeren:
$ s9s cluster --setup-audit-logging --cluster-id=ID
Waar ID de PostgreSQL-cluster-ID is.
Terwijl het actief is, kunt u de status controleren door de ClusterControl-taak te controleren. Eerst heb je de vacature-ID nodig, die je uit de vacaturelijst kunt halen:
$ s9s job --list
163 18 RUNNING test_dba admins 19:41:45 90% Setup Audit Logging
Controleer nu de taakdetails:
$ 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.
Voor deze actie is een herstart van de databaseservice vereist die door ClusterControl in dezelfde taak wordt uitgevoerd. Nadat het opnieuw is opgestart, is de pgAudit-extensie ingeschakeld en klaar voor gebruik:
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)
Dat is het! U kunt pgAudit nu configureren en gebruiken op dezelfde manier als we eerder hebben laten zien.
Conclusie
Auditing is vereist voor veel beveiligingsvoorschriften en het is ook handig als u wilt weten wat er in uw database is gebeurd, en wanneer en wie daarvoor verantwoordelijk was.
In deze blog hebben we het gehad over de pgAudit PostgreSQL-extensie als een goede manier om uw PostgreSQL-databases te controleren, en we hebben u ook laten zien hoe u deze zowel handmatig als met behulp van de ClusterControl CLI kunt implementeren.
Houd er rekening mee dat het, afhankelijk van de configuratie, mogelijk is voor pgAudit om een enorme hoeveelheid gegevens te genereren. U moet dus zorgvuldig bepalen wat u moet controleren en voor hoe lang.