Überprüfung ist eine gute Möglichkeit, Ihre Daten so sicher wie möglich zu halten und zu wissen, was in Ihren Datenbanken vor sich geht. Es ist auch für viele Sicherheitsvorschriften oder -standards erforderlich, wie z. B. PCI - Payment Card Industry. Dies ist keine Ausnahme für Ihre PostgreSQL-Datenbank.
PostgreSQL hat sich einen guten Ruf für seine bewährte Architektur, Zuverlässigkeit, Datenintegrität, seinen robusten Funktionsumfang, seine Erweiterbarkeit und das Engagement der Open-Source-Community hinter der Software erworben, um durchgängig leistungsstarke und innovative Lösungen bereitzustellen.
Trotzdem sollte es eine Option sein, eine PostgreSQL-Datenbank zu prüfen, richtig? Nun, die Antwort ist ja. In diesem Blog werden wir sehen, was die pgAudit-Erweiterung ist und wie sie in Ihrer PostgreSQL-Datenbank installiert und verwendet wird.
Was ist pgAudit?
Die PostgreSQL-Audit-Erweiterung (pgAudit) bietet eine detaillierte Sitzungs- und Objekt-Audit-Protokollierung über die standardmäßige PostgreSQL-Protokollierungsfunktion.
Grundlegendes Statement-Logging kann durch die Standard-Logging-Einrichtung mit log_statement =all bereitgestellt werden. Dies ist für die Überwachung und andere grundlegende Anwendungen akzeptabel, bietet jedoch nicht den Detaillierungsgrad, der im Allgemeinen für die Überwachung erforderlich ist. Es reicht nicht aus, eine Liste aller Operationen zu haben, die für die Datenbank durchgeführt wurden. Auch bestimmte Aussagen, die für einen Wirtschaftsprüfer interessant sind, müssen auffindbar sein. Die standardmäßige Protokollierungsfunktion zeigt, was der Benutzer angefordert hat, während sich pgAudit auf die Details dessen konzentriert, was passiert ist, während die Datenbank die Anforderung erfüllt hat.
So installieren Sie pgAudit auf PostgreSQL
Für dieses Beispiel verwenden wir eine CentOS 7-Installation. An dieser Stelle gehen wir davon aus, dass Sie Ihre PostgreSQL-Datenbank installiert haben, andernfalls können Sie diesem Blogbeitrag folgen, um sie mithilfe von ClusterControl auf einfache Weise zum Laufen zu bringen.
Jetzt sollten Sie das PostgreSQL-Repository in Ihrem Betriebssystem haben, etwa so:
$ 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
Wenn Sie die verfügbaren pgaudit-Pakete überprüfen, sollten Sie Folgendes haben:
pgaudit14_12.x86_64 : PostgreSQL Audit Extension
Also installieren wir es:
$ yum install pgaudit14_12
Nun müssen Sie es zur Konfigurationsdatei postgresql.conf hinzufügen, die sich standardmäßig in /var/lib/pgsql/12/data/postgresql.conf befindet, und den PostgreSQL-Dienst neu starten, um es anzuwenden die Änderung.
shared_preload_libraries = 'pgaudit, pg_stat_statements'
Nach dem Neustart Ihres Datenbankdienstes müssen Sie die Erweiterung erstellen:
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
Sie können die aktuelle Konfiguration überprüfen, indem Sie die folgende Abfrage ausführen:
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)
Sehen wir uns diese Parameter nacheinander an.
- pgaudit.log :Gibt an, welche Klassen von Anweisungen von der Sitzungsüberwachungsprotokollierung protokolliert werden. Der Standardwert ist keine. Mögliche Werte sind:
- LESEN:AUSWÄHLEN und KOPIEREN, wenn die Quelle eine Relation oder eine Abfrage ist.
- WRITE:INSERT, UPDATE, DELETE, TRUNCATE und COPY, wenn das Ziel eine Relation ist.
- FUNCTION:Funktionsaufrufe und DO-Blöcke.
- ROLE:Anweisungen zu Rollen und Privilegien:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL:Alle DDL, die nicht in der ROLE-Klasse enthalten sind.
- MISC:Diverse Befehle, z.B. DISCARD, FETCH, CHECKPOINT, VACUUM, SET.
- MISC_SET:Verschiedene SET-Befehle, z.B. ROLLE FESTLEGEN.
- ALLE:Schließen Sie alle oben genannten ein.
- pgaudit.log_catalog :Gibt an, dass die Sitzungsprotokollierung aktiviert werden soll, falls sich alle Beziehungen in einer Anweisung in pg_catalog befinden. Durch Deaktivieren dieser Einstellung wird das Rauschen im Protokoll von Tools wie psql und PgAdmin reduziert, die den Katalog stark abfragen. Die Standardeinstellung ist aktiviert.
- pgaudit.log_client :Gibt an, ob Protokollmeldungen für einen Clientprozess wie psql sichtbar sind. Diese Einstellung sollte im Allgemeinen deaktiviert bleiben, kann aber zum Debuggen oder für andere Zwecke nützlich sein. Die Standardeinstellung ist aus.
- pgaudit.log_level :Gibt die Protokollebene an, die für Protokolleinträge verwendet wird. Diese Einstellung wird für Regressionstests verwendet und kann auch für Endbenutzer zu Test- oder anderen Zwecken nützlich sein. Der Standardwert ist log.
- pgaudit.log_parameter :Gibt an, dass die Überwachungsprotokollierung die Parameter enthalten soll, die mit der Anweisung übergeben wurden. Wenn Parameter vorhanden sind, werden sie im CSV-Format nach dem Anweisungstext eingefügt. Die Standardeinstellung ist aus.
- pgaudit.log_relation :Gibt an, ob die Protokollierung der Sitzungsüberwachung einen separaten Protokolleintrag für jede Relation (TABLE, VIEW usw.) erstellen soll, auf die in einer SELECT- oder DML-Anweisung verwiesen wird. Dies ist eine nützliche Abkürzung für eine umfassende Protokollierung ohne Verwendung der Objektüberwachungsprotokollierung. Die Standardeinstellung ist aus.
- pgaudit.log_statement_once :Gibt an, ob die Protokollierung den Anweisungstext und die Parameter mit dem ersten Protokolleintrag für eine Anweisung/Unteranweisung-Kombination oder mit jedem Eintrag enthält. Das Deaktivieren dieser Einstellung führt zu einer weniger ausführlichen Protokollierung, kann es jedoch schwieriger machen, die Anweisung zu ermitteln, die einen Protokolleintrag generiert hat, obwohl das Anweisungs-/Unteranweisungspaar zusammen mit der Prozess-ID ausreichen sollte, um den mit einem vorherigen Eintrag protokollierten Anweisungstext zu identifizieren. Die Standardeinstellung ist aus.
- pgaudit.role :Gibt die Master-Rolle an, die für die Objektüberwachungsprotokollierung verwendet werden soll. Mehrere Audit-Rollen können definiert werden, indem sie der Master-Rolle zugewiesen werden. Dadurch können mehrere Gruppen für verschiedene Aspekte der Audit-Protokollierung zuständig sein. Es gibt keinen Standard.
pgAudit-Nutzung
Jetzt haben wir die Konfigurationsparameter überprüft, sehen wir uns ein Beispiel an, wie man sie in der realen Welt verwendet.
Um alle Lese-, Schreib- und DDL-Abfragen zu prüfen, führen Sie Folgendes aus:
test1=# set pgaudit.log = 'read,write,ddl';
SET
Und dann führen Sie die folgenden Sätze aus:
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)
Wenn Sie die PostgreSQL-Protokolldatei überprüfen, sehen Sie Folgendes:
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>
Natürlich ist dies ein einfaches Beispiel. Sie können die im vorherigen Abschnitt beschriebenen Konfigurationsparameter verwenden, um sie an Ihr Unternehmen anzupassen.
pgAudit mit ClusterControl aktivieren
Anstatt pgAudit manuell zu installieren und zu aktivieren, besteht eine andere Möglichkeit darin, die ClusterControl-CLI zu verwenden, um die Arbeit für Sie zu erledigen. Dazu können Sie den folgenden Befehl von Ihrem ClusterControl-Server ausführen:
$ s9s cluster --setup-audit-logging --cluster-id=ID
Wobei ID die PostgreSQL-Cluster-ID ist.
Während es läuft, können Sie den Status überwachen, indem Sie den ClusterControl-Job überprüfen. Zuerst benötigen Sie die Job-ID, die Sie der Jobliste entnehmen können:
$ s9s job --list
163 18 RUNNING test_dba admins 19:41:45 90% Setup Audit Logging
Überprüfen Sie jetzt die Auftragsdetails:
$ 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.
Diese Aktion erfordert einen Neustart des Datenbankdienstes, der von ClusterControl in derselben Aufgabe durchgeführt wird. Nach dem Neustart ist die pgAudit-Erweiterung aktiviert und einsatzbereit:
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)
Das ist es! Sie können pgAudit jetzt auf die gleiche Weise konfigurieren und verwenden, wie wir es zuvor gezeigt haben.
Fazit
Überprüfung ist für viele Sicherheitsvorschriften erforderlich und es ist auch nützlich, wenn Sie wissen möchten, was in Ihrer Datenbank passiert ist, wann und wer dafür verantwortlich war.
In diesem Blog sprachen wir über die PostgreSQL-Erweiterung pgAudit als eine gute Möglichkeit, Ihre PostgreSQL-Datenbanken zu prüfen, und wir haben Ihnen auch gezeigt, wie Sie sie sowohl manuell als auch mit der ClusterControl-Befehlszeilenschnittstelle implementieren.
Beachten Sie, dass pgAudit je nach Konfiguration enorme Datenmengen erzeugen kann. Daher sollten Sie sorgfältig festlegen, was Sie prüfen müssen und wie lange.