psql: FATAL: Uwierzytelnianie peer nie powiodło się dla użytkownika „dev”

198

kiedy tworzę nowego użytkownika, ale nie może on zalogować się do bazy danych.
Robię to tak:

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

następnie utwórz bazę danych:

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

potem próbuję psql -U dev -W test_developmentsię zalogować, ale pojawia się błąd:

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

Próbowałem rozwiązać problem, ale nie udało się.

hsming
źródło
2
możliwy duplikat uwierzytelnienia PG Peer nie powiódł się
Daniel Vérité
teraz, aby otrzymać monit o odpowiedzi na powyższe pytania, musisz dodać --interactivedo polecenia:createuser --interactive joe
user3791372,

Odpowiedzi:

310

Próbować:

psql -U user_name  -h 127.0.0.1 -d db_name

gdzie

  • -U to nazwa użytkownika bazy danych
  • -h jest nazwą hosta / IP lokalnego serwera, unikając w ten sposób gniazd domeny Unix
  • -d to nazwa bazy danych, z którą należy się połączyć

Jest to następnie oceniane jako połączenie „sieciowe” przez Postgresql, a nie połączenie przez gniazdo domeny Unix, a zatem nie jest oceniane jako połączenie „lokalne”, jak można zobaczyć w pg_hba.conf:

local   all             all                                     peer
meyerson
źródło
15
Potrzebowałem (wer. 9.4): psql -U nazwa-użytkownika -h 127.0.0.1 -d nazwa-db
Gregor
9
co za narzędzie ornery. instrukcja mówi psql [option...] [dbname [username]], więc pomyślałbyś, że psql dbname usernameto po prostu zadziała ...
djeikyb
2
Pracował również dla mnie. Myślę też, że jest to o wiele bardziej preferowany sposób niż zmiana plików konfiguracyjnych, zwłaszcza gdy nie masz pojęcia o tym, co robisz i po prostu podążasz za odpowiedzią SO, aby rozwiązać problem.
borisano
1
bardzo mi to pomogło, ale robię badania, dlaczego to było właściwe rozwiązanie. niemniej jednak w konfiguracji na innym komputerze zalogowałbym się jako baza danych psql -U nazwa użytkownika -d. więc sądzę, że zaakceptowane rozwiązanie zależy od przypadku.
Łazarz Powstanie
2
Dobra odpowiedź. Dostawałem się z bazy danych po zalogowaniu jako postgres, \c glossary john FATAL: Peer authentication failed for user "john"a potem \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".działało.
patrz
215

Połączenie nie powiodło się, ponieważ domyślnie psqlłączy się przez gniazda UNIX przy użyciu peeruwierzytelniania, co wymaga, aby bieżący użytkownik UNIX miał taką samą nazwę użytkownika jak psql. Musisz więc utworzyć użytkownika UNIX, deva następnie zalogować się jako użytkownik devlub użyć go w sudo -u dev psql test_developmentcelu uzyskania dostępu do bazy danych (i niepsql należy prosić o hasło).

Jeśli nie możesz lub nie chcesz utworzyć użytkownika UNIX, na przykład jeśli chcesz się połączyć ze swoją bazą danych w celu zapytań ad hoc , wymuszenie połączenia przez gniazdo za pomocą psql --host=localhost --dbname=test_development --username=dev(jak wskazano w odpowiedzi @meyerson) rozwiąże natychmiastowy problem.

Ale jeśli zamierzasz wymusić uwierzytelnianie hasła przez gniazda Unix zamiast metody peer, spróbuj zmienić następującą pg_hba.conf* linię:

z

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

do

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peeroznacza, że ​​będzie ufać tożsamości (autentyczności) użytkownika UNIX. Więc nie pytaj o hasło.

  • md5oznacza, że ​​zawsze poprosi o hasło i zweryfikuje je po zaszyfrowaniu MD5.

Możesz oczywiście również stworzyć bardziej szczegółowe reguły dla konkretnej bazy danych lub użytkownika, przy czym niektórzy użytkownicy mają, peera inni wymagają hasła.

Po zmianie, pg_hba.confczy PostgreSQL jest uruchomiony, musisz ponownie odczytać konfigurację poprzez ponowne załadowanie ( pg_ctl reload) lub ponowne uruchomienie ( sudo service postgresql restart).

* Plik pg_hba.confnajprawdopodobniej będzie na/etc/postgresql/9.x/main/pg_hba.conf

Edytowane: Uwagi od @Chloe, @JavierEH, @Jasas Eicher, @fccoelho, @Joanis, @Uphill_Co komentarze włączone do odpowiedzi.

flaviodesousa
źródło
5
Jak pozwalasz na peer AND md5 ? Po ustawieniu md5nie mogę się już zalogować do postgresużytkownika! Próbowałem dodać wiele wierszy i oddzielić metodę przecinkami, ale one nie działały. Ok znalazłem mgoldwasserodpowiedź i to zadziałało. Właśnie dodałem kolejną linię dla użytkownika postgresz metodą peer!
Chloe,
3
Nie martw się, możesz ustawić uwierzytelnianie równorzędne dla określonych użytkowników (na przykład swoją nazwę użytkownika lub postgres). Wygląda na to, że szczegółowe reguły zastępują reguły ogólne
JavierIEH,
1
W niektórych dystrybucjach plik można również znaleźć tutaj:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher
2
nie możesz tego zrobić bez restartowania postgresql? nie możesz po prostu określić metody uwierzytelnienia w tabeli pg_user?
fccoelho
2
Możesz przeładować zamiast restartować. To przeładowuje tabelę pg_hba. Pracował dla mnie.
Joanis
29

