jueves, 26 de febrero de 2015

jueves, 19 de febrero de 2015

Resetear password de root en PostgreSQL

El archivo de configuración pg_hba.conf (hba: host-based authentication) mantiene la configuración de autenticación de los clientes por host al servidor postgresql. La ubicación del archivo puede depender del sistema operativo e inclusive de la versión de postgresql.
En un sistema ubuntu 9.04 y con la versión 8.4 de postgres se puede encontrar en:
/etc/postgresql/8.4/main/pg_hba.conf
Si no, es posible buscarlo con:
# locate pg_hba.conf
Cada registro del archivo tiene uno de los siguiente 7 formatos posibles:
local      database  user  auth-method  [auth-options]
host       database  user  CIDR-address  auth-method  [auth-options]
hostssl    database  user  CIDR-address  auth-method  [auth-options]
hostnossl  database  user  CIDR-address  auth-method  [auth-options]
host       database  user  IP-address  IP-mask  auth-method  [auth-options]
hostssl    database  user  IP-address  IP-mask  auth-method  [auth-options]
hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-options]
Si quisiéramos cambiar la password de superusuario (“postgres” por default) por que nos la olvidamos, la posibilidad de solucionarlo es aprovechar la funcionalidad de este archivo de configuración y más precisamente del campo “auth-method”, seteando al mismo como método “trust” (en español, “método de confianza”), el cual da vía libre de autenticación a los clientes que matcheen con el registro.
Una posibilidad entonces para acceder a la base de datos by-passeando la autentificación es editar la regla que nos matchea y cambiar el método de “md5” a “trust”. Otra posibilidad es agregar una nueva regla, lo que quizás sea más seguro porque podemos definir muy precisamente la dirección ip del host, base de datos y usuario de libre acceso.
Por ejemplo podemos agregar la siguiente regla:
host template1 postgres 127.0.0.1 255.255.255.0 trust
Con la línea anterior, al iniciar una conexión a la base de datos template1, con usuario postgres y desde el host local, va a autorizar la misma sin necesidad de ingresar la password.
NOTA: al agregar la línea en el archivo hay que tener en cuenta que postgres matchea con el primer registro que se adecúe  a los datos de la conexión y no continua chequeando los siguientes líneas.
  • Reiniciamos el servicio.
# /etc/init.d/postgresql-8.4 restart
  • Ahora, ya recargada la configuración y libre el paso para conectarnos a la base de datos, conectamos y cambiamos la password.
 $ psql -U postgres -h 127.0.0.1 template1
#template1> ALTER USER postgres with password 'ElNuevoPassword';
#template1>
  • En este punto ya está reseteada la contraseña del usuario, pero queda por volver atrás los cambios para que vuelva a requerirla, para lo que entonces, si habíamos agregado una nueva línea en el pg_hba.conf habría que eliminarla (o comentarla con #) o si solo editamos el método de autenticación de “md5” a “trust” en alguna linea habría que volverlo a “md5”. Por último reiniciamos nuevamente.
# /etc/init.d/postgresql-8.4 restart.
Y si nos conectamos ahora nuevamente con psql debería pedirlos la password.
$ psql -U postgres -h 127.0.0.1 template1
Contraseña para usuario postgres:
#template1>
#template1> \q