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?

morficzny
źródło
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ć.

Frank Heikens
źródło
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
Manav
źródło
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
1
Udokumentowano to tutaj: help.ubuntu.com/12.04/serverguide/postgresql.html
Hendra Uzia
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
Danny Milosavljevic
źródło
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.

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

boulder_ruby
źródło
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:
Ivan Trechyokas
źródło
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ć.

Ethan Brown
źródło
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 
Joseph Persie
źródło
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.

Dustin Kirkland
źródł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!
Kenny Evitt
źródło
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

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

Suneel Kumar
źródło
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
mohsen.nour
źródło
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
Aaron Lelevier
źródło
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ć.

Jeremy Whiting
źródło
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
ntg
źródło
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
TMa
źródło
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:
Daniel
źródło
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
Jaswinder
źródło
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
Sofia Khwaja
źródło
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

Ajay Tom George
źródło
-3

To zadziałało dla mnie: http://tecadmin.net/fatal-ident-authentication-failed-for-user-postgres/#

local   all             postgres                                trust
local   all             myapp_usr                               trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 trust
Ing. M.D'Ambrosio
źródło
1
To pozwala każdemu z localhost zalogować się jako dowolny użytkownik. To zachowanie nie jest wspomniane nigdzie w łączu. I tak, strony informacyjne debiana zawierają to samo.
rkapl