Fehler erhalten: Die Peer-Authentifizierung ist für den Benutzer "postgres" fehlgeschlagen, wenn versucht wird, pgsql mit Rails zum Laufen zu bringen

737

Ich erhalte den Fehler:

FATAL: Peer authentication failed for user "postgres"

wenn ich versuche, Postgres mit Rails zum Laufen zu bringen.

Hier ist mein pg_hba.conf, mein database.ymlund ein Dump der vollständigen Spur .

Ich habe die Authentifizierung in pg_hba in md5 geändert und verschiedene Dinge ausprobiert, aber keine scheint zu funktionieren.

Ich habe auch versucht, einen neuen Benutzer und eine neue Datenbank gemäß Rails 3.2, FATAL: Peer-Authentifizierung für Benutzer fehlgeschlagen (PG :: Error).

Aber sie erscheinen nicht auf pgadmin oder sogar wenn ich renne sudo -u postgres psql -l.

Irgendeine Idee, wo ich falsch liege?

orderof1
quelle
1
1): Stellen Sie sicher , haben Sie einen Benutzer mit dem Namen „Postgres“ erstellt und direkt auf Ihrer Datenbank mit 2): Stellen Sie sicher , er hat ein Passwort 3): Stellen Sie sicher , dass Ihre config / database.yml enthält die Rechte Zugangsdaten (Benutzername + Passwort)
MrYoshiji
2
brauche überall Peer und Einzug auf md5 gesetzt
Artem.Borysov
13
Siehe auch diese Antwort - Die Verbindung schlägt möglicherweise fehl, ist localhostaber erfolgreich 127.0.0.1.
Uvsmtid
9
In meinem Fall musste ich host: localhostdie database.ymlDatei hinzufügen .
Mihail Velikov
Dieser Link hat mir geholfen suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/…
Sudip Bhandari

Antworten:

1027

Das Problem ist immer noch Ihre pg_hba.confDatei ( /etc/postgresql/9.1/main/pg_hba.conf*).

Diese Linie:

local   all             postgres                                peer

Sollte sein:

local   all             postgres                                md5

* Wenn Sie diese Datei nicht finden können, locate pg_hba.confsollte beim Ausführen angezeigt werden, wo sich die Datei befindet.

Vergessen Sie nach dem Ändern dieser Datei nicht, Ihren PostgreSQL-Server neu zu starten. Wenn Sie unter Linux sind, wäre das sudo service postgresql restart.

Dies sind kurze Beschreibungen beider Optionen gemäß den offiziellen PostgreSQL-Dokumenten zu Authentifizierungsmethoden .

Peer-Authentifizierung

Bei der Peer-Authentifizierungsmethode wird der Benutzername des Betriebssystems des Clients vom Kernel abgerufen und als zulässiger Datenbankbenutzername verwendet (mit optionaler Benutzernamenzuordnung). Diese Methode wird nur bei lokalen Verbindungen unterstützt.

Passwortauthentifizierung

Die kennwortbasierten Authentifizierungsmethoden sind md5 und Kennwort. Diese Methoden funktionieren ähnlich, mit Ausnahme der Art und Weise, wie das Kennwort über die Verbindung gesendet wird, nämlich MD5-Hash bzw. Klartext.

Wenn Sie sich überhaupt Gedanken über "Sniffing" -Angriffe mit Passwörtern machen, wird md5 bevorzugt. Ein einfaches Passwort sollte nach Möglichkeit immer vermieden werden. Md5 kann jedoch nicht mit der Funktion db_user_namespace verwendet werden. Wenn die Verbindung durch SSL-Verschlüsselung geschützt ist, kann das Kennwort sicher verwendet werden (obwohl die SSL-Zertifikatauthentifizierung möglicherweise die bessere Wahl ist, wenn SSL verwendet wird).

Beispielort für pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf

