psql: FATAL: Uwierzytelnianie tożsamości nie powiodło się dla użytkownika „postgres”


372

Zainstalowałem PostgreSQL i pgAdminIII na moim Ubuntu Karmic.

Jestem w stanie z powodzeniem korzystać z pgAdminIII (tj. Połączyć się / zalogować), jednak gdy próbuję zalogować się do serwera przy użyciu tej samej nazwy użytkownika / pwd w wierszu poleceń (używając psql), pojawia się błąd:

psql: FATAL:  Ident authentication failed for user "postgres"

Czy ktoś teraz jak rozwiązać ten problem?


Ten post stackoverflow zadziałał dla mnie: stackoverflow.com/a/18664239/2110769
Andrea Araldo

Odpowiedzi:


194

Czy ustawiłeś odpowiednie ustawienia w pg_hba.conf?

Zobacz https://help.ubuntu.com/stable/serverguide/postgresql.html jak to zrobić.


36
To mi nie działa. Spędziłem nad tym godziny! Wszystko, co chcę zrobić, to uruchomić polecenia psql w moim terminalu. Czego potrzebuję, aby plik wyglądał, aby to zrobić?
Sean

54
@SeanA potrzebujesz czegoś takiego jak „sudo -u postgres psql”
JLarky

8
Nie zapomnij o „;” na końcu każdej instrukcji psql. Brzmi głupio, ale zdarza się, hehe.
omrsin

42
@Robert: „postgresql jest najbardziej nieprzyjazną dla użytkownika bazą danych”? Spróbuj Oracle pewnego dnia, aby uzyskać perspektywę ... :)
mivk

5
Dla tych, którzy używają szyn, musiałem ustawić plik pg_hba.conf i zmienić „ident” na „password”. Zmiana na zaufanie nie działała.
Abe Petrillo,

412

Poniższe kroki działają w przypadku nowej instalacji Postgres 9.1 na Ubuntu 12.04. (Pracował także dla postgres 9.3.9 na Ubuntu 14.04.)

Domyślnie postgres tworzy użytkownika o nazwie „postgres”. Logujemy się jako ona i dajemy jej hasło.

$ sudo -u postgres psql
\password
Enter password: ...
...

Wyloguj psqlsię, wpisując \qlub ctrl+d. Następnie łączymy się jako „postgres”. Ta -h localhostczęść jest ważna : mówi psqlklientowi, że chcemy się połączyć za pomocą połączenia TCP (który jest skonfigurowany do uwierzytelniania za pomocą hasła), a nie przez połączenie PEER (które nie dba o hasło).

$ psql -U postgres -h localhost

13
Jeśli ustawisz PGHOST=localhost, nie musisz za -hkażdym razem określać opcji. Działa to również z innymi pg_*poleceniami, takimi jak pg_dump.
Sameer


2
Było to potrzebne, aby umożliwić instalację Mediawiki na Debianie z PostgreSQL.
mivk

2 lata później i muszę to zrobić również na komputerze Mac .
Manav

1
źle, ponieważ występuje problem z bezpieczeństwem, patrz tutaj: serverfault.com/questions/110154/…
Erdinc Ay

161

Edycja pliku /etc/postgresql/8.4/main/pg_hba.confi zastąpić identalbo peerprzez jedną md5lub trust, w zależności od tego, czy chcesz, aby poprosić o hasło na swoim komputerze, czy nie. Następnie ponownie załaduj plik konfiguracyjny za pomocą:

/etc/init.d/postgresql reload

4
jedno polecenie zrestartuj postgresql: /etc/init.d/postgresql restart
Tyler Long

14
Po co restartować, gdy przeładowanie jest wszystkim, czego potrzebujesz?
Frank Heikens

W tym przypadku: „/etc/init.d/postgresql-8.4 reload”
shaytac

1
ten tutaj działał dla mnie. Wystarczyła zmiana z peera na md5.
Jonatas CD,

