psql: FATAL: Error de autenticación de pares para el usuario "dev"

198

cuando creo un nuevo usuario, pero no puede iniciar sesión en la base de datos.
Lo hago así:

postgres@Aspire:/home/XXX$ createuser dev
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) y

luego cree una base de datos:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

después de eso, intento psql -U dev -W test_developmentiniciar sesión, pero aparece el error:

psql: FATAL:  Peer authentication failed for user "dev"

Traté de resolver el problema pero fallé.

hsming
fuente
2
posible duplicado de la autenticación PG Peer fallida
Daniel Vérité
ahora, para que se le soliciten respuestas a las preguntas anteriores, debe agregar --interactiveal comando:createuser --interactive joe
user3791372 el

Respuestas:

310

Tratar:

psql -U user_name  -h 127.0.0.1 -d db_name

dónde

  • -U es el nombre de usuario de la base de datos
  • -h es el nombre de host / IP del servidor local, evitando así los sockets de dominio Unix
  • -d es el nombre de la base de datos para conectarse

Luego, Postgresql evalúa esto como una conexión de "red" en lugar de una conexión de socket de dominio Unix, por lo que no se evalúa como una conexión "local" como puede ver en pg_hba.conf:

local   all             all                                     peer
meyerson
fuente
15
Necesitaba (ver 9.4): psql -U nombre de usuario -h 127.0.0.1 -d db-name
Gregor
9
Qué herramienta tan irritante. el manual dice psql [option...] [dbname [username]], por lo que se podría pensar psql dbname usernamelo haría solo trabajo ..
djeikyb
2
Me funcionó a mi también. También creo que esta es una forma mucho más preferible que cambiar los archivos de configuración, especialmente cuando no tienes ni idea de lo que estás haciendo y solo sigues la respuesta SO para resolver tu problema.
borisano
1
Esto funcionó para mí, muchas gracias, aunque estoy investigando por qué era la solución correcta. sin embargo, en una configuración en otra máquina, iniciaría sesión como psql -U username -d database. así que supongo que la solución aceptada depende del caso.
Lazarus Rising
2
Buena respuesta. Estaba entrando desde la base de datos después de haber iniciado sesión como postgres y \c glossary john FATAL: Peer authentication failed for user "john"luego \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".funcionó.
mira el
215

Su conexión falló porque de manera predeterminada se psqlconecta a través de sockets UNIX mediante peerautenticación, que requiere que el usuario actual de UNIX tenga el mismo nombre de usuario que psql. Por lo tanto, tendrá que crear el usuario UNIX devy luego iniciar sesión como devo usarlo sudo -u dev psql test_developmentpara acceder a la base de datos (y nopsql debe solicitar una contraseña).

Si no puede o no desea crear el usuario UNIX, como si solo desea conectarse a su base de datos para consultas ad hoc , forzar una conexión de socket usando psql --host=localhost --dbname=test_development --username=dev(como lo señala la respuesta de @meyerson) resolverá su problema inmediato.

Pero si tiene la intención de forzar la autenticación de contraseña a través de sockets Unix en lugar del método de pares, intente cambiar la siguiente pg_hba.conflínea *:

de

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

a

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peersignifica que confiará en la identidad (autenticidad) del usuario de UNIX. Así que no solicito una contraseña.

  • md5significa que siempre pedirá una contraseña y la validará después de analizar MD5.

Por supuesto, también puede crear reglas más específicas para una base de datos o usuario específico, con algunos usuarios que tienen peery otros que requieren contraseñas.

Después de cambiar pg_hba.confsi PostgreSQL se está ejecutando, deberá volver a leer la configuración volviendo a cargar ( pg_ctl reload) o reiniciando ( sudo service postgresql restart).

* El archivo pg_hba.confprobablemente estará en/etc/postgresql/9.x/main/pg_hba.conf

Editado: Comentarios de @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What comentarios incorporados en la respuesta.

flaviodesousa
fuente
55
¿Cómo se permite peer AND md5 ? Cuando configuro md5, ¡ya no puedo iniciar sesión con el postgresusuario! Intenté agregar varias líneas y separar el método con comas, pero no funcionaron. Ok, encontré mgoldwasserla respuesta y funcionó. ¡Acabo de agregar otra línea para el usuario postgrescon el método peer!
Chloe
3
No se preocupe, puede configurar la autenticación de pares para usuarios específicos (por ejemplo, su nombre de usuario o postgres). Parece que las reglas específicas anulan las reglas generales
JavierIEH
1
En algunas distribuciones, el archivo también se puede encontrar aquí:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher
2
¿no puedes hacer esto sin reiniciar postgresql? ¿No puede simplemente especificar el método de autenticación en la tabla pg_user?
fccoelho
2
Puede recargar en lugar de reiniciar. Eso recarga la tabla pg_hba. Trabajó para mi.
Joanis
29

