Quiero usar Amazon Relational Database Service (Amazon RDS) para que PostgreSQL ejecute una instrucción CREATE USER o ALTER USER. Cuando hago esto, PostgreSQL registra mi contraseña en texto sin cifrar en los archivos de registro.
Descripción corta
Puedes establecer el parámetro log_statement en ddl o en todos y, a continuación, ejecutar uno de los siguientes comandos:
- CREATE ROLE/USER ... WITH PASSWORD ... ;
- ALTER ROLE/USER ... WITH PASSWORD ... ;,
Cuando lo haces, PostgreSQL crea una entrada en los registros de PostgreSQL. PostgreSQL registra la contraseña en texto sin cifrar y puede provocar un posible riesgo de seguridad.
PostgreSQL no identifica la información confidencial. Este es el comportamiento esperado y está de acuerdo con el diseño del motor PostgreSQL.
En este ejemplo se ejecuta una instrucción CREATE ROLE con contraseña y, a continuación, se muestra la contraseña en los registros en texto sin cifrar:
USER@postgresdb:pg> CREATE ROLE test_role WITH PASSWORD 'test123';
CREATE ROLE
Time: 0.003s
Salida en los registros:
2020-04-15 14:57:29 UTC:x.x.x.x(42918):USER@pg:[13790]:LOG: statement: CREATE ROLE test_role WITH PASSWORD 'test123'
En este ejemplo se ejecuta una instrucción ALTER ROLE con contraseña y, a continuación, se muestra la contraseña en los registros en texto sin cifrar:
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
Salida en los registros:
2020-04-15 14:59:45 UTC:x.x.x.x(42918):USER@pg:[13790]:STATEMENT: ALTER ROLE test_role SET PASSWORD 'test'
Resolución
Uso del complemento pgaudit
Usa la extensión pgaudit para borrar tu contraseña de los registros de PostgreSQL.
- Activa pgaudit para tu instancia de Amazon RDS para PostgreSQL.
- En el grupo de parámetros personalizado, define el parámetro pgaudit.log para especificar la clase de instrucción que deseas registrar. Este parámetro toma varios valores, como DDL, role, write y read.
Nota: La principal diferencia entre pgaudit.log='DDL' y log_statement='DDL' es que pgaudit, DDL no registra ninguna consulta CREATE/ALTER ROLE en los registros de postgres.
Agrega ROLE a pgaudit.log para registrar CREATE/ALTER ROLE. Esto borra tu contraseña.
Salida en registros:
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>
Establecimiento de log_statement en «none» a nivel de sesión dentro de un bloque de transacciones
Para evitar que PostgreSQL registre la operación por completo, define el parámetro log_statement en none a nivel de sesión dentro de un bloque de transacciones.
Nota: Si tanto pgaudit.log como log_statement están configurados en DDL, log_statement debe configurarse como none a nivel de sesión.
Ejemplo:
BEGIN;SET LOCAL log_statement = 'none';
ALTER ROLE ... WITH PASSWORD ...;
COMMIT;
Creación de un hash de contraseña de forma local
Crea el hash de tu contraseña localmente y, a continuación, utilízalo cuando crees o modifiques la contraseña del rol o del usuario.
Nota: El hash que creas y usas para ejecutar la instrucción sigue visible en los registros. Puedes descifrarlo, pero no está registrado en texto sin cifrar.
Ejemplo:
[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
Salida en los registros:
2020-04-15 15:12:08 UTC:x.x.x.x(42918):grysa@pg:[13790]:LOG: statement: CREATE ROLE test_1 WITH PASSWORD 'md574e183386ccb9039d0537aeb03c03db9'
Uso del comando \password
Cuando usas PostgreSQL, puedes usar la función \password integrada en el cliente PostgreSQL. Al crear o modificar una contraseña de rol existente, se te solicitará una contraseña nueva. PostgreSQL registra solo el hash de la contraseña.
Nota: Esta solución también muestra el hash de la contraseña en los registros de postgres, pero no lo registra en texto sin cifrar.
Para usar la función**\password**, ejecuta el siguiente comando:
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=>
Salida en registros:
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;
Información relacionada
Archivos de registro de bases de datos de Amazon RDS para PostgreSQL
Uso de registros de Amazon RDS y la edición de Amazon Aurora compatible con PostgreSQL: parte 1
¿Cómo uso la extensión pgaudit para auditar mi instancia de base de datos de Amazon RDS que está ejecutando PostgreSQL?