Wie verwende ich die pgaudit-Erweiterung, um meine Amazon-RDS-DB-Instance zu überprüfen, auf der PostgreSQL ausgeführt wird?

Lesedauer: 6 Minute
0

Ich möchte alle meine Datenbanken, Rollen, Beziehungen oder Spalten prüfen und ich möchte verschiedenen Rollen unterschiedliche Auditstufen anbieten. Wie kann ich die pgaudit-Erweiterung für verschiedene Rollenebenen auf einer Amazon Relational Database Service (Amazon RDS)-DB-Instance konfigurieren, auf der Amazon RDS für PostgreSQL ausgeführt wird?

Behebung

Es gibt verschiedene Parameter, die Sie festlegen können, um Aktivitäten auf Ihrer PostgreSQL-DB-Instance zu protokollieren. Um verschiedene Datenbanken, Rollen, Tabellen oder Spalten zu überprüfen, können Sie die pgaudit-Erweiterung verwenden. Nachdem Sie die pgaudit-Erweiterung aktiviert haben, können Sie den Parameter pgaudit.log so konfigurieren, dass bestimmte Datenbanken, Rollen, Tabellen und Spalten überprüft werden.

Aktivierung der pgaudit-Erweiterung auf einer Amazon-RDS-Instance, auf der PostgreSQL ausgeführt wird

  1. Erstellen Sie eine bestimmte Datenbankrolle mit dem Namen rds_pgaudit, indem Sie den folgenden Befehl ausführen:
CREATE ROLE rds_pgaudit;
CREATE ROLE
  1. Ändern Sie die folgenden Parameter in Ihrer benutzerdefinierten DB-Parametergruppe, die Ihrer DB-Instance zugeordnet ist:
    Fügen Sie pgaudit zu shared_preload_libraries hinzu oder hängen Sie es an
    Konfigurieren Sie pgaudit.role auf rds_pgaudit, die in Schritt 1 erstellte Rolle

  2. Starten Sie die Instance neu, damit die Änderungen an der Parametergruppe auf die Instance angewendet werden.

  3. Bestätigen Sie, dass pgaudit initialisiert ist, indem Sie den folgenden Befehl ausführen:

show shared_preload_libraries;
shared_preload_libraries
--------------------------
rdsutils,pgaudit
(1 row)
  1. Erstellen Sie die pgaudit-Erweiterung, indem Sie den folgenden Befehl ausführen:
CREATE EXTENSION pgaudit;
CREATE EXTENSION
  1. Bestätigen Sie, dass pgaudit.role auf rds_pgaudit gesetzt ist, indem Sie den folgenden Befehl ausführen:
show pgaudit.role;
pgaudit.role
------------------
rds_pgaudit
  1. Konfigurieren Sie den Parameter pgaudit.log so, dass er eines der folgenden Elemente prüft:
  • ALL prüft die folgenden Befehle.
  • MISC prüft verschiedene Befehle wie DISCARD, FETCH, CHECKPOINT, VACUUM, SET.
  • DDL prüft alle Datenbeschreibungssprachen (DDL), die nicht in der ROLE-Klasse enthalten sind.
  • ROLE prüft Anweisungen, die sich auf Rollen und Rechte beziehen, wie GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
  • FUNCTION prüft Funktionsaufrufe und DO-Blöcke.
  • WRITE prüft INSERT, UPDATE, DELETE, TRUNCATE und COPY, wenn das Ziel eine Relation ist.
  • READ prüft SELECT und COPY, wenn es sich bei der Quelle um eine Relation oder eine Abfrage handelt.

Je nachdem, was Sie prüfen möchten, legen Sie den Wert des Parameters pgaudit.log für eine Datenbank, Rolle oder Tabelle fest.

Verwenden der pgaudit-Erweiterung zur Prüfung von Datenbanken

  1. Um den Wert des Parameters pgaudit.log für eine Datenbank, Rolle oder Tabelle festzulegen, setzen Sie den Parameter pgaudit.log auf der Parametergruppenebene auf none:
> show pgaudit.log;
+---------------+
| pgaudit.log   |
|---------------|
| none          |
+---------------+
SHOW

2. Führen Sie den folgenden Befehl aus, um die Systemkonfiguration für diesen Parameter nur in dieser Datenbank zu überschreiben:

ALTER DATABASE test_database set pgaudit.log='All';

Dadurch wird der Wert des Parameters pgaudit.log in All geändert, sodass test_database die einzige Datenbank ist, die in der RDS-DB-Instance geprüft wird.

  1. Stellen Sie eine Verbindung zu test_database her und führen Sie die folgende Abfrage aus:
select * from test_table;

Die Ausgabe des Fehlerprotokolls ähnelt der folgenden:

2019-06-25 19:21:35 UTC:192.0.2.7(39330):testpar@test_database:[21638]:LOG: AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not logged>

Verwenden der pgaudit-Erweiterung zur Prüfung von Rollen