Marcelo De Polli
quelle
50
Sie müssen Ihren Postgresql-Dienst neu laden, nachdem Sie dies /etc/init.d/postgresql reload
geändert haben
78
Setzen Sie dies hier, da ich immer vergesse, wo diese Datei ist/etc/postgresql/9.1/main/pg_hba.conf
Doug
12
@funkotron Zumindest auf meiner ElementaryOS (Ubuntu) Installation sudo service postgreql restartfunktioniert das auch.
Marnen Laibow-Koser
13
Um meine eigene Frage zu beantworten: "Peer" -Authentifizierung bedeutet, dass postgres das Betriebssystem nach Ihrem Anmeldenamen fragt und diesen zur Authentifizierung verwendet, sodass der Benutzer auf dem Betriebssystem und auf postgres identisch sein muss. 'md5' verwendet die verschlüsselte Passwortauthentifizierung.
Dennis
9
Ich verstehe die Veränderung. Aber warum ist dies nicht das Standardverhalten? Gibt es einen Nachteil bei der Verwendung von md5?
Victor Marconi
361

Nach der Installation von Postgresql habe ich die folgenden Schritte ausgeführt.

  1. Öffnen Sie die Datei pg_hba.conffür Ubuntu /etc/postgresql/9.x/mainund ändern Sie diese Zeile:

    lokal alle postgres Peer

    zu

    lokal alle postgres vertrauen
  2. Starten Sie den Server neu

    $ sudo service postgresql restart
  3. Melden Sie sich bei psql an und legen Sie Ihr Passwort fest

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Ändern Sie zum Schluss das pg_hba.confvon

    lokal alle postgres vertrauen

    zu

    lokal alle postgres md5

Nach dem Neustart des postgresql-Servers können Sie mit Ihrem eigenen Passwort darauf zugreifen

Details zu den Authentifizierungsmethoden:

Vertrauen - Jeder, der eine Verbindung zum Server herstellen kann, ist berechtigt, auf die Datenbank zuzugreifen

Peer - Verwenden Sie den Betriebssystembenutzernamen des Clients als Datenbankbenutzernamen, um darauf zuzugreifen.

md5 - kennwortbasierte Authentifizierung

Weitere Informationen finden Sie hier

Arivarasan L.
quelle
17
Das Ändern der Methode in "Vertrauen" hat bei mir funktioniert. +1 zur Erläuterung der Details der Authentifizierungsmethode.
La-Comadreja
4
Unter OS X Homebrew ist der Standard "Vertrauen", während unter Ubuntu der Standard auf "Peer" gesetzt ist, was zu Diskrepanzen zwischen meinem Setup und dem meines Kollegen führte. Wir haben seine auf MD5 geändert, was nicht geholfen hat, daher ist "Vertrauen" hier die eigentliche Antwort (wir führen nur Entwicklungstests durch). Sollte mehr Upvotes bekommen.
Xji
2
Sie können auch md5 von Anfang an
überall einstellen
2
Dieser Weg funktioniert bei mir, mit Methode md5 zuerst nicht.
Sianipard
Müssen Sie dieselben Passwörter verwenden? sudo passwd postgres
Peter Krauss
211

Wenn Sie eine Verbindung über localhost (127.0.0.1) herstellen, sollte dieses spezielle Problem nicht auftreten. Ich würde nicht viel mit der pg_hba.conf machen, aber stattdessen würde ich Ihre Verbindungszeichenfolge anpassen:

psql -U someuser -h 127.0.0.1 database

Dabei ist ein Benutzer Ihr Benutzer, unter dem Sie eine Verbindung herstellen, und Datenbank ist die Datenbank, zu der Ihr Benutzer eine Verbindung herstellen darf.

Folgendes mache ich auf Debian, um Postgres einzurichten:

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

Genießen!

StylusEater
quelle
16
Ich denke, dies ist die beste Lösung, da sie das lokale Problem tatsächlich löst, ohne die globale Konfiguration zu beeinträchtigen, wie in den anderen Antworten empfohlen.
Jeteon
1
Ich musste host: 127.0.0.1in config / database.yml von der Standardeinstellung auf localhost wechseln - es befindet sich auf demselben Computer, daher verstehe ich nicht warum
Anthony
Anthony, sagen Sie, dass ein Verbindungsfehler aufgetreten ist, bis Sie localhost in Ihrer database.yml auf 127.0.0.1 eingestellt haben? Ich schlage vor, Ihre / etc / hosts-Datei zu überprüfen, wenn dies der Fall ist. Andernfalls kann es zu einer anderen Kuriosität beim Auflösen von localhost kommen.
StylusEater
1
Dies ist viel eleganter als das Durcheinander mit der lokalen Peer-Authentifizierungsmethode.
Mdh
1
Dies ist bei weitem die beste Lösung IMO
Salil Junior
45

Das hat bei mir funktioniert !!

