Wie kann ich verhindern, dass Amazon RDS für PostgreSQL meine Passwörter in Klartext in den Protokolldateien protokolliert?
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.
- Aktiviere pgaudit für deine Instance in Amazon RDS für PostgreSQL.
- 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
- Themen
- Database
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 4 Jahren