Direkt zum Inhalt

Wie kann ich verhindern, dass Amazon RDS für PostgreSQL meine Passwörter in Klartext in den Protokolldateien protokolliert?

Lesedauer: 4 Minute
0

Ich möchte Amazon Relational Database Service (Amazon RDS) für PostgreSQL verwenden, um die Anweisung CREATE USER oder ALTER USER auszuführen. Wenn ich das mache, protokolliert PostgreSQL mein Passwort in Klartext in den Protokolldateien.

Kurzbeschreibung

Du kannst den Parameter log_statement auf ddl oder Alles setzen und dann einen der folgenden Befehle ausführen:

  • CREATE ROLE/USER ... WITH PASSWORD ... ;
  • ALTER ROLE/USER ... WITH PASSWORD ... ;,

Wenn du dies tust, erstellt PostgreSQL einen Eintrag in den PostgreSQL-Protokollen. PostgreSQL protokolliert das Passwort in Klartext und kann ein potenzielles Sicherheitsrisiko schaffen.

PostgreSQL identifiziert keine vertraulichen Informationen. Dies ist ein erwartetes Verhalten und entspricht dem Design der PostgreSQL-Engine.

In diesem Beispiel wird eine CREATE ROLE-Anweisung mit einem Passwort ausgeführt und das Passwort dann in den Protokollen in Klartext angezeigt:

USER@postgresdb:pg> CREATE ROLE test_role WITH PASSWORD 'test123';
CREATE ROLE
Time: 0.003s

Ausgabe in den Protokollen:

2020-04-15 14:57:29 UTC:x.x.x.x(42918):USER@pg:[13790]:LOG: statement: CREATE ROLE test_role WITH PASSWORD 'test123'

In diesem Beispiel wird eine ALTER ROLE-Anweisung mit einem Passwort ausgeführt und das Passwort dann in den Protokollen in Klartext angezeigt:

USER@postgresdb:pg> ALTER ROLE test_role WITH PASSWORD 'test';
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
ALTER ROLE
Time: 0.004s

Ausgabe in den Protokollen:

2020-04-15 14:59:45 UTC:x.x.x.x(42918):USER@pg:[13790]:STATEMENT: ALTER ROLE test_role SET PASSWORD 'test'

Lösung

Das pgaudit-Plug-in verwenden

Verwende die Erweiterung pgaudit, um dein Passwort in den PostgreSQL-Protokollen zu anonymisieren.

  1. Aktiviere pgaudit für deine Instance in Amazon RDS für PostgreSQL.
  2. Lege in der benutzerdefinierten Parametergruppe den Parameter pgaudit.log fest, um die Anweisungsklasse anzugeben, die du protokollieren möchtest. Dieser Parameter akzeptiert mehrere Werte wie DDL, role, write und read.

Hinweis: Der Hauptunterschied zwischen pgaudit.log='DDL' und log_statement='DDL' besteht darin, dass pgaudit, DDL keine CREATE/ALTER ROLE-Abfragen in Postgres-Protokollen aufzeichnet.

Füge ROLE zu pgaudit.log hinzu, um CREATE/ALTER ROLE zu protokollieren. Dadurch wird das Passwort anonymisiert.

Ausgabe in Protokollen:

2020-07-09 13:33:50 UTC:x.x.x.x(58670):grysa@pg:[26513]:LOG:  AUDIT: SESSION,3,1,ROLE,CREATE ROLE,,,CREATE ROLE test_role WITH LOGIN
PASSWORD <REDACTED>,<not logged>

log_statement auf Sitzungsebene innerhalb eines Transaktionsblocks auf „none“ (keine) setzen

Um zu verhindern, dass PostgreSQL den Vorgang vollständig aufzeichnet, setze den Parameter log_statement auf Sitzungsebene innerhalb eines Transaktionsblocks auf none.

Hinweis: Wenn sowohl pgaudit.log als auch log_statement auf DDL gesetzt sind, muss log_statement auf Sitzungsebene auf none gesetzt werden.

Beispiel:

BEGIN;SET LOCAL log_statement = 'none';
ALTER ROLE ... WITH PASSWORD ...;
COMMIT;

Passwort-Hash lokal erstellen

Erstelle den Passwort-Hash lokal und verwende den Hash dann, wenn du das Rollen- oder Benutzerpasswort erstellst oder änderst.

Hinweis: Der Hash, den du erstellst und verwendest, um deine Anweisung auszuführen, ist weiterhin in den Protokollen sichtbar. Du kannst diesen entschlüsseln, aber er ist nicht in Klartext protokolliert.

Beispiel:

[ec2-user@ip-x.x.x.x ~]$ username='test_1'; dbpass='test123'; echo -n "${dbpass}${username}" | md5sum | awk '{print "md5" $1}'md574e183386ccb9039d0537aeb03c03db9

USER@postgresdb:pg> CREATE ROLE test_1 WITH PASSWORD 'md574e183386ccb9039d0537aeb03c03db9';
CREATE ROLE
Time: 0.003s

Ausgabe in den Protokollen:

2020-04-15 15:12:08 UTC:x.x.x.x(42918):grysa@pg:[13790]:LOG: statement: CREATE ROLE test_1 WITH PASSWORD 'md574e183386ccb9039d0537aeb03c03db9'

Den Befehl \password verwenden

Wenn du PostgreSQL verwendest, kannst du die im PostgreSQL-Client integrierte Funktion**\password** verwenden. Dadurch wirst du zur Eingabe eines neuen Passworts aufgefordert, wenn du ein vorhandenes Rollenpasswort erstellst oder änderst. Das PostgreSQL protokolliert nur den Hash für das Passwort.

Hinweis: Diese Lösung zeigt auch den Passwort-Hash in den Postgres-Protokollen an, protokolliert ihn jedoch nicht in Klartext.

Führe den folgenden Befehl aus, um die Funktion \password zu verwenden:

pg=> CREATE ROLE test_role NOLOGIN;CREATE ROLE
pg=> \password test_role
Enter new password:
Enter it again:
pg=> ALTER ROLE test_role LOGIN;
ALTER ROLE
pg=>

Ausgabe in Protokollen:

2020-04-09 12:29:29 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: CREATE ROLE test_role NOLOGIN;
2020-04-09 12:30:02 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: show password_encryption
2020-04-09 12:30:02 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: ALTER USER test_role PASSWORD 'md5175cad7c36a640b1fcfa0144056923f5'
2020-04-09 12:30:30 UTC:x.x.x.x(39876):grysa@pg:[1879]:LOG: statement: ALTER ROLE test_role LOGIN;

Ähnliche Informationen

Datenbankprotokolldateien in Amazon RDS für PostgreSQL

Arbeiten mit Protokollen in Amazon RDS und Amazon Aurora PostgreSQL-Compatible Edition: Teil 1

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

AWS OFFICIALAktualisiert vor 3 Jahren