sudo -u postgres psql
iamuser2
quelle
Dies sollte einwandfrei funktionieren, solange sich Ihr aktuell angemeldeter Benutzer in der sudoers-Datei befindet.
Abubacker Siddik
16

Wenn Sie ein Problem haben, müssen Sie Ihre suchen pg_hba.conf. Der Befehl lautet:

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

und danach die Konfigurationsdatei ändern:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

Der nächste Schritt ist: Neustart Ihrer Datenbankinstanz:

service postgresql-9.3 restart

Wenn Sie Probleme haben, müssen Sie das Passwort erneut festlegen:

ALTER USER db_user with password 'db_password';

d.danailov
quelle
16
  1. Gehen Sie zu dieser /etc/postgresql/9.x/main/ und öffnen Sie die Datei pg_hba.conf

In meinem Fall:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Ersetzen Sie Peer durch MD5

Dies wird also geändert in:

Datenbankadministrative Anmeldung durch Unix Domain Socket lokal alle Postgres Peer

# 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

Diese:

Datenbankadministratorische Anmeldung durch Unix Domain Socket lokal alle 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. Starten Sie dann pg server neu:

    $> sudo service postgresql restart

Unten finden Sie eine Liste der METHODEN, die zur Verbindung mit Postgres verwendet werden:

# 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.

Hinweis: Wenn Sie Ihren Postgres-Benutzer noch nicht erstellt haben. Erstellen Sie das und jetzt können Sie mit diesen Benutzeranmeldeinformationen auf den Postgres-Server zugreifen.

TIPP: Wenn es nach dem Neustart von postgres nicht funktioniert, schließen Sie das Terminal und öffnen Sie es erneut.

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

Dies löste mein Problem

Gihan Gamage
quelle
3
Ich hätte nicht gedacht, dass es so einfach sein würde, aber das funktionierte für mich unter Debian 9
Hayden Thring
Dies funktioniert unter Ubuntu 19.10
Vithal Reddy
Danke, es funktioniert unter Ubuntu 19.10 und psql 12.3
Happy Singh
10

Ich hatte das gleiche Problem.

Die Lösung von depa ist absolut richtig.

Stellen Sie einfach sicher, dass Sie einen Benutzer für die Verwendung von PostgreSQL konfiguriert haben.

Überprüfen Sie die Datei:

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

Die Berechtigung für diese Datei sollte dem Benutzer erteilt werden, bei dem Sie Ihre psql registriert haben.

Des Weiteren. Wenn du bis jetzt gut bist ..

Aktualisieren Sie gemäß den Anweisungen von @ depa.

dh

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

und dann Änderungen vornehmen.

Nirvanastack
quelle
Ich stehe vor dem gleichen Problem. Aber welche Berechtigungen ich benötigen sollte, weiß ich nicht. können Sie mir helfen. Ich erhalte die Ausgabe für den Befehl 'ls' ist-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
So
8

Wenn Sie die Standardkonfiguration beibehalten möchten, aber eine MD5-Authentifizierung mit Socket-Verbindung für eine bestimmte Benutzer- / Datenbankverbindung wünschen, fügen Sie vor der Zeile "local all / all" eine "lokale" Zeile hinzu:

# 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
quelle
Das "VOR" in dieser Antwort verdient mehr Ausarbeitung in anderen Antworten. Es stellt sich heraus, dass psql Datensätze in der Datei pg_hba.conf nacheinander untersucht, wie in den Dokumenten angegeben: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin
# TYP DATENBANK BENUTZERADRESSMETHODE lokaler Benutzername Datenbankname md5 # <- diese Zeile Nicht in Ordnung
Kiry Meas
7

Ich habe das Datenverzeichnis auf einem geklonten Server verschoben und Probleme beim Anmelden als Postgres. Das Zurücksetzen des Postgres-Passworts hat bei mir funktioniert.

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
quelle
6

Die obigen Änderungen haben bei mir funktioniert, nachdem ich herausgefunden hatte, dass ich den Postgres-Server neu starten musste, nachdem ich sie vorgenommen hatte. Für Ubuntu:

sudo /etc/init.d/postgresql restart
sibosop
quelle
6

Verfahren zum Ändern des Peer zu Vertrauen in pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | Zeile 85) löst das Problem. Wenn Sie md5 hinzufügen, werden Sie nach einem Kennwort gefragt. Wenn Sie daher die Verwendung von Kennwörtern vermeiden müssen, verwenden Sie Vertrauen anstelle von md5 .

