Obtention d'erreur: l'authentification par les pairs a échoué pour l'utilisateur «postgres», lors de la tentative de faire fonctionner pgsql avec les rails

738

Je reçois l'erreur:

FATAL: Peer authentication failed for user "postgres"

quand j'essaye de faire fonctionner postgres avec Rails.

Voici mon pg_hba.conf, mon database.ymlet un vidage de la trace complète .

J'ai changé l'authentification en md5 dans pg_hba et essayé différentes choses, mais aucune ne semble fonctionner.

J'ai également essayé de créer un nouvel utilisateur et une nouvelle base de données conformément à Rails 3.2, FATAL: l'authentification par les pairs a échoué pour l'utilisateur (PG :: Error)

Mais ils n'apparaissent pas sur pgadmin ou même lorsque je cours sudo -u postgres psql -l.

Une idée où je me trompe?

orderof1
la source
1
1): Assurez-vous qu'un utilisateur nommé "postgres" est créé et a droit sur votre base de données 2): Assurez-vous qu'il a un mot de passe 3): Assurez-vous que votre config / database.yml contient les informations d'identification des droits (nom d'utilisateur + mot de passe)
MrYoshiji
2
besoin de tous les pairs et du retrait définis sur md5
Artem.Borysov
13
Voir aussi cette réponse - la connexion peut échouer localhostmais réussir 127.0.0.1.
uvsmtid
9
Dans mon cas, je devais ajouter host: localhostle database.ymlfichier.
Mihail Velikov

Réponses:

1029

Le problème est toujours votre pg_hba.conffichier ( /etc/postgresql/9.1/main/pg_hba.conf*).

Cette ligne:

local   all             postgres                                peer

Devrait être:

local   all             postgres                                md5

* Si vous ne trouvez pas ce fichier, l'exécution locate pg_hba.confdevrait vous montrer où se trouve le fichier.

Après avoir modifié ce fichier, n'oubliez pas de redémarrer votre serveur PostgreSQL. Si vous êtes sous Linux, ce serait le cas sudo service postgresql restart.

Ce sont de brèves descriptions des deux options selon les documents officiels de PostgreSQL sur les méthodes d'authentification .

Authentification par les pairs

La méthode d'authentification par les pairs fonctionne en obtenant le nom d'utilisateur du système d'exploitation du client à partir du noyau et en l'utilisant comme nom d'utilisateur de base de données autorisé (avec mappage de nom d'utilisateur facultatif). Cette méthode n'est prise en charge que sur les connexions locales.

Authentification par mot de passe

Les méthodes d'authentification par mot de passe sont md5 et mot de passe. Ces méthodes fonctionnent de manière similaire, sauf pour la façon dont le mot de passe est envoyé via la connexion, à savoir MD5 haché et texte clair respectivement.