1
OK, jestem postobresql noob, ale muszę zgłosić, że restartzadziałało tylko dla mnie, a nie reload--- po zmianach na /etc/postgresql/9.5/main/pg_hba.conf(zmiana peerna trust).
Mike O'Connor,

91

Otrzymujesz ten błąd, ponieważ nie udaje Ci się uwierzytelnić klienta. Na podstawie komunikatu o błędzie prawdopodobnie masz domyślną konfigurację Postgres, która ustawia metodę uwierzytelniania klienta na „IDENT” dla wszystkich połączeń PostgreSQL.

Zdecydowanie powinieneś przeczytać sekcję 19.1 Uwierzytelnianie klienta w podręczniku PostgreSQL, aby lepiej zrozumieć dostępne ustawienia uwierzytelniania (dla każdego rekordu w pg_hba.conf ), ale oto odpowiedni fragment, który pomaga rozwiązać problem (z wersji 9.5 instrukcji ):

zaufanie

Zezwól na połączenie bezwarunkowo. Ta metoda pozwala każdemu, kto może połączyć się z serwerem bazy danych PostgreSQL, na zalogowanie się jako dowolny użytkownik PostgreSQL, bez potrzeby podawania hasła lub innego uwierzytelnienia. Szczegółowe informacje można znaleźć w sekcji 19.3.1.

odrzucać

Odrzuć połączenie bezwarunkowo. Jest to przydatne do „odfiltrowywania” niektórych hostów z grupy, na przykład linia odrzucająca może blokować połączenie określonego hosta, podczas gdy późniejsza linia pozwala na połączenie pozostałych hostów w określonej sieci.

md5

Wymagaj od klienta podania podwójnego hasła z haszowaniem MD5 w celu uwierzytelnienia. Szczegółowe informacje można znaleźć w sekcji 19.3.2.

hasło

Wymagaj od klienta podania niezaszyfrowanego hasła do uwierzytelnienia. Ponieważ hasło jest przesyłane zwykłym tekstem przez sieć, nie należy go używać w niezaufanych sieciach. Szczegółowe informacje można znaleźć w sekcji 19.3.2.

gss

Użyj GSSAPI do uwierzytelnienia użytkownika. Jest to dostępne tylko dla połączeń TCP / IP. Szczegółowe informacje można znaleźć w sekcji 19.3.3.

sspi

Użyj SSPI do uwierzytelnienia użytkownika. Jest to dostępne tylko w systemie Windows. Szczegółowe informacje można znaleźć w sekcji 19.3.4.

ident

Uzyskaj nazwę użytkownika systemu operacyjnego klienta, kontaktując się z serwerem tożsamości na kliencie i sprawdź, czy jest ona zgodna z żądaną nazwą użytkownika bazy danych. Uwierzytelniania tożsamości można używać tylko w połączeniach TCP / IP. Jeśli zostanie określony dla połączeń lokalnych, zamiast niego zostanie użyte uwierzytelnianie równorzędne. Szczegółowe informacje można znaleźć w sekcji 19.3.5.

par

Uzyskaj nazwę użytkownika systemu operacyjnego klienta z systemu operacyjnego i sprawdź, czy odpowiada żądanej nazwie użytkownika bazy danych. Ta opcja jest dostępna tylko dla połączeń lokalnych. Szczegółowe informacje można znaleźć w sekcji 19.3.6.

ldap

Uwierzytelnij się przy użyciu serwera LDAP. Szczegółowe informacje można znaleźć w sekcji 19.3.7.

promień

Uwierzytelnij się przy użyciu serwera RADIUS. Szczegółowe informacje można znaleźć w sekcji 19.3.8.

cert

Uwierzytelnij się przy użyciu certyfikatów klienta SSL. Szczegółowe informacje można znaleźć w sekcji 19.3.9.

pam

Uwierzytelnij się za pomocą usługi wtykowych modułów uwierzytelniających (PAM) dostarczanej przez system operacyjny. Szczegółowe informacje można znaleźć w sekcji 19.3.10.