Supun Muthutantrige
quelle
6

Verwendung host=localhostin Verbindung.

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

Der folgende Befehl funktioniert für mich:

psql -d myDb -U username -W
Mazen Ora
quelle
Mann 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.
Jaroslaw Nikitenko
3

Sie müssen nur METHOD einstellen, um zu vertrauen.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

Und laden Sie den Postgres-Server neu.

# service postgresql-9.5 reload

Änderungen in pg_hba.conf erfordern keinen RESTART-Postgres-Server. einfach neu laden.

Alexandr Zaichenko
quelle
3

Viele der anderen Antworten beziehen sich auf Einstellungen in den verschiedenen Konfigurationsdateien, und diejenigen, die sich auf die Einstellungen beziehen, pg_hba.confgelten und sind zu 100% korrekt. Stellen Sie jedoch sicher, dass Sie die richtigen Konfigurationsdateien ändern .

Wie bereits erwähnt, können die Speicherorte der Konfigurationsdatei mit verschiedenen Einstellungen in der Hauptkonfigurationsdatei überschrieben werden. Außerdem kann ein Pfad zur Hauptkonfigurationsdatei in der Befehlszeile mit dem angegeben werden -D Option .

Sie können den folgenden Befehl während einer psql-Sitzung verwenden, um anzuzeigen, wo Ihre Konfigurationsdateien gelesen werden (vorausgesetzt, Sie können psql starten). Dies ist nur ein Schritt zur Fehlerbehebung, der einigen Menschen helfen kann:

select * from pg_settings where setting~'pgsql';  

Sie sollten auch sicherstellen, dass sich das Ausgangsverzeichnis für Ihren Postgres-Benutzer dort befindet, wo Sie es erwarten. Ich sage dies, weil es ziemlich leicht ist, dies zu übersehen, da Ihre Eingabeaufforderung ' ~' anstelle des tatsächlichen Pfads Ihres Home-Verzeichnisses anzeigt , was es nicht so offensichtlich macht. Bei vielen Installationen wird standardmäßig das Home-Verzeichnis des Postgres-Benutzers verwendet /var/lib/pgsql.

Wenn es nicht auf das eingestellt ist, was es sein soll, beenden Sie den postgresql-Dienst und verwenden Sie den folgenden Befehl, während Sie als root angemeldet sind. Stellen Sie außerdem sicher, dass der Postgres-Benutzer nicht in einer anderen Sitzung angemeldet ist:

usermod -d /path/pgsql postgres

Stellen Sie schließlich sicher, dass Ihre PGDATA-Variable richtig eingestellt ist, indem Sie Folgendes eingeben echo $PGDATA, das Folgendes ausgeben sollte:

/path/pgsql/data

Wenn es nicht festgelegt ist oder etwas anderes anzeigt, als Sie es erwarten, überprüfen Sie Ihre Start- oder RC-Dateien wie .profile oder .bash.rc - dies hängt stark von Ihrem Betriebssystem und Ihrer Shell ab. Nachdem Sie das richtige Startskript für Ihren Computer ermittelt haben, können Sie Folgendes einfügen:

export PGDATA=/path/pgsql/data

Für mein System habe ich dies /etc/profile.d/profile.local.shso platziert, dass es für alle Benutzer zugänglich ist.

Sie sollten nun in der Lage sein, die Datenbank wie gewohnt zu initiieren und alle Ihre psql-Pfadeinstellungen sollten korrekt sein!

Rechnung
quelle
3

pg_config dient zur Kompatibilitätsinformation, um Erweiterungen und Clientprogramme beim Kompilieren und Verknüpfen mit PostgreSQL zu unterstützen. Es weiß nichts über die aktiven PostgreSQL-Instanzen auf dem Computer, nur die Binärdateien.

pg_hba.conf kann an vielen anderen Stellen angezeigt werden, je nachdem, wie Pg installiert wurde. Der Standardspeicherort ist pg_hba.conf im Datenverzeichnis der Datenbank (möglicherweise in / home, / var / lib / pgsql, / var / lib / postgresql / [version] /, / opt / postgres / usw. usw. usw.). Benutzer und Verpacker können es jedoch beliebig platzieren. Unglücklicherweise.

