Error al obtener: La autenticación de pares falló para el usuario "postgres", cuando intentaba hacer que pgsql funcionara con rieles


738

Me sale el error:

FATAL: Peer authentication failed for user "postgres"

cuando trato de hacer que postgres funcione con Rails.

Aquí está mi pg_hba.conf, mi database.ymly un volcado de la traza completa .

Cambié la autenticación a md5 en pg_hba e intenté diferentes cosas, pero ninguna parece funcionar.

También intenté crear un nuevo usuario y una base de datos según Rails 3.2, FATAL: La autenticación de pares falló para el usuario (PG :: Error)

Pero no aparecen en pgadmin o incluso cuando corro sudo -u postgres psql -l.

¿Alguna idea de a dónde me estoy yendo mal?


1
1): Asegúrese de tener un usuario llamado "postgres" creado y con derecho en su Base de datos 2): Asegúrese de que tenga una contraseña 3): Asegúrese de que su config / database.yml contenga las credenciales de derechos (nombre de usuario + contraseña)
MrYoshiji

2
necesita un par y una sangría en todos los lugares establecidos en md5
Artem.Borysov

13
Consulte también esta respuesta : la conexión puede fallar localhostpero puede tener éxito 127.0.0.1.
uvsmtid

99
En mi caso, necesitaba agregar host: localhostel database.ymlarchivo.
Mihail Velikov

Respuestas:


1028

El problema sigue siendo su pg_hba.confarchivo ( /etc/postgresql/9.1/main/pg_hba.conf*).

Esta línea:

local   all             postgres                                peer

Debiera ser:

local   all             postgres                                md5

* Si no puede encontrar este archivo, la ejecución locate pg_hba.confdebería mostrarle dónde está el archivo.

Después de modificar este archivo, no olvide reiniciar su servidor PostgreSQL. Si estás en Linux, eso sería sudo service postgresql restart.

Estas son breves descripciones de ambas opciones de acuerdo con los documentos oficiales de PostgreSQL sobre métodos de autenticación .

Autenticación entre pares

El método de autenticación de pares funciona obteniendo el nombre de usuario del sistema operativo del cliente del núcleo y usándolo como el nombre de usuario permitido de la base de datos (con asignación de nombre de usuario opcional). Este método solo es compatible con conexiones locales.

Autenticación de contraseña

Los métodos de autenticación basados ​​en contraseña son md5 y contraseña. Estos métodos funcionan de manera similar, excepto por la forma en que se envía la contraseña a través de la conexión, es decir, hash MD5 y texto sin cifrar respectivamente.

Si le preocupan los ataques de "olfateo" de contraseñas, entonces se prefiere md5. La contraseña simple siempre debe evitarse si es posible. Sin embargo, md5 no se puede usar con la función db_user_namespace. Si la conexión está protegida por encriptación SSL, la contraseña se puede usar de forma segura (aunque la autenticación de certificado SSL podría ser una mejor opción si se depende de usar SSL).

Ubicación de muestra para pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Deberá volver a cargar su servicio postgresql después de cambiar esto/etc/init.d/postgresql reload
funkotron

78
poniendo esto aquí ya que siempre olvido dónde está este archivo/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron Al menos en mi instalación de ElementaryOS (Ubuntu), sudo service postgreql restarttambién funciona.
Marnen Laibow-Koser

13
Para responder a mi propia pregunta: la autenticación 'peer' significa que postgres le pide al sistema operativo su nombre de inicio de sesión y lo usa para la autenticación, por lo que el usuario en el sistema operativo y en postgres debe ser el mismo. 'md5' usa autenticación de contraseña encriptada.
Dennis

99
Entiendo el cambio. Pero, ¿por qué no es este el comportamiento predeterminado? ¿Hay algún inconveniente con md5?
Victor Marconi

364

Después de instalar Postgresql hice los siguientes pasos.

  1. abra el archivo pg_hba.confpara Ubuntu en el que estará /etc/postgresql/9.x/mainy cambie esta línea:

    local todos los pares de postgres

    a

    confianza local de todos los postgres
  2. Reiniciar el servidor

    $ sudo service postgresql restart
  3. Inicie sesión en psql y configure su contraseña

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Finalmente cambiar el pg_hba.confde

    confianza local de todos los postgres

    a

    local todos los postgres md5

Después de reiniciar el servidor postgresql, puede acceder a él con su propia contraseña

Detalles de los métodos de autenticación:

confianza: cualquiera que pueda conectarse al servidor está autorizado para acceder a la base de datos

par: utilice el nombre de usuario del sistema operativo del cliente como nombre de usuario de la base de datos para acceder a él.

md5: autenticación basada en contraseña

para mayor referencia ver aquí


18
cambiar el método a "confianza" funcionó para mí. +1 para la explicación de los detalles del método de autenticación.
La-comadreja

44
En OS X homebrew, el valor predeterminado es confianza, mientras que en Ubuntu, de alguna manera, el valor predeterminado es "par", lo que generó discrepancias entre mi configuración y la de mi colega. Cambiamos el suyo a MD5, lo que no ayudó, por lo que "confianza" es la verdadera respuesta aquí (solo estamos haciendo pruebas de desarrollo). Debería obtener más votos a favor.
xji

2
también puedes configurar md5 en todas partes desde el principio
Artem.Borysov

2
Esta manera me está funcionando, usando el método md5 primero no.
sianipard

¿Necesitas usar las mismas contraseñas? sudo passwd postgres
Peter Krauss

213

Si se conecta a través de localhost (127.0.0.1) no debería experimentar ese problema en particular. No muckearía mucho con el pg_hba.conf, sino que ajustaría su cadena de conexión:

psql -U someuser -h 127.0.0.1 database

donde alguien es su usuario al que se está conectando y la base de datos es la base de datos a la que su usuario tiene permiso para conectarse.

Esto es lo que hago en Debian para configurar postgres:

http://www.postgresql.org/download/linux/debian/  (Wheezy 7.x)

as root 

    root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list

    root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

    root@www0:~# apt-get update

    root@www0:~# apt-get install postgresql-9.4        

    root@www0:~# su - postgres 

    postgres@www0:~$ createuser --interactive -P someuser
    Enter password for new role:
    Enter it again:
    Shall the new role be a superuser? (y/n) n
    Shall the new role be allowed to create databases? (y/n) y
    Shall the new role be allowed to create more new roles? (y/n) n

    postgres@www0:~$ createdb -O someuser database

    postgres@www0:~$ psql -U someuser -h 127.0.0.1 database

¡Disfrutar!


16
Creo que esta es la mejor solución, ya que en realidad resuelve el problema local sin alterar la configuración global, como recomiendan las otras respuestas.
jeteon

1
Tuve que cambiar host: 127.0.0.1de predeterminado a localhost en config / database.yml - está en la misma máquina, así que no entiendo por qué
Anthony

Anthony, ¿estás diciendo que experimentaste una falla de conexión hasta que ajustaste localhost a 127.0.0.1 en tu database.yml? Sugiero verificar su archivo / etc / hosts si ese es el caso. De lo contrario, puede haber alguna otra rareza relacionada con la resolución de localhost.
StylusEater

1
Esto es mucho más elegante en comparación con el método de autenticación de pares locales.
mdh

1
Esta es, de lejos, la mejor solución de la OMI
Salil Junior

45

¡Esto ha funcionado para mí!

sudo -u postgres psql

Esto debería funcionar bien siempre y cuando su usuario conectado actualmente esté en el archivo sudoers.
Abubacker Siddik

16

Si tiene un problema, necesita localizarlo pg_hba.conf. El comando es:

find / -name 'pg_hba.conf' 2>/dev/null

y luego cambia el archivo de configuración:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

El siguiente paso es: reiniciar su instancia de db:

service postgresql-9.3 restart

Si tiene algún problema, debe configurar la contraseña nuevamente:

ALTER USER db_user with password 'db_password';


16
  1. Vaya a este /etc/postgresql/9.x/main/ y abra el archivo pg_hba.conf

En mi caso:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Reemplazar par con md5

Entonces esto se cambiará a:

Inicio de sesión administrativo de base de datos por socket de dominio Unix local todos los pares de postgres

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

Esta:

Inicio de sesión administrativo de base de datos por socket de dominio Unix local todos los postgres md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
  1. Luego reinicie el servidor pg:

    $> sudo service postgresql restart

A continuación se muestra una lista de MÉTODOS utilizados para conectarse con postgres:

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

Nota: Si aún no ha creado su usuario de postgres. Cree eso y ahora puede acceder al servidor postgres utilizando las credenciales de ese usuario.

CONSEJO: Si no funciona después de reiniciar Postgres, cierre la terminal y ábrala nuevamente.


15
sudo psql --host=localhost --dbname=database-name --username=postgres

