SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 14 de enero de 2010

Como recuperar contraseña postgres

Introducción
Puede que se nos <olvide> la contraseña de Super Usuario de PostgreSQL <postgres> y no seamos capaces de realizar ninguna operación sobre ella. Esto que parece un serio problema no será tanto si cumplimos los siguientes requisitos:
  • Tener acceso a la máquina que tiene instalado el servidor <por ssh, físico, etc ..>
  • Tener acceso con el usuario que ejecuta el servidor PostgreSQL <normalmente postgres>
Si tenemos estos requistos, será coser y cantar, sino, será un poco más complicado.

Asumiendo que los tenemos, y ya estamos conectados a la máquina que tiene el servidor con el usuario que la ejecuta, primero debemos editar el archivo de configuración <$PGDATA/pg_hba.conf> y permitir el acceso local sin contraseña, es decir, trust. Para ello, buscaremos la entrada -si la tenemos-
#"local" is for Unix domain socket connections only
local   all         all                               md5
Y la sustituiremos por
# "local" is for Unix domain socket connections only
local   all         all                               trust
Guardaremos y saldremos del editor. A continuación, deberemos llamar a postgres para que vuelva a leer los archivos de configuración, para ello utilizaremos el comando <pg_ctl> con la opción <reload>
$ pg_ctl reload
se ha enviado una señal al servidor
Ahora, nos conectaremos a postgres utilizando el comando <psql> y podremos cambiar la contraseña, utilizando la instrucción SQL <ALTER USER nombre WITH PASSWORD 'password';>
$ psql
psql (8.4.2)
Digite «help» para obtener ayuda.

postgres=# ALTER USER postgres WITH PASSWORD 'nueva_pass';
ALTER ROLE
postgres=# \q
Por último, sólo nos queda revertir el cambio en el archivo <$PGDATA/pg_hba.conf> y llamar a <pg_ctl> para que vuelva a leer la configuración.
$ vi /var/postgres/8.4/data/pg_hba.conf
    # "local" is for Unix domain socket connections only
    local   all         all                               md5

:wq
$ pg_ctl reload
se ha enviado una señal al servidor
$ psql
Contraseña:
psql (8.4.2)
Digite «help» para obtener ayuda.

postgres=# \q
Conclusión
Como podéis ver, si tenemos acceso a la máquina la tarea resulta realmente sencilla. Si no fuese así, el tema se complica y no es en este post cómo explicarlo.

Referencias

6 comentarios:

  1. Perdona pero eso no es recuperar una contraseña, es reestablecerla. Y hay veces en las que realmente resultaría útil poder recuperarla, por ejemplo cuando hay más sistemas interconectados con esa base de datos y ese usuario y resulta inviable hacer un cambio de clave por no tener acceso a dichos sistemas.

    ResponderEliminar
    Respuestas
    1. Hola anónimo,

      Si, es cierto, es "restablecer la contraseña" de PostgreSQL en vez de "recuperarla". El problema es que no es posible saber cual es la contraseña que había antes en formato "texto plano".

      Pero, como bien dices, tal vez debería ser el título "restablecer contraseña de postgres"

      Un Saludo y gracias por la info

      Eliminar
  2. Hola Urko,

    Logré restablecer la contraseña del super usuario de postgres de mi servidor. Se me olvidó la que puse durante la instalación, y estaba pasando por un gran aprieto. Gracias por compartir lo que sabes. Te agradecemos mucho,

    El Tim Cuba.

    ResponderEliminar
    Respuestas
    1. Hola,

      Me alegro que te ayudase! Lo cierto, es que yo creo que debemos compartir lo que sabemos "con todos", así también aprendemos "todos".

      Un Saludo,
      Urko

      Eliminar
  3. Mil gracias! Solo me surgió un problema a la hora de ejecutar el comando psql, pero encontré la solución aqui:

    http://stackoverflow.com/questions/11919391/postgresql-error-fatal-role-username-does-not-exist

    ResponderEliminar