Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

peer authentication failed - logowanie lokalne przez psql

W skrócie

  • Logujesz się lokalnie przez psql i dostajesz błąd o nieudanym uwierzytelnieniu metodą peer, mimo że hasło znasz.
  • Metoda peer nie sprawdza hasła, tylko porównuje nazwę użytkownika systemu operacyjnego z nazwą roli w bazie, a te się u Ciebie nie zgadzają.
  • Zaloguj się jako właściwy użytkownik systemu, dopasuj nazwy przez mapę użytkowników albo zmień metodę na hasłową w pg_hba.conf.

Błąd o nieudanym uwierzytelnieniu metodą peer myli wielu początkujących, bo pojawia się nawet wtedy, gdy hasło jest poprawne. Sęk w tym, że przy tej metodzie hasło w ogóle nie jest brane pod uwagę. Wyjaśnimy Ci, na czym polega uwierzytelnianie peer, dlaczego blokuje logowanie na przykład na konto postgres i jak połączyć się z bazą lokalnie na kilka różnych sposobów. Temat dotyczy każdego, kto pracuje z PostgreSQL na Linuksie i loguje się z tej samej maszyny.

Jak to wygląda w praktyce

Wpisujesz polecenie logowania przez psql, podajesz użytkownika bazy, a terminal odpowiada komunikatem o nieudanym uwierzytelnieniu metodą peer dla tej roli. Hasła nawet nie zdążyłeś podać albo podałeś je, a i tak nic to nie dało. Najczęściej trafia się to przy próbie zalogowania na konto postgres z poziomu własnego, zwykłego konta w systemie. Co ciekawe, ten sam użytkownik potrafi zalogować się bez problemu przez połączenie sieciowe, czyli podając adres hosta, a lokalnie odbija się od tego błędu. To pierwsza wskazówka, że problem leży w metodzie uwierzytelniania dla połączeń lokalnych.

Dlaczego tak się dzieje

PostgreSQL na Linuksie dla połączeń przez gniazdo lokalne domyślnie używa metody peer. Działa ona zupełnie inaczej niż logowanie hasłem. Serwer pyta system operacyjny, jak nazywa się użytkownik, który nawiązuje połączenie przez gniazdo, i sprawdza, czy ta nazwa zgadza się z nazwą roli w bazie, na którą chcesz się zalogować. Jeśli jesteś zalogowany w systemie jako, powiedzmy, andrzej, a próbujesz wejść do bazy jako postgres, nazwy się nie zgadzają i uwierzytelnienie pada, niezależnie od tego, jakie hasło znasz. Hasło przy metodzie peer nie jest w ogóle sprawdzane. Dlatego to samo konto działa przez sieć, bo połączenia sieciowe zwykle mają w pg_hba.conf przypisaną metodę hasłową, na przykład scram-sha-256, a nie peer. Cała różnica bierze się z tego, który wiersz pliku pg_hba.conf pasuje do danego typu połączenia.

Jak to rozwiązać krok po kroku

  1. Najprostsza droga: zaloguj się w systemie jako użytkownik o tej samej nazwie co rola w bazie. Aby wejść na konto postgres, przełącz się na użytkownika systemowego postgres i dopiero z niego uruchom psql. Wtedy nazwy się zgadzają i peer przepuszcza połączenie.
  2. Jeśli chcesz logować się do bazy jako postgres z własnego konta, wskaż połączenie przez sieć zamiast przez gniazdo lokalne, podając w psql host, na przykład localhost. Trafisz wtedy na wiersz z metodą hasłową i podasz hasło.
  3. Gdy potrzebujesz na stałe pozwolić konkretnemu użytkownikowi systemu logować się jako inna rola, użyj mapy użytkowników w pliku pg_ident.conf i wskaż tę mapę w pg_hba.conf przy metodzie peer. To pozwala powiązać nazwę z systemu z nazwą roli w bazie.
  4. Alternatywnie zmień metodę dla połączeń lokalnych w pg_hba.conf z peer na hasłową, na przykład scram-sha-256, jeśli wolisz logować się hasłem także lokalnie. Pamiętaj, że rola musi mieć wtedy ustawione hasło.
  5. Po każdej zmianie w pg_hba.conf albo pg_ident.conf przeładuj konfigurację, bo oba pliki wczytują się przez reload, a nie wymagają restartu.
  6. Sprawdź, który wiersz pg_hba.conf faktycznie pasuje do Twojego połączenia, bo dopasowanie idzie od góry i wygrywa pierwszy pasujący wpis. Kolejność wierszy ma znaczenie.

Jak sprawdzić, że zadziałało

Logowanie działa, gdy po wydaniu polecenia psql trafiasz do znaku zachęty bazy zamiast do komunikatu o błędzie. Wykonaj SELECT current_user;, żeby potwierdzić, jaką rolą faktycznie jesteś zalogowany, bo to pokazuje, czy dopasowanie nazw zadziałało zgodnie z oczekiwaniem. Jeśli zmieniałeś metodę uwierzytelniania, sprawdź, że przy logowaniu hasłem serwer faktycznie pyta o hasło i akceptuje poprawne. Możesz też zajrzeć do dziennika serwera, gdzie przy nieudanych próbach widać, która metoda i dla której roli zawiodła, co potwierdza, że pracujesz na właściwym wierszu konfiguracji.

Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Szkolenie Zaawansowana administracja PostgreSQL - HA, DR, monitoring, skalowanie

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Na czym polega uwierzytelnianie metodą peer?
Metoda peer nie sprawdza hasła. Zamiast tego serwer pyta system operacyjny o nazwę użytkownika nawiązującego połączenie przez gniazdo lokalne i porównuje ją z nazwą roli, na którą próbujesz się zalogować. Jeśli obie nazwy się zgadzają, połączenie przechodzi, a jeśli nie, uwierzytelnienie pada, niezależnie od tego, jakie hasło znasz. Dlatego przy peer podawanie hasła nic nie zmienia.
Dlaczego to samo konto działa przez sieć, a lokalnie dostaję peer authentication failed?
Bo dla różnych typów połączeń w pliku pg_hba.conf obowiązują różne wiersze. Połączenia przez gniazdo lokalne mają zwykle przypisaną metodę peer, a połączenia sieciowe metodę hasłową, na przykład scram-sha-256. Dlatego logowanie z podaniem hosta trafia na wiersz z hasłem i działa, a to samo bez hosta trafia na peer i odbija się od niego, gdy nazwy się nie zgadzają.
Jak zalogować się na konto postgres, gdy blokuje mnie peer?
Najprościej przełącz się w systemie na użytkownika systemowego postgres i dopiero z niego uruchom psql, bo wtedy nazwa z systemu zgadza się z rolą w bazie. Alternatywnie połącz się przez sieć, podając w psql host localhost, aby trafić na wiersz z metodą hasłową i podać hasło. Obie drogi omijają wymóg zgodności nazw właściwy dla metody peer.
Czy można na stałe pozwolić użytkownikowi systemu logować się jako inna rola?
Tak, służy do tego mapa użytkowników w pliku pg_ident.conf, którą wskazujesz w pg_hba.conf przy metodzie peer. Mapa wiąże nazwę użytkownika z systemu z nazwą roli w bazie, więc możesz pozwolić na przykład swojemu kontu logować się jako postgres. Po zmianie w pg_ident.conf albo pg_hba.conf przeładuj konfigurację, bo oba pliki wczytują się przez reload.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...