Esto resolvió mi problema


3
No pensé que sería así de simple, pero esto funcionó para mí en Debian 9
Hayden Thring

Esto está funcionando en Ubuntu 19.10
Vithal Reddy

Gracias, está funcionando en Ubuntu 19.10 y psql 12.3
Happy Singh

10

Yo tuve el mismo problema.

La solución de depa es absolutamente correcta.

Solo asegúrese de tener un usuario configurado para usar PostgreSQL.

Revisa el archivo:

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l

El permiso de este archivo debe otorgarse al usuario con el que haya registrado su psql.

Más lejos. Si eres bueno hasta ahora ...

Actualice según las instrucciones de @ depa.

es decir

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

y luego hacer cambios.


Estoy enfrentando el mismo problema. Pero qué permisos necesito no lo sé. me puedes ayudar. Estoy obteniendo la salida para el comando 'ls' es-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
dom

8

Si desea mantener la configuración predeterminada pero desea la autenticación md5 con conexión de socket para una conexión de usuario / base de datos específica, agregue una línea "local" ANTES de la línea "local todos / todos":

# TYPE  DATABASE     USER         ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   username     dbname                           md5  # <-- this line
local   all          all                              peer
# IPv4 local connections:
host    all          all          127.0.0.1/32        ident
# IPv6 local connections:
host    all          all          ::1/128             ident

El "ANTES" en esta respuesta merece más elaboración en otras respuestas. Resulta que psql examina los registros en el archivo pg_hba.conf secuencialmente como se indica en los documentos: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# TIPO BASE DE DATOS MÉTODO DE DIRECCIÓN DE USUARIO nombre de usuario local dbname md5 # <- esta línea No está en orden
Kiry Meas

7

Estaba moviendo el directorio de datos en un servidor clonado y tenía problemas para iniciar sesión como postgres. Restablecer la contraseña de postgres como esta funcionó para mí.

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#

6

Las ediciones anteriores funcionaron para mí, después de que descubrí que necesitaba reiniciar el servidor postgres después de hacerlas. Para ubuntu:

sudo /etc/init.d/postgresql restart

6

Cambiar el método de pares de confianza en pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | línea 85) resuelve el problema. Agregar md5 solicita una contraseña, por lo tanto, si hay un requisito para evitar el uso de contraseñas, use la confianza en lugar de md5 .


6

Uso host=localhosten conexión.

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);

5

el siguiente comando funciona para mí:

psql -d myDb -U username -W

man psql-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
Yaroslav Nikitenko

3

Solo necesita configurar METHOD para confiar.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

Y vuelva a cargar el servidor postgres.

# service postgresql-9.5 reload

Los cambios en pg_hba.conf no requieren el servidor RESTART postgres. solo RELOAD.


3

Muchas de las otras respuestas pertenecen a la configuración en los diversos archivos de configuración, y las que pertenecen a la pg_hba.confaplicación se aplican y son 100% correctas. Sin embargo, asegúrese de modificar los archivos de configuración correctos .

Como otros han mencionado, las ubicaciones del archivo de configuración se pueden anular con varias configuraciones dentro del archivo de configuración principal, así como proporcionar una ruta al archivo de configuración principal en la línea de comando con la -Dopción.

Puede usar el siguiente comando mientras está en una sesión de psql para mostrar dónde se están leyendo sus archivos de configuración (suponiendo que pueda iniciar psql). Este es solo un paso de solución de problemas que puede ayudar a algunas personas:

select * from pg_settings where setting~'pgsql';  

También debe asegurarse de que el directorio de inicio para su usuario de postgres esté donde espera que esté. Digo esto porque es bastante fácil pasar por alto esto debido al hecho de que su mensaje mostrará ' ~' en lugar de la ruta real de su directorio de inicio, por lo que no es tan obvio. Muchas instalaciones predeterminan el directorio de inicio del usuario postgres a/var/lib/pgsql .

Si no está configurado a lo que se supone que es, detenga el servicio postgresql y use el siguiente comando mientras está conectado como root. También asegúrese de que el usuario de postgres no haya iniciado sesión en otra sesión:

usermod -d /path/pgsql postgres

Finalmente, asegúrese de que su variable PGDATA esté configurada correctamente escribiendo echo $PGDATA, que debería generar algo similar a:

/path/pgsql/data