Si vous êtes préoccupé par les attaques par "reniflage" de mot de passe, alors md5 est préférable. Un mot de passe simple doit toujours être évité si possible. Cependant, md5 ne peut pas être utilisé avec la fonction db_user_namespace. Si la connexion est protégée par le cryptage SSL, le mot de passe peut être utilisé en toute sécurité (bien que l'authentification par certificat SSL puisse être un meilleur choix si l'on dépend de l'utilisation de SSL).

Emplacement de l'échantillon pour pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf

Marcelo De Polli
la source
50
Vous devrez recharger votre service postgresql après avoir changé cela/etc/init.d/postgresql reload
Funkotron
78
mettre ça ici car j'oublie toujours où se trouve ce fichier/etc/postgresql/9.1/main/pg_hba.conf
Doug
12
@funkotron Au moins sur mon installation ElementaryOS (Ubuntu), sudo service postgreql restartfonctionne également.
Marnen Laibow-Koser
13
Pour répondre à ma propre question: l'authentification «pair» signifie que postgres demande au système d'exploitation votre nom de connexion et l'utilise pour l'authentification, donc l'utilisateur sur le système d'exploitation et sur postgres doit être le même. 'md5' utilise l'authentification par mot de passe crypté.
Dennis
9
Je comprends le changement. Mais pourquoi n'est-ce pas le comportement par défaut? Y a-t-il un inconvénient à utiliser md5?
Victor Marconi
364

Après avoir installé Postgresql, j'ai effectué les étapes ci-dessous.

  1. ouvrez le fichier pg_hba.confpour Ubuntu dans lequel il se trouvera /etc/postgresql/9.x/mainet modifiez cette ligne:

    tous les pairs postgres locaux

    à

    confiance locale de tous les postgres
  2. Redémarrez le serveur

    $ sudo service postgresql restart
  3. Connectez-vous à psql et définissez votre mot de passe

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Enfin, changez le pg_hba.conf de

    confiance locale de tous les postgres

    à

    local tous les postgres md5

Après avoir redémarré le serveur postgresql, vous pouvez y accéder avec votre propre mot de passe

Détails des méthodes d'authentification:

confiance - toute personne qui peut se connecter au serveur est autorisée à accéder à la base de données

pair - utilisez le nom d'utilisateur du système d'exploitation du client comme nom d'utilisateur de base de données pour y accéder.

md5 - authentification par mot de passe

pour plus de vérification de référence ici

Arivarasan L
la source
18
changer la méthode en "confiance" a fonctionné pour moi. +1 pour l'explication des détails de la méthode d'authentification.
La-comadreja
4
Sur homebrew OS X, la valeur par défaut est trust, tandis que sur Ubuntu, la valeur par défaut est définie sur "peer", ce qui a conduit à des écarts entre ma configuration et celle de mon collègue. Nous avons changé le sien en MD5, ce qui n'a pas aidé, donc la «confiance» est la vraie réponse ici (nous ne faisons que des tests de développement). Devrait obtenir plus de votes positifs.
xji
2
vous pouvez également définir md5 partout dès le début
Artem.Borysov
2
De cette façon, cela fonctionne pour moi, en utilisant d'abord la méthode md5 n'était pas.
sianipard
besoin d'utiliser les mêmes mots de passe? sudo passwd postgres
Peter Krauss
213

Si vous vous connectez via localhost (127.0.0.1), vous ne devriez pas rencontrer ce problème particulier. Je ne muck pas beaucoup avec le pg_hba.conf mais à la place j'ajusterais votre chaîne de connexion:

psql -U someuser -h 127.0.0.1 database

où someuser est votre utilisateur auquel vous vous connectez et base de données est la base de données à laquelle votre utilisateur est autorisé à se connecter.

Voici ce que je fais sur Debian pour configurer les 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

Prendre plaisir!

StylusEater
la source
16
Je pense que c'est la meilleure solution car elle résout réellement le problème local sans déconner sans déconner avec la configuration globale comme le recommandent les autres réponses.
jeteon
1
J'ai dû passer host: 127.0.0.1de défaut à localhost dans config / database.yml - c'est sur la même machine donc je ne comprends pas pourquoi
Anthony
Anthony, dites-vous que vous avez rencontré un échec de connexion jusqu'à ce que vous ajustiez localhost à 127.0.0.1 dans votre database.yml? Je suggère de vérifier votre fichier / etc / hosts si c'est le cas. Sinon, il pourrait y avoir une autre bizarrerie liée à la résolution de localhost.
StylusEater
1
C'est beaucoup plus élégant que de jouer avec la méthode d'authentification par les pairs locaux.
mdh
1
C'est de loin la meilleure solution IMO
Salil Junior
45

Cela a fonctionné pour moi !!

sudo -u postgres psql
iamuser2
la source
cela devrait fonctionner correctement tant que votre utilisateur connecté actuel est dans le fichier sudoers.
Abubacker Siddik
16

Si vous avez un problème, vous devez localiser votre pg_hba.conf. La commande est:

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

et après cela, changez le fichier de configuration:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

L'étape suivante est la suivante: redémarrage de votre instance de base de données:

service postgresql-9.3 restart

Si vous rencontrez des problèmes, vous devez de nouveau définir le mot de passe:

ALTER USER db_user with password 'db_password';

d.danailov
la source
16
  1. Accédez à ce fichier /etc/postgresql/9.x/main/ et ouvrez le fichier pg_hba.conf

Dans mon cas:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Remplacer l' homologue par md5

Donc, cela sera changé en:

Connexion administrative à la base de données par socket de domaine Unix local tout homologue 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

Cette:

Connexion administrative à la base de données par socket de domaine Unix local tout 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. Redémarrez ensuite le serveur pg:

    $> sudo service redémarrage postgresql

Voici la liste des méthodes utilisées pour se connecter avec 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.

Remarque: Si vous n'avez pas encore créé votre utilisateur postgres. Créez cela et maintenant vous pouvez accéder au serveur postgres en utilisant les informations d'identification de cet utilisateur.

CONSEIL: Si cela ne fonctionne pas après le redémarrage de postgres, fermez le terminal et rouvrez-le.

Taimoor Changaiz
la source
15
sudo psql --host=localhost --dbname=database-name --username=postgres

Cela a résolu mon problème

Gihan Gamage
la source
3
Je ne pensais pas que ce serait aussi simple que cela, mais cela a fonctionné pour moi sous Debian 9
Hayden Thring
Cela fonctionne sur Ubuntu 19.10
Vithal Reddy
Merci, ça fonctionne sur Ubuntu 19.10 et psql 12.3
Happy Singh
10

J'ai eu le même problème.

La solution de depa est absolument correcte.

Assurez-vous simplement qu'un utilisateur est configuré pour utiliser PostgreSQL.

Vérifiez le fichier:

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

L'autorisation de ce fichier doit être accordée à l'utilisateur avec lequel vous avez enregistré votre psql.

Plus loin. Si vous êtes bon jusqu'à maintenant ..

Mettez à jour selon les instructions de @ depa.

c'est à dire

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

puis apportez des modifications.

nirvanastack
la source
Je suis confronté au même problème. Mais de quelles autorisations dois-je avoir besoin, je ne sais pas. Pouvez-vous m'aider. Je reçois la sortie pour la commande 'ls' est-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Dim
8

Si vous souhaitez conserver la configuration par défaut mais souhaitez une authentification md5 avec une connexion socket pour une connexion utilisateur / db spécifique, ajoutez une ligne "locale" AVANT la ligne "local tout / tout":

# 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
Åsmund
la source
Le "AVANT" dans cette réponse mérite plus de détails dans d'autres réponses. Il s'avère que psql examine les enregistrements dans le fichier pg_hba.conf de manière séquentielle, comme indiqué dans les documents: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin
# TYPE DATABASE USER ADDRESS METHOD nom d'utilisateur local dbname md5 # <- cette ligne Pas en ordre
Kiry Meas
7

Je déplaçais le répertoire de données sur un serveur cloné et j'avais des problèmes pour me connecter en tant que postgres. La réinitialisation du mot de passe postgres comme celui-ci a fonctionné pour moi.

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

Les modifications ci-dessus ont fonctionné pour moi, après avoir compris que je devais redémarrer le serveur postgres après les avoir faites. Pour ubuntu:

sudo /etc/init.d/postgresql restart
sibosop
la source
6

La modification de l' homologue METHOD à laquelle faire confiance dans pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | ligne 85) résout le problème. L'ajout de md5 demande un mot de passe, donc s'il est nécessaire d'éviter d'utiliser des mots de passe, utilisez la confiance au lieu de md5 .

Supun Muthutantrige
la source
6

Utiliser host=localhosten connexion.

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);
Manisha Vasani
la source
5

