Comment empêcher Amazon RDS for PostgreSQL de consigner mes mots de passe en texte clair dans les fichiers journaux ?

Dernière mise à jour : 17/02/2021

Lorsque j'exécute une instruction CREATE USER ou ALTER USER à l'aide d'Amazon Relational Database Service (Amazon RDS) for PostgreSQL, le service enregistre mon mot de passe en texte clair dans les fichiers journaux. Comment puis-je l'en empêcher ?

Brève description

Lorsque vous définissez le paramètre log_statement sur ddl ou all et exécutez une commande CREATE ROLE/USER ... WITH PASSWORD ... ; ou ALTER ROLE/USER ... WITH PASSWORD ... ; PostgreSQL crée une entrée dans les journaux PostgreSQL. Il enregistre le mot de passe en texte clair dans ses fichiers journaux, ce qui peut entraîner un risque potentiel de sécurité.

Actuellement, PostgreSQL n'identifie pas les informations sensibles. Ce comportement est normal étant donné l'architecture du moteur PostgreSQL.

Dans l'exemple suivant, nous exécutons une instruction CREATE ROLE avec mot de passe, dont les caractères s'affichent alors en texte clair dans les journaux :

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

Sortie dans les journaux :

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

Cet exemple exécute une instruction ALTER ROLE avec mot de passe, ce qui a pour effet d'en afficher les caractères en texte clair dans les fichiers journaux :

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.004sOutput in the logs:

Sortie dans les journaux :

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

Solution

Utiliser le client PSQL avec la fonction de variable dynamique

Utilisez le client PSQL avec l'option -c pour transmettre la commande CREATE ROLE/AFTER ROLE. Vous pouvez également utiliser des variables dynamiques pour empêcher PostgreSQL de consigner le mot de passe dans les journaux. Voici un exemple :

[ec2-user@ip-x.x.x.x ~]$ psql --host=xxxxxxxxxxx.eu-west-1.rds.amazonaws.com --port=5432 --username=USER --dbname=pg -c "create user aaa with password ':pass'" -v pass=test123
Password for user USER:
CREATE ROLE

Sortie dans les journaux :

2020-04-08 15:19:32 UTC:x.x.x.x(32974):USER@pg:[5797]:LOG: statement: create user aaa with password ':pass'

Utiliser le plugin PGAudit

Utilisez l'extension pgaudit pour modifier votre mot de passe à partir des journaux PostgreSQL.

  1. Activez pgaudit pour votre instance Amazon RDS PostgreSQL.
  2. Dans votre groupe de paramètres client, utilisez le paramètre pgaudit.log pour spécifier la classe d'instruction que vous souhaitez enregistrer. Plusieurs valeurs sont acceptées, comme DDL, role, write et read.

Remarque : la principale différence entre pgaudit.log='DDL' et log_statement='DDL' est que pgaudit, DDL n'enregistre aucune requête CREATE/ALTER ROLE dans les journaux Postgres.

Vous pouvez enregistrer CREATE/ALTER ROLE en ajoutant ROLE à pgaudit.log afin d'éditer votre mot de passe.

Sortie dans les journaux :

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>

Définir log_statement sur none au niveau de la session à l'intérieur d'un bloc de transaction

Définissez le paramètre log_statement sur none au niveau de la session à l'intérieur d'un bloc de transaction pour empêcher PostgreSQL d'enregistrer entièrement l'opération.

Remarque : lorsque pgaudit.log et log_statement sont définis sur DDL, log_statement doit être défini sur none au niveau de la session.

Exemple :

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

Créer un hachage de mot de passe local

Créez votre hachage de mot de passe localement, puis utilisez le hachage lors de la création ou de la modification du rôle ou du mot de passe utilisateur.

Remarque : le hachage que vous créez et utilisez pour exécuter votre instruction est toujours visible dans les journaux. Vous pouvez le déchiffrer, mais il n'est pas journalisé en texte clair.

Exemple :

[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

Sortie dans les journaux :

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

Utiliser la commande \password

Le client PostgreSQL vous permet d'utiliser la fonction \password intégrée. Celle-ci vous invite à saisir un nouveau mot de passe lorsque vous créez ou modifiez un mot de passe de rôle existant. PostgreSQL enregistre uniquement le hachage du mot de passe.

Remarque : cette solution affiche également le hachage de mot de passe dans les journaux Postgres, mais ne le consigne pas en texte clair.

Exécutez la commande suivante :

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=>

Sortie dans les journaux :

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;

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?