Ähnlich wie bei der Konfiguration des Parameters pgaudit.log auf Datenbankebene wird die Rolle so geändert, dass sie einen anderen Wert für den Parameter pgaudit.log hat. In den folgenden Beispielbefehlen werden die Rollen test1 und test2 so geändert, dass sie unterschiedliche pgaudit.log-Konfigurationen haben.

  1. Stellen Sie unterschiedliche Werte für den Parameter pgaudit.log für test1 und test2 ein, indem Sie die folgenden Befehle ausführen:
ALTER ROLE test1 set pgaudit.log='All';
ALTER ROLE test2 set pgaudit.log='DDL';
  1. Überprüfen Sie, ob die Änderungen auf Rollenebene vorgenommen wurden, indem Sie die folgende Abfrage ausführen:
> select rolname,rolconfig from pg_roles where rolname in ('test1','
                  test2');
+-----------+----------------------+
| rolname   | rolconfig            |
|-----------+----------------------|
| test1     | [u'pgaudit.log=All'] |
| test2     | [u'pgaudit.log=DDL'] |
+-----------+----------------------+
SELECT 2
Time: 0.010s
  1. Führen Sie die folgenden Abfragen sowohl für test1 als auch für test2 aus:
CREATE TABLE test_table (id int);
CREATE TABLE
select * from test_table;
id
----
(0 rows)

Die Protokollausgabe ähnelt der folgenden für test1:

...
2019-06-26 14:51:12 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG:  
AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id
int);,<not logged>

2019-06-26 14:51:18 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG:  
AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not
logged>
...

Die Protokollausgabe ähnelt der folgenden für test2, nachdem dieselben Abfragen ausgeführt wurden:

...
2019-06-26 14:53:54 UTC:192.0.2.7(44772):test2@postgres:[5517]:LOG:  
AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id
int);,<not logged>
...

Hinweis: Es gibt keinen Auditeintrag für die Abfrage SELECT, da der Parameter pgaudit.log für test2 nur für DDL konfiguriert ist.

Verwenden der pgaudit-Erweiterung zur Prüfung von Tabellen

Die Konfiguration des Parameters pgaudit.log prüft und protokolliert Anweisungen, die sich auf eine bestimmte Relation auswirken. Nur die Befehle SELECT, INSERT, UPDATE und DELETE können von der pgaudit-Erweiterung protokolliert werden. TRUNCATE ist nicht in der Objektprüfungsprotokollierung enthalten. Wenn Sie der Rolle rds_pgaudit Zugriff auf einen Vorgang (wie SELECT, DELETE, INSERT oder UPDATE) für die Tabelle gewähren, die Sie prüfen möchten, protokolliert jede Gewährungsprüfung die entsprechende Anweisung. Das folgende Beispiel gewährt der Rolle rds_pgaudit Zugriff auf SELECT und DELETE, sodass alle SELECT- und DELETE-Anweisungen in test_table geprüft werden.

  1. Gewähren Sie der Rolle rds_pgaudit Zugriff auf SELECT und DELETE, indem Sie den folgenden Befehl ausführen.
grant select, delete on test_table to rds_pgaudit;
  1. Testen Sie, ob die Auditprotokollierung korrekt konfiguriert ist, indem Sie eine Anweisung DELETE für test_table ausführen:
Time: 0.008s
DELETE 1
>delete from test_table where pid=5050;

Die Ausgabe für die Anweisung DELETE ähnelt der folgenden:

2019-06-25 17:13:02
UTC:192.0.2.7(41810):postgresql104saz@postgresql104saz:[24976]:LOG:
AUDIT: OBJECT,3,1,WRITE,DELETE,TABLE,public.t1,delete from test_table where
pid=5050,<not logged>

Verwenden der pgaudit-Erweiterung zur Überprüfung von Spalten

Sie können das Auditing auch auf Spaltenebene für eine bestimmte Tabelle festlegen. Zum Beispiel, wenn sensible Daten nur in einer Spalte vorhanden sind. Im folgenden Beispielbefehl wird eine Gehaltsabrechnungstabelle erstellt, und die Tabelle hat eine vertrauliche Spalte, die Gehaltsdaten enthält, die geprüft werden müssen:

create table payroll
(    
    name text,
    salary text
);
  1. Gewähren Sie der Rolle rds_pgaudit Zugriff auf SELECT in der Gehaltsspalte, sodass jedes SELECT in dieser Spalte geprüft wird:
grant select (salary)  on payroll to rds_pgaudit;
  1. SELECT alle Spalten in der Tabelle, einschließlich der Gehaltsspalte:
select * from payroll;

In der folgenden Beispielausgabe wird jedes SELECT, das die Gehaltsspalte enthält, geprüft. Ein SELECT, das die Gehaltsspalte nicht enthält, wird jedoch nicht geprüft.

2019-06-25
 18:25:02
UTC:192.0.2.7(42056):postgresql104saz@postgresql104saz:[4118]:LOG:
AUDIT: OBJECT,2,1,READ,SELECT,TABLE,public.payroll,select * from
payroll,<not logged>

Ähnliche Informationen

Allgemeine DBA-Aufgaben für PostgreSQL