Saltar al contenido

¿Cómo puedo evitar que Amazon RDS para PostgreSQL registre mis contraseñas en texto sin cifrar en los archivos de registro?

4 minutos de lectura
0

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.

  1. Activa pgaudit para tu instancia de Amazon RDS para PostgreSQL.
  2. 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?

OFICIAL DE AWSActualizada hace 3 años