la commande ci-dessous fonctionne pour moi:

psql -d myDb -U username -W
Mazen Ora
la source
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

Il vous suffit de définir la méthode pour faire confiance.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

Et rechargez le serveur postgres.

# service postgresql-9.5 reload

Les changements dans pg_hba.conf ne nécessitent pas de serveur postgres RESTART. juste RELOAD.

Alexandr Zaichenko
la source
3

La plupart des autres réponses se rapportent aux paramètres des différents fichiers de configuration et à ceux pg_hba.conf ne s'appliquent et sont 100% correctes. Cependant, assurez-vous de modifier les fichiers de configuration corrects .

Comme d'autres l'ont mentionné, les emplacements du fichier de configuration peuvent être remplacés par divers paramètres à l'intérieur du fichier de configuration principal, ainsi qu'en fournissant un chemin d'accès au fichier de configuration principal sur la ligne de commande avec l' -Doption.

Vous pouvez utiliser la commande suivante pendant une session psql pour montrer où vos fichiers de configuration sont lus (en supposant que vous pouvez lancer psql). Ce n'est qu'une étape de dépannage qui peut aider certaines personnes:

select * from pg_settings where setting~'pgsql';  

Vous devez également vous assurer que le répertoire personnel de votre utilisateur postgres est là où vous vous attendez. Je dis cela car il est assez facile de l'ignorer car votre invite affichera ` ~` au lieu du chemin réel de votre répertoire personnel, ce qui ne le rend pas si évident. De nombreuses installations utilisent par défaut le répertoire personnel de l'utilisateur postgres/var/lib/pgsql .

S'il n'est pas défini sur ce qu'il est censé être, arrêtez le service postgresql et utilisez la commande suivante lorsque vous êtes connecté en tant que root. Assurez-vous également que l'utilisateur postgres n'est pas connecté à une autre session:

usermod -d /path/pgsql postgres

Enfin, assurez-vous que votre variable PGDATA est correctement définie en tapant echo $PGDATA , ce qui devrait produire quelque chose de similaire à:

/path/pgsql/data

S'il n'est pas défini ou affiche quelque chose de différent de ce que vous attendez, examinez vos fichiers de démarrage ou RC tels que .profile ou .bash.rc - cela variera considérablement en fonction de votre système d'exploitation et de votre shell. Une fois que vous avez déterminé le script de démarrage correct pour votre machine, vous pouvez insérer ce qui suit:

export PGDATA=/path/pgsql/data