Si no está configurado o muestra algo diferente de lo que espera que sea, examine sus archivos de inicio o RC como .profile o .bash.rc; esto variará mucho dependiendo de su sistema operativo y su shell. Una vez que haya determinado la secuencia de comandos de inicio correcta para su máquina, puede insertar lo siguiente:

export PGDATA=/path/pgsql/data

Para mi sistema, coloqué esto en /etc/profile.d/profile.local.sh para que fuera accesible para todos los usuarios.

¡Ahora debería poder iniciar la base de datos como de costumbre y todas las configuraciones de ruta psql deberían ser correctas!


3

pg_config es para información de compilación, para ayudar a extensiones y programas de clientes a compilar y vincular contra PostgreSQL. No sabe nada sobre las instancias activas de PostgreSQL en la máquina, solo los binarios.

pg_hba.conf puede aparecer en muchos otros lugares dependiendo de cómo se instaló Pg. La ubicación estándar es pg_hba.conf dentro del directorio de datos de la base de datos (que podría estar en / home, / var / lib / pgsql, / var / lib / postgresql / [versión] /, / opt / postgres /, etc., etc.) pero los usuarios y empaquetadores pueden ponerlo donde quieran. Desafortunadamente.

Las únicas formas válidas de encontrar pg_hba.conf es preguntarle a una instancia de PostgreSQL en ejecución dónde está pg_hba.conf, o preguntarle al administrador del sistema dónde está. Ni siquiera puede confiar en preguntar dónde está el datadir y analizar postgresql.conf porque un script de inicio podría pasar un parámetro como -c hba_file = / some / other / path al iniciar Pg.

Lo que quieres hacer es preguntarle a PostgreSQL:

SHOW hba_file;

Este comando debe ejecutarse en una sesión de superusuario, por lo que para las secuencias de comandos de shell puede escribir algo como:

psql -t -P format=unaligned -c 'show hba_file';

y configure las variables de entorno PGUSER, PGDATABASE, etc. para garantizar que la conexión sea correcta.

Sí, este es un problema de huevo y gallina, ya que si el usuario no puede conectarse (por ejemplo, después de arruinar la edición de pg_hba.conf) no puede encontrar pg_hba.conf para solucionarlo.

Otra opción es mirar la salida del comando ps y ver si el argumento del directorio de datos postmaster -D está visible allí, por ejemplo

ps aux  | grep 'postgres *-D'

dado que pg_hba.conf estará dentro del directorio de datos (a menos que esté en Debian / Ubuntu o alguna derivada y esté usando sus paquetes).

Si está apuntando específicamente a sistemas Ubuntu con PostgreSQL instalado desde paquetes Debian / Ubuntu, se vuelve un poco más fácil. No tiene que lidiar con una Pg compilada a mano desde la fuente para la que alguien ha iniciado un datadir en su directorio de inicio, o una instalación de EnterpriseDB Pg en / opt, etc. Puede preguntarle a pg_wrapper, Debian / Ubuntu multi -version Pg manager, donde PostgreSQL está usando el comando pg_lsclusters de pg_wrapper.

Si no puede conectarse (Pg no se está ejecutando, o necesita editar pg_hba.conf para conectarse), tendrá que buscar en el sistema archivos pg_hba.conf. En Mac y Linux, algo como sudo find / -type f -name pg_hba.conf servirá. Luego verifique el archivo PG_VERSION en el mismo directorio para asegurarse de que sea la versión correcta de PostgreSQL si tiene más de uno. (Si pg_hba.conf está en / etc /, ignore esto, es el nombre del directorio principal). Si tiene más de un directorio de datos para la misma versión de PostgreSQL, tendrá que mirar el tamaño de la base de datos, verifique la línea de comando de los postgres en ejecución desde ps para ver si el argumento del directorio de datos -D coincide con el lugar donde está editando, etc. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Mi problema fue que no escribí ningún servidor. Pensé que es un valor predeterminado debido al marcador de posición, pero cuando escribí localhost funcionó.


2

Si está intentando localizar este archivo en Cloud 9, puede hacerlo

sudo vim /var/lib/pgsql9/data/pg_hba.conf

Presione Ipara editar / insertar, presione ESC3 veces y escriba :wqguardará el archivo y saldrá


2

Si se enfrenta a este problema con los rieles y sabe que ya ha creado ese nombre de usuario con contraseña junto con los derechos correctos, solo tiene que poner los siguientes al final de su archivo database.yml.

host: localhost

el archivo general se verá a continuación

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

No necesita tocar su pg_hba.confarchivo en absoluto. Codificación feliz


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.