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 attendu et est conforme à la conception 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'
Résolution
Utiliser le plugin PGAudit
Utilisez l'extension pgaudit pour éditer votre mot de passe à partir des journaux PostgreSQL.
- Activez pgaudit pour votre instance Amazon RDS PostgreSQL.
- 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;
Informations connexes
Fichiers journaux de bases de données PostgreSQL
Utilisation des journaux RDS et Aurora PostgreSQL
PGAudit pour RDS PostgreSQL