Pour mon système, je l'ai placé dans /etc/profile.d/profile.local.sh afin qu'il soit accessible à tous les utilisateurs.

Vous devriez maintenant pouvoir lancer la base de données comme d'habitude et tous vos paramètres de chemin psql devraient être corrects!

Facture
la source
3

pg_config est pour les informations de complication, pour aider les extensions et les programmes clients à compiler et à se lier à PostgreSQL. Il ne sait rien des instances PostgreSQL actives sur la machine, seulement les binaires.

pg_hba.conf peut apparaître à de nombreux autres endroits selon la façon dont Pg a été installé. L'emplacement standard est pg_hba.conf dans le répertoire data_de la base de données (qui pourrait être dans / home, / var / lib / pgsql, / var / lib / postgresql / [version] /, / opt / postgres /, etc etc etc)) mais les utilisateurs et les conditionneurs peuvent le placer où bon leur semble. Malheureusement.

Le seul moyen valable de trouver pg_hba.conf est de demander à une instance PostgreSQL en cours d'exécution où se trouve pg_hba.conf, ou de demander au sysadmin où il se trouve. Vous ne pouvez même pas vous fier à demander où se trouve le datadir et à analyser postgresql.conf car un script init peut passer un paramètre comme -c hba_file = / some / other / path lors du démarrage de Pg.

Ce que vous voulez faire, c'est demander à PostgreSQL:

SHOW hba_file;

Cette commande doit être exécutée sur une session superutilisateur, donc pour les scripts shell, vous pourriez écrire quelque chose comme:

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

et définissez les variables d'environnement PGUSER, PGDATABASE, etc. pour vous assurer que la connexion est correcte.

Oui, c'est un peu un problème de poule et d'oeuf, en ce sens que si l'utilisateur ne peut pas se connecter (par exemple, après avoir bousillé l'édition de pg_hba.conf), vous ne pouvez pas trouver pg_hba.conf pour le corriger.

Une autre option consiste à regarder la sortie de la commande ps et à voir si l'argument du répertoire de données postmaster -D y est visible, par exemple

ps aux  | grep 'postgres *-D'

puisque pg_hba.conf sera à l'intérieur du répertoire de données (sauf si vous êtes sur Debian / Ubuntu ou un dérivé et utilisez leurs paquets).

Si vous ciblez spécifiquement des systèmes Ubuntu avec PostgreSQL installé à partir de paquets Debian / Ubuntu, cela devient un peu plus facile. Vous n'avez pas à gérer un Pg compilé à la main pour lequel quelqu'un a initialisé un datadir dans son répertoire personnel, ou une installation EnterpriseDB Pg dans / opt, etc. Vous pouvez demander à pg_wrapper, le multi Debian / Ubuntu -version Pg manager, où PostgreSQL utilise la commande pg_lsclusters de pg_wrapper.

Si vous ne pouvez pas vous connecter (Pg n'est pas en cours d'exécution, ou vous devez modifier pg_hba.conf pour vous connecter), vous devrez rechercher les fichiers pg_hba.conf dans le système. Sur Mac et Linux, quelque chose comme sudo find / -type f -name pg_hba.conf fera l'affaire. Vérifiez ensuite le fichier PG_VERSION dans le même répertoire pour vous assurer qu'il s'agit de la bonne version de PostgreSQL si vous en avez plusieurs. (Si pg_hba.conf est dans / etc /, ignorez cela, c'est le nom du répertoire parent à la place). Si vous avez plus d'un répertoire de données pour la même version de PostgreSQL, vous devrez regarder la taille de la base de données, vérifiez la ligne de commande des postgres en cours d'exécution à partir de ps pour voir si son répertoire de données - l'argument D correspond à l'endroit où vous éditez, etc. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711

tayfun Kılıç
la source
2

Mon problème était que je n'ai tapé aucun serveur. Je pensais que c'était un défaut à cause de l'espace réservé mais quand j'ai tapé localhost cela a fonctionné.

Epsilon47
la source
2

Si vous essayez de localiser ce fichier dans Cloud 9, vous pouvez le faire

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

Appuyez sur Ipour modifier / insérer, appuyez sur ESC3 fois et tapez :wqpour enregistrer le fichier et quitter

Marshall
la source
2

Si vous rencontrez ce problème avec les rails et que vous savez que vous avez déjà créé ce nom d'utilisateur avec le mot de passe ainsi que les droits appropriés, il vous suffit de mettre ce qui suit à la fin de votre fichier database.yml.

host: localhost

le fichier global ressemblera à ci-dessous

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

Vous n'avez pas du tout besoin de toucher votre pg_hba.conffichier. Codage heureux

ImranNaqvi
la source