Uwierzytelnianie rówieśnicze oznacza, że ​​postgres prosi system operacyjny o nazwę logowania i używa go do uwierzytelnienia. Aby zalogować się jako użytkownik „dev” przy użyciu uwierzytelniania równorzędnego na postgres, musisz być także użytkownikiem „dev” w systemie operacyjnym.

Szczegółowe informacje na temat metod uwierzytelniania można znaleźć w dokumentacji Postgresql .

Wskazówka: Jeśli żadna metoda uwierzytelniania nie działa, odłącz serwer od sieci i użyj metody „trust” dla „localhost” (i dokładnie sprawdź, czy twój serwer nie jest dostępny przez sieć, gdy włączona jest metoda „trust”).

stefan.schwetschke
źródło
1
dzięki za answers.but to nadal nie działa, jeśli mogę zmienić devna użytkownika systemuXXX
hsming
2
odpowiedź Stefana jest poprawna. Właśnie dodałem link, który będzie widoczny po sprawdzeniu mojej edycji, do dokumentacji, w której wyjaśniono każdą z metod uwierzytelnienia.
dsh
25

Kiedy określisz:

psql -U user

łączy się przez gniazdo UNIX, które domyślnie korzysta z peeruwierzytelniania, chyba że określono pg_hba.confinaczej.

Możesz określić:

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

aby uzyskać połączenie TCP / IP na interfejsie pętli zwrotnej (zarówno IPv4, jak i IPv6) dla określonych databasei user.

Po zmianach musisz zrestartować postgres lub ponownie załadować jego konfigurację. Uruchom ponownie, który powinien działać w nowoczesnych dystrybucjach opartych na RHEL / Debian:

service postgresql restart

Przeładowanie powinno działać w następujący sposób:

pg_ctl reload

ale polecenie może się różnić w zależności od konfiguracji PATH - może być konieczne określenie bezwzględnej ścieżki, która może być inna, w zależności od sposobu zainstalowania postgres.

Następnie możesz użyć:

psql -h localhost -U user -d database

zalogować się za pomocą tego userdo określonego databaseprzez TCP / IP. md5oznacza zaszyfrowane hasło, ale możesz również określićpassword podczas autoryzacji hasła w postaci zwykłego tekstu. Te dwie opcje nie powinny mieć wielkiego znaczenia, o ile serwer bazy danych jest dostępny tylko lokalnie, bez dostępu do sieci.

Ważna uwaga: kolejność definicji w pg_hba.confsprawach - reguły są odczytywane od góry do dołu, podobnie jak iptables, więc prawdopodobnie chcesz dodać proponowane reguły powyżej reguły:

host    all             all             127.0.0.1/32            ident
tymik
źródło
ponownie Ważna uwaga: - ważne jest zamówienie +1
hawkeye
23

Chociaż odpowiedź @ flaviodesousa zadziałałaby, to również nakłada na wszystkich użytkowników (wszystkich innych) obowiązek wprowadzenia hasła.

Czasami sensowne jest utrzymanie uwierzytelnienia równorzędnego dla wszystkich innych, ale wyjątek dla użytkownika usługi. W takim przypadku chciałbyś dodać linię do pg_hba.conf, która wygląda następująco:

local   all             some_batch_user                         md5

Polecam dodanie tej linii tuż pod komentarzem nagłówka:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Musisz zrestartować PostgreSQL za pomocą

sudo service postgresql restart

Jeśli używasz 9.3, twój pg_hba.conf najprawdopodobniej będzie:

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

mgoldwasser
źródło
12

Działa to dla mnie, gdy na to wpadnę:

sudo -u username psql
alangrah
źródło
działa tylko jeśli stworzyć zupełnie nowy użytkownik w systemie iw PostgreSQL - hsming prostu chce połączyć się z PostgreSQL z nowo utworzonego postgres użytkownika dev.
Kenneth
8

Najłatwiejsze rozwiązanie:

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
źródło
6

Po prostu musiałem dodać -h localhost

VPaul
źródło
Mój problem polegał na korzystaniu z Postgres na Malinach. ^^^ pracował dla mnie !! Dziękuję Ci!
tidydee
2

W moim przypadku korzystałem z innego portu. Domyślnie jest to 5432. Używałem 5433. To działało dla mnie:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
Ikrom
źródło
Może się to zdarzyć automatycznie, gdy masz więcej niż jedną instalację Postgres.
Galigator
1

Dla ludzi w przyszłości, widząc to, postgresjest w/usr/lib/postgresql/10/bin na moim serwerze Ubuntu.

Dodałem go do ŚCIEŻKI w moim pliku .bashrc i dodałem ten wiersz na końcu

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

następnie w wierszu poleceń

$> source ./.bashrc

Odświeżyłem moje środowisko bash. Teraz mogę korzystać postgres -D /whereverz dowolnego katalogu

Tyler Curtis Jowers
źródło
1

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

Dmitrij Shilin
źródło
Na jakie pytanie odpowiada ta odpowiedź? Dlaczego może -U postgresbyć kluczowy? Czym właściwie są te wszystkie litery ?
Greybeard
0

Próbować:

psql -U nazwa_roli -d baza danych -h nazwa hosta..com -W

Srinu Mareti
źródło
Dodaj trochę więcej kontekstu do swojej odpowiedzi.
Death Waltz