Więc ... aby rozwiązać występujący problem, możesz wykonać jedną z następujących czynności:

  1. Zmień metody uwierzytelniania zdefiniowane w pg_hba.conf pliku na trust, md5lub password(w zależności od potrzeb w zakresie bezpieczeństwa i prostoty) dla rekordów połączeń lokalnych, które tam zdefiniowałeś.

  2. Zaktualizuj, pg_ident.confaby zmapować użytkowników systemu operacyjnego na użytkowników PostgreSQL i nadać im odpowiednie uprawnienia dostępu, w zależności od potrzeb.

  3. Pozostaw ustawienia IDENT w spokoju i utwórz użytkowników w bazie danych dla każdego użytkownika systemu operacyjnego, któremu chcesz przyznać dostęp. Jeśli użytkownik jest już uwierzytelniony przez system operacyjny i zalogowany, PostgreSQL nie będzie wymagał dalszego uwierzytelnienia i zapewni mu dostęp w oparciu o wszelkie uprawnienia (role) przypisane mu w bazie danych. To jest konfiguracja domyślna.

Uwaga: Lokalizacja pg_hba.confi pg_ident.confzależy od systemu operacyjnego.


4
Dla mnie to najlepsza odpowiedź. Kiedy znasz wszystkie te opcje, możesz łatwo dostosować konf. A zwłaszcza, gdy jesteś na komputerze dewelopera, możesz po prostu ustawić „ident” dla wszystkich wpisów, aby uniknąć marnowania czasu. Dzięki
venkatareddy

1
To mi też pomogło. W moim przypadku plik pg_hba.conf został ustawiony na peer, zmieniłem go na hasło. Zauważ, że z instalacji waniliowej musiałem również ustawić hasło dla użytkownika postgres, sudo su - postgres psql, \ hasło ustaw hasło. Następnie uruchom domyślne połączenie z pdgadmin3 z nazwą użytkownika postgres i ustawionym hasłem.
edencorbin

1
Gdzie znajduje się ten plik? To prawda, że ​​może być konieczne utworzenie listy, ponieważ wydaje się, że nie ma spójności między wersjami. Chyba po prostu uruchomię wyszukiwanie na '/'.
JosephK

1
Na Ubuntu-16.04 to jest /etc/postgresql/9.6/main/pg_hba.conf.
Mike O'Connor,

1
Jako ktoś, kto jest nowy w psql, jest to ogromna pomoc i powinna być przyjętą odpowiedzią, ponieważ obsługuje różne metody uwierzytelniania
Vyrnach

45

Po prostu dodanie tego -h localhostfragmentu było moim zadaniem


Czy wiemy, dlaczego to naprawia?
Michael Pell,

Domyślne ustawienia postgresql nie są ustawione rozsądnie. Być może już to naprawili, nie wiem. Oczywiście domyślnym adresem URL powinien byćthis_computer = 'http://localhost'
boulder_ruby

15

Możesz ustawić zmienną środowiskową PGHOST=localhost:

$ psql -U db_user db_name
psql: FATAL:  Peer authentication failed for user "db_user"

$ export PGHOST=localhost
$ psql -U db_user db_name

Password for user mfonline:

15

W przypadku, gdy żadne z powyższych nie działa dla ciebie:

wykonałem sporo instalacji Postgres, ale dzisiaj zostałem zmiksowany w systemie RedHat 6.5 (instalowanie Postgres 9.3). Moja typowa konfiguracja hba.conf, którą pokazuje Aron powyżej, nie działała. Okazało się, że mój system używa IPV6 i ignoruje konfigurację IPV4. Dodanie linii:

host    all             all             ::1/128                 password

pozwolił mi się zalogować.


Dzięki Ethan. Korzystam z Fedory 20 i mam ten sam problem, co OP. Po zmianie IPV4 i IPV6 na hasło. Połączenie powiodło się.
Ibn Saeed

1
Nie ma za co. Tak wiele razy korzystałem z innych postów, gdy napotkałem problem programistyczny lub systemowy. Cieszę się, że mogłem trochę oddać.
Ethan Brown