Die einzig gültige Möglichkeit, pg_hba.conf zu finden, besteht darin, eine laufende PostgreSQL-Instanz zu fragen, wo sich pg_hba.conf befindet, oder den Systemadministrator zu fragen, wo sie sich befindet. Sie können sich nicht einmal darauf verlassen, zu fragen, wo sich das Datenverzeichnis befindet, und die Datei postgresql.conf zu analysieren, da ein Init-Skript beim Starten von Pg möglicherweise einen Parameter wie -c hba_file = / some / other / path übergeben hat.

Was Sie tun möchten, ist PostgreSQL zu fragen:

SHOW hba_file;

Dieser Befehl muss in einer Superuser-Sitzung ausgeführt werden. Für Shell-Skripte können Sie also Folgendes schreiben:

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

und legen Sie die Umgebungsvariablen PGUSER, PGDATABASE usw. fest, um sicherzustellen, dass die Verbindung korrekt ist.

Ja, dies ist ein Henne-Ei-Problem. Wenn der Benutzer keine Verbindung herstellen kann (z. B. nachdem er die Bearbeitung von pg_hba.conf vermasselt hat), können Sie pg_hba.conf nicht finden, um es zu beheben.

Eine andere Möglichkeit besteht darin, die Ausgabe des Befehls ps zu überprüfen und festzustellen, ob das Postmaster-Datenverzeichnisargument -D dort sichtbar ist, z

ps aux  | grep 'postgres *-D'

da sich pg_hba.conf im Datenverzeichnis befindet (es sei denn, Sie arbeiten unter Debian / Ubuntu oder einem Derivat und verwenden deren Pakete).

Wenn Sie speziell auf Ubuntu-Systeme abzielen, auf denen PostgreSQL aus Debian / Ubuntu-Paketen installiert ist, wird dies etwas einfacher. Sie müssen sich nicht mit handkompilierter Pg aus der Quelle befassen, für die jemand ein Datenverzeichnis in seinem Home-Verzeichnis initiiert hat, oder mit einer EnterpriseDB-Pg-Installation in / opt usw. Sie können pg_wrapper, das Debian / Ubuntu-Multi, fragen -version Pg Manager, bei dem PostgreSQL den Befehl pg_lsclusters von pg_wrapper verwendet.

Wenn Sie keine Verbindung herstellen können (Pg wird nicht ausgeführt oder Sie müssen pg_hba.conf bearbeiten, um eine Verbindung herzustellen), müssen Sie das System nach pg_hba.conf-Dateien durchsuchen. Unter Mac und Linux reicht so etwas wie sudo find / -type f -name pg_hba.conf aus. Überprüfen Sie dann die Datei PG_VERSION im selben Verzeichnis, um sicherzustellen, dass es sich um die richtige PostgreSQL-Version handelt, wenn Sie mehr als eine haben. (Wenn sich pg_hba.conf in / etc / befindet, ignorieren Sie dies, es ist stattdessen der Name des übergeordneten Verzeichnisses). Wenn Sie mehr als ein Datenverzeichnis für dieselbe PostgreSQL-Version haben, müssen Sie die Datenbankgröße überprüfen. Überprüfen Sie in der Befehlszeile der ausgeführten Postgres von ps, ob das Argument des Datenverzeichnisses -D mit dem von Ihnen bearbeiteten übereinstimmt . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711

tayfun Kılıç
quelle
2

Mein Problem war, dass ich keinen Server eingegeben habe. Ich dachte, es ist eine Standardeinstellung wegen Platzhalters, aber als ich localhost eingab, funktionierte es.

Epsilon47
quelle
2

Wenn Sie versuchen, diese Datei in Cloud 9 zu finden, können Sie dies tun

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

Drücken Sie Izum Bearbeiten / Einfügen, drücken Sie ESC3 - mal und geben Sie :wqdie Datei speichern und beenden

Marshall
quelle
2

Wenn Sie mit Rails auf dieses Problem stoßen und wissen, dass Sie diesen Benutzernamen bereits mit einem Kennwort und den richtigen Rechten erstellt haben, müssen Sie am Ende Ihrer Datei database.yml nur Folgendes einfügen.

host: localhost

Die Gesamtdatei sieht wie folgt aus

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

Sie müssen Ihre pg_hba.confDatei überhaupt nicht berühren . Viel Spaß beim Codieren

ImranNaqvi
quelle