La autenticación por pares significa que postgres le pide al sistema operativo su nombre de inicio de sesión y lo utiliza para la autenticación. Para iniciar sesión como usuario "dev" con autenticación de pares en postgres, también debe ser el usuario "dev" en el sistema operativo.

Puede encontrar detalles de los métodos de autenticación en la documentación de Postgresql .

Sugerencia: Si ya no funciona ningún método de autenticación, desconecte el servidor de la red y use el método "confianza" para "localhost" (y verifique que no se pueda acceder a su servidor a través de la red mientras el método "confianza" está habilitado).

stefan.schwetschke
fuente
1
gracias por sus respuestas. pero aún así no funciona si cambio el devusuario del sistemaXXX
hsming
2
La respuesta de Stefan es correcta. Acabo de agregar un enlace, que será visible cuando se revise mi edición, a la documentación donde se explica cada uno de los métodos de autenticación.
dsh
25

Cuando especificas:

psql -U user

se conecta a través de UNIX Socket, que por defecto usa peerautenticación, a menos que se especifique lo pg_hba.confcontrario.

Puedes especificar:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

para obtener la conexión TCP / IP en la interfaz de bucle invertido (tanto IPv4 como IPv6) para el especificado databasey user.

Después de los cambios, debe reiniciar postgres o volver a cargar su configuración. Reinicie que debería funcionar en las distribuciones modernas basadas en RHEL / Debian:

service postgresql restart

La recarga debería funcionar de la siguiente manera:

pg_ctl reload

pero el comando puede diferir según la configuración de la RUTA; es posible que deba especificar la ruta absoluta, que puede ser diferente, dependiendo de la forma en que se instaló el postgres.

Entonces puedes usar:

psql -h localhost -U user -d database

para iniciar sesión con eso usera lo especificado a databasetravés de TCP / IP. md5significa contraseña cifrada, mientras que también puede especificar passwordcontraseñas de texto sin formato durante la autorización. Estas 2 opciones no deberían ser de gran importancia siempre que el servidor de la base de datos solo sea accesible localmente, sin acceso a la red.

Nota importante: el orden de definición en pg_hba.confcuestión: las reglas se leen de arriba a abajo, como iptables, por lo que probablemente desee agregar las reglas propuestas por encima de la regla:

host    all             all             127.0.0.1/32            ident
tymik
fuente
re la Nota importante: - el orden es importante +1
ojo de halcón
23

Si bien la respuesta de @ flaviodesousa funcionaría, también obliga a todos los usuarios (todos los demás) a ingresar una contraseña.

En algún momento tiene sentido mantener la autenticación de pares para todos los demás, pero hacer una excepción para un usuario del servicio. En ese caso, desearía agregar una línea a pg_hba.conf que se vea así:

local   all             some_batch_user                         md5

Recomiendo que agregue esta línea justo debajo de la línea de encabezado comentada:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Deberá reiniciar PostgreSQL utilizando

sudo service postgresql restart

Si está utilizando 9.3, su pg_hba.conf probablemente sea:

/etc/postgresql/9.3/main/pg_hba.conf

mgoldwasser
fuente
12

Esto funciona para mí cuando me encuentro con él:

sudo -u username psql
alangrah
fuente
sólo funciona si se crea un usuario nuevo en el sistema y en postgres - hsming sólo quiere conectarse a postgres con el usuario postgres de nueva creación, dev.
Kenneth
8

La solución más fácil:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;
Abel
fuente
6

Simplemente tuve que agregar -h localhost

VPaul
fuente
Mi problema fue usar postgres en una frambuesa. ^^^ funcionó para mí !! ¡Gracias!
tidydee
2

En mi caso estaba usando un puerto diferente. El valor predeterminado es 5432. Estaba usando 5433. Esto funcionó para mí:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
Ikrom
fuente
Esto puede ocurrir automáticamente cuando tiene más de una instalación de postgres.
Galigator
1

Para las personas en el futuro que vean esto, postgresestá en /usr/lib/postgresql/10/binmi servidor Ubuntu.

Lo agregué a la RUTA en mi archivo .bashrc y agregué esta línea al final

PATH=$PATH:/usr/lib/postgresql/10/bin

luego en la línea de comando

$> source ./.bashrc

Actualicé mi ambiente bash. Ahora puedo usar postgres -D /whereverdesde cualquier directorio

Tyler Curtis Jowers
fuente
1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb

Dmitry Shilin
fuente
¿Qué pregunta responde esta? ¿Por qué podría -U postgresser fundamental? ¿Qué son todas esas letras de guión , de todos modos?
barba gris el
0

Tratar:

psql -U nombre_función -d base de datos -h nombre de host..com -W

Srinu Mareti
fuente
Agregue un poco más de contexto a su respuesta.
Death Waltz