1
To uratowało mi życie na Fedorze 32!
Rami

12

Ze wszystkich powyższych odpowiedzi nic nie działało dla mnie. Musiałem ręcznie zmienić hasło użytkownika w bazie danych i nagle zadziałało.

psql -U postgres -d postgres -c "alter user produser with password 'produser';"

Użyłem następujących ustawień:

pg_hba.conf

local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            password  
# IPv6 local connections:
host    all             all             ::1/128                 password

Połączenie zakończyło się pomyślnie dla następującego polecenia:

psql -U produser -d dbname -h localhost -W 

Po tym pomógł mi tutaj, Joseph. Zwłaszcza polecenie połączenia na końcu, aby pomóc mi to przetestować. Dodałbym także restart usługi Postgresql na wypadek, gdyby ktoś się zastanawiał (ale rozumiem, że to sugeruje). Doceniam to bardzo!
Harlin

10

Odkryłem, że musiałem zainstalować serwer tożsamości, który nasłuchuje na porcie 113.

sudo apt-get install pidentd
sudo service postgresql restart

A potem ident zadziałało.


10

Hmmm ...

Jeśli możesz połączyć się z nazwą użytkownika i hasłem w pgAdminIII, ale nie możesz się połączyć, psqlto te dwa programy prawdopodobnie łączą się z bazą danych inaczej.

[Jeśli łączysz się z różnymi bazami danych, najpierw spróbuj połączyć się z tą samą bazą danych. Zobacz poniżej.]

Z PostgreSQL: Dokumentacja: 9.3: psql :

Jeśli pominiesz nazwę hosta, psql połączy się przez gniazdo domeny Unix z serwerem na hoście lokalnym lub przez TCP / IP do hosta lokalnego na komputerach, które nie mają gniazd domeny Unix.

Jeśli nie prowadzisz czegoś takiego psql ... -h host_name ... i korzystasz z Ubuntu, psqlpowinieneś łączyć się przez gniazdo domeny Unix, więc PostgreSQL prawdopodobnie nie jest skonfigurowany tak, aby zezwalał jednej z metod uwierzytelniania hasła dla użytkownika postgres .

Możesz to przetestować, uruchamiając:

sudo -u postgres psql

Jeśli powyższe działa, Twój serwer jest prawdopodobnie skonfigurowany do używania uwierzytelniania równorzędnego dla połączeń lokalnych przez Postgres użytkownika , tj. Z prośbą do systemu operacyjnego o nazwę użytkownika, aby potwierdzić, że jesteś postgres .

Więc to prawdopodobnie twój plik pg_hba.conf

Pełna ścieżka do pliku będzie taka jak /etc/postgresql/9.3/main/pg_hba.conf . Możesz go wyświetlić, np sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more.

Jeśli w swoim psqlpoleceniu pominąłeś nazwę hosta , powinieneś być w stanie połączyć się, jeśli dodasz następujący wpis do pliku pg_hba.conf :

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5

[Skomentowane linie w pg_hba.conf pliku zaczynają się od #.]

Jeśli w tym nazwę hosta w swojej psqlkomendzie, zamiast dodać wpis:

# Connection type   Database   User       IP addresses   Method
host                all        postgres   127.0.0.1/32   md5

Musisz wstawić wpis, zanim inne wpisy zostaną dopasowane do twojego połączenia przez psql . Jeśli masz wątpliwości co do tego, gdzie to umieścić, po prostu umieść go przed pierwszym nieskomentowanym wierszem.

Więcej informacji o pg_hba.conf

Z PostgreSQL: Dokumentacja: 9.3: Plik pg_hba.conf [moja odważna czcionka ]:

Pierwszy rekord z pasującym typem połączenia , adresem klienta , żądaną bazą danych i nazwą użytkownika służy do przeprowadzenia uwierzytelnienia. Nie ma „awaryjnego” lub „zapasowego”: jeśli wybrany zostanie jeden rekord i uwierzytelnienie nie powiedzie się, kolejne rekordy nie będą brane pod uwagę. Jeśli żaden rekord nie pasuje, dostęp jest zabroniony.

Pamiętaj, że rekordy nie są dopasowane w metodzie uwierzytelnienia. Jeśli więc plik pg_hba.conf zawiera następujący wpis:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  peer

Wtedy nie będziesz mógł połączyć się przez:

psql -u postgres

Chyba że jeden z tych wpisów znajduje się w pliku pg_hba.conf nad poprzednim wpisem:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5
local               all        postgres                  password   # Unencrypted!
local               all        all                       md5
local               all        all                       password   # Unencrypted!

2
spóźniony do gry, ale poważnie, dziękuję za włożenie wysiłku, aby wyjaśnić wszystko poprawnie, aby zrozumieć!
Jeffrey 'jf' Lim

10

W moim przypadku rozwiązanie tutaj: (dla osób zainteresowanych) zaloguj się do postgres:

sudo -i -u postgres
psql
ALTER USER postgres WITH PASSWORD 'postgres'; # type your password here

pozdrowienia


7

Problemem jest nadal plik pg_hba.conf. Ta linia: możesz znaleźć ten plik w / etc / postgres / varion / main

local   all             postgres                                peer
Should be

local   all             postgres                                md5

Są to krótkie opisy obu opcji zgodnie z oficjalnymi dokumentami PostgreSQL dotyczącymi metod uwierzytelniania.

Uwierzytelnianie rówieśnicze

Metoda uwierzytelniania równorzędnego polega na uzyskaniu nazwy użytkownika systemu operacyjnego klienta z jądra i użyciu jej jako dozwolonej nazwy użytkownika bazy danych (z opcjonalnym odwzorowaniem nazwy użytkownika). Ta metoda jest obsługiwana tylko w połączeniach lokalnych.

Uwierzytelnianie za pomocą hasła

Metody uwierzytelniania oparte na haśle to md5 i hasło. Metody te działają podobnie, z wyjątkiem sposobu, w jaki hasło jest wysyłane przez połączenie, a mianowicie odpowiednio skrótu MD5 i tekstu jawnego.

Jeśli martwisz się atakami typu „wąchanie” haseł, preferowane jest md5. W miarę możliwości należy zawsze unikać zwykłego hasła. Jednak md5 nie może być używany z funkcją db_user_namespace. Jeśli połączenie jest chronione przez szyfrowanie SSL, hasło może być bezpiecznie używane (chociaż uwierzytelnianie certyfikatu SSL może być lepszym wyborem, jeśli zależy od korzystania z SSL).

Po zmianie tego pliku nie zapomnij zrestartować serwera PostgreSQL. Jeśli korzystasz z Linuksa, byłoby to możliwesudo service postgresql restart.


7

Dla fedora26 i postgres9.6

Najpierw zaloguj się jako użytkownik root, a następnie wpisz psql, wykonując następujące polecenia

$ su postgres  

następnie

$ psql

w psqlznajdź położenie pliku hba ==> oznaczapg_hba.conf

postgres=# show hba_file ; 
 hba_file  
--------------------------------------   
 /etc/postgresql/9.6/main/pg_hba.conf  
(1 row)  

w pliku pg_hba.confzmień dostęp użytkownika do tego

host all all 127.0.0.1/32 md5

6

moim rozwiązaniem w PostgreSQL 9.3 na Mac OSX w powłoce bash było sudoprzejście do folderu danych, a następnie dodanie niezbędnych wierszy do pg_hba.confpliku, aby wszyscy użytkownicy mogli być zaufani i mogli się zalogować. Tak właśnie zrobiłem :

# in bash_profile edit PGDATA environmental variable
open ~/.bash_profile

# append this line to bash_profile
export PGDATA="/Library/PostgreSQL/9.3/data"

# reload bash_profile
source ~/.bash_profile

# open pg_hba.conf in vim
sudo vi /Library/PostgreSQL/9.3/data/pg_hba.conf

# append these two lines to the end of the pg_hba.conf file
local   all   all                  trust
host    all   all   127.0.0.1/32   trust

# can now login as user in bash
psql -d <db_name> -U <user_name> -W

1
Jest to w porządku dla serwera programistycznego, ale nie poleciłbym tego w środowisku produkcyjnym, ponieważ nie potrzebujesz już hasła do łączenia się z bazą danych przy tych ustawieniach.
Michael


4

Spędziłem więcej czasu na rozwiązywaniu tego błędu, który chcę przyznać.

Kolejność konfiguracji uwierzytelniania w pg_hba.conf jest właściwa w twoim przypadku. Domyślny plik konfiguracyjny zawiera kilka wierszy instalacji waniliowej. Te wartości domyślne mogą odpowiadać warunkom prób uwierzytelnienia, powodując niepowodzenie uwierzytelnienia. Nie powiedzie się niezależnie od dodatkowej konfiguracji dodanej na końcu pliku .conf.

Aby sprawdzić, który wiersz konfiguracji jest używany, sprawdź domyślny plik dziennika komunikatów. Możesz zobaczyć coś takiego

LOG:  could not connect to Ident server at address "127.0.0.1", port 113: Connection refused
FATAL:  Ident authentication failed for user "acme" 
DETAIL:  Connection matched pg_hba.conf line 82: "host     all             all             127.0.0.1/32            ident"

Okazuje się, że ta domyślna linia powoduje odrzucenie.

host    all             all             127.0.0.1/32            ident

spróbuj to skomentować.


3

Jeden hack wokół tego jest edycja pg_hba.conf

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

Tymczasowo

# Database administrative login by Unix domain socket
local   all             postgres                                   trust

W tym momencie jesteś skończony. Dla bezpieczeństwa, idź i

sudo -u postgres psql template1
ALTER USER postgres with encrypted password 'your_password';

następnie wróć i ustaw pg_hba.conf z powrotem na

# Database administrative login by Unix domain socket
local   all             postgres                                   md5

1

Miałem podobny problem i naprawiłem go w pg_hba.conf podczas usuwania wszystkich metod ident , nawet dla adresu IP6 (pomimo tego, że mam tylko IP4 na komputerze).

host all all 127.0.0.1/32 password
host all all ::1/128 password
#for pgAdmin running at local network
host all all 192.168.0.0/24 md5

0

Miałem ten sam problem po wykonaniu następujących czynności: Instalacja PostgreSQL dla rozwoju Railsów w Ubuntu 12.04

Próbowałem innych odpowiedzi, ale wszystko, co musiałem zrobić, to: „config / database.yml”

development:
  adapter: postgresql
  encoding: unicode
  database: (appname)_development
  pool: 5
  username: (username you granted appname database priviledges to)
  password:

0

Jeśli używasz go w CentOS, może być konieczne ponowne załadowanie postgres po wykonaniu powyższych rozwiązań:

systemctl restart postgresql-9.3.service

Teraz jest tylkopostgresql
Neil Chowdhury

@NeilChowdhury usługa postgresql wciąż ma wersję w nazwie usługi przynajmniej w systemach Linux. Uruchom to polecenie, aby zobaczyćsystemctl status | grep postgres
Ikrom

0

Musiałem ponownie zainstalować pdAdmin, aby rozwiązać ten problem

brew cask reinstall pgadmin4

0

W systemie Windows, jeśli nie chcesz edytować pb_gba.conf, tj. Pozostaw metodę MD5 (domyślnie), utwórz nowego użytkownika, uruchamiając to zapytanie w narzędziu do wysyłania zapytań w PGadmin PGadmin

CREATE USER admin WITH PASSWORD 'secret'

następnie w cmd

psql "dbname=Main_db host=127.0.0.1 user=admin password=secret port=5432

gdzie dbname to twój db w postgresql

wprowadź opis zdjęcia tutaj


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.