Comment puis-je empêcher Amazon RDS pour PostgreSQL d'enregistrer mes mots de passe en texte clair dans les fichiers journaux ?

Lecture de 4 minute(s)
0

Je souhaite utiliser Amazon Relational Database Service (Amazon RDS) pour PostgreSQL afin d'exécuter une instruction CREATE USER ou ALTER USER. Lorsque je fais cela, PostgreSQL enregistre mon mot de passe en texte clair dans les fichiers journaux.

Brève description

Vous pouvez définir le paramètre log_statement sur ddl ou all, puis exécuter l'une des commandes suivantes :

  • CRÉER UN RÔLE/UN UTILISATEUR... AVEC MOT DE PASSE... ;
  • MODIFIER LE RÔLE/L'UTILISATEUR... AVEC MOT DE PASSE... ;,

Lorsque vous le faites, PostgreSQL crée une entrée dans les journaux PostgreSQL. PostgreSQL enregistre le mot de passe en texte clair et peut entraîner un risque de sécurité potentiel.

PostgreSQL n'identifie pas les informations sensibles. Ce comportement est attendu et est conforme à la conception du moteur PostgreSQL.

Cet exemple exécute une instruction CREATE ROLE avec un mot de passe, puis affiche le mot de passe dans les journaux en texte clair :

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

Résultat 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 un mot de passe, puis affiche le mot de passe dans les journaux en texte clair :

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

Résultat 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'

Résolution

Utiliser le plugin pgaudit

Utilisez l'extension pgaudit pour supprimer votre mot de passe des journaux de PostgreSQL.

  1. Activez pgaudit pour votre instance Amazon RDS pour PostgreSQL.
  2. Dans votre groupe de paramètres personnalisé, définissez le paramètre pgaudit.log pour spécifier la classe d'instructions que vous souhaitez enregistrer. Ce paramètre prend plusieurs valeurs, telles que 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.

Ajoutez ROLE au fichier pgaudit.log pour enregistrer CREATE/ALTER ROLE. Cela permet de supprimer 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éfinissez log_statement sur « aucun » au niveau de la session dans un bloc de transactions

Pour empêcher PostgreSQL d'enregistrer complètement l'opération, définissez le paramètre log_statement sur aucun au niveau de la session dans un bloc de transaction.

Remarque : Lorsque pgaudit.log et log_statement sont définis sur DDL, log_statement doit être défini sur aucun 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 localement

Créez le hachage de votre mot de passe localement, puis utilisez-le lorsque vous créez ou modifiez le rôle ou le 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 enregistré 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

Résultat 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'

Utilisez la commande \password

Lorsque vous utilisez PostgreSQL, vous pouvez utiliser la fonction \password intégrée au client PostgreSQL. Cela 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 du mot de passe dans les journaux de Postgres, mais ne l'enregistre pas en texte clair.

Pour utiliser la fonction \password, 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;

Informations connexes

Fichiers journaux de base de données RDS for PostgreSQL

Utilisation des journaux des éditions compatibles avec Amazon RDS et Amazon Aurora PostgreSQL : Partie 1

Comment utiliser l'extension pgaudit pour auditer mon instance de base de données Amazon RDS qui exécute PostgreSQL ?