Wystąpił błąd: nie powiodło się uwierzytelnianie rówieśnicze dla użytkownika „postgres” podczas próby uzyskania pgsql do pracy z szynami


737

Pojawia się błąd:

FATAL: Peer authentication failed for user "postgres"

kiedy próbuję sprawić, aby postgres działał z Railsami.

Oto mój pg_hba.conf, mój database.ymli zrzut pełnego śladu .

Zmieniłem uwierzytelnianie na md5 w pg_hba i próbowałem różnych rzeczy, ale żadna z nich nie działa.

Próbowałem także utworzyć nowego użytkownika i bazę danych zgodnie z Rails 3.2, FATAL: Uwierzytelnienie użytkownika nie powiodło się (PG :: Błąd)

Ale nie pojawiają się na pgadminie, ani nawet kiedy biegam sudo -u postgres psql -l.

Masz pomysł, gdzie się mylę?


1
1): Upewnij się, że masz użytkownika o nazwie „postgres” i masz prawo do swojej bazy danych 2): Upewnij się, że ma hasło 3): Upewnij się, że twoja konfiguracja / database.yml zawiera poświadczenia praw (nazwa użytkownika + hasło)
— MrYoshiji

2
potrzebuję rówieśnika i wcięcia
— Everyplace

13
Zobacz także tę odpowiedź - połączenie może się nie powieść, localhostale uda się 127.0.0.1.
— uvsmtid

9
W moim przypadku musiałem dodać host: localhostdo database.ymlpliku.
— Mihail Velikov

Odpowiedzi:


1027

Problemem jest nadal Twój pg_hba.confplik ( /etc/postgresql/9.1/main/pg_hba.conf*).

Ta linia:

local   all             postgres                                peer

Powinien być:

local   all             postgres                                md5

* Jeśli nie możesz znaleźć tego pliku, uruchomienie locate pg_hba.confpowinno pokazywać, gdzie jest plik.

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

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 nazw użytkowników). 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 certyfikatem SSL może być lepszym wyborem, jeśli zależy od korzystania z SSL).

Przykładowa lokalizacja dla pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Będziesz musiał ponownie załadować swoją usługę postgresql po zmianie/etc/init.d/postgresql reload
— funkotron

78
umieszczam to tutaj, ponieważ zawsze zapominam, gdzie jest ten plik/etc/postgresql/9.1/main/pg_hba.conf
— Doug

12
@funkotron Przynajmniej na mojej instalacji ElementaryOS (Ubuntu) sudo service postgreql restartrównież działa.
— Marnen Laibow-Koser

13
Aby odpowiedzieć na moje pytanie: uwierzytelnianie „równorzędne” oznacza, że ​​postgres prosi system operacyjny o nazwę logowania i używa go do uwierzytelnienia, więc użytkownik w systemie operacyjnym i postgres musi być taki sam. „md5” wykorzystuje szyfrowane uwierzytelnianie za pomocą hasła.
— Dennis

9
Rozumiem zmianę. Ale dlaczego nie jest to zachowanie domyślne? Czy jest jakaś wada przy użyciu md5?
— Victor Marconi,

361

Po zainstalowaniu Postgresql wykonałem poniższe kroki.

  1. otwórz plik pg_hba.confdla Ubuntu, w którym będzie on /etc/postgresql/9.x/maini zmień ten wiersz:

    lokalne wszystkie postgres peer

    do

    lokalne wszystkie postgres trust
  2. Uruchom ponownie serwer

    $ sudo service postgresql restart
  3. Zaloguj się do psql i ustaw hasło

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Wreszcie zmień pg_hba.confz

    lokalne wszystkie postgres trust

    do

    lokalne wszystkie postgres md5

Po zrestartowaniu serwera postgresql możesz uzyskać do niego dostęp za pomocą własnego hasła

Szczegóły metod uwierzytelniania:

zaufanie - każdy, kto może połączyć się z serwerem, jest uprawniony do dostępu do bazy danych

peer - użyj nazwy użytkownika systemu operacyjnego klienta jako nazwy użytkownika bazy danych, aby uzyskać do niego dostęp.

md5 - uwierzytelnianie za pomocą hasła

w celu uzyskania dalszych informacji sprawdź tutaj


17
zmiana metody na „zaufanie” działała dla mnie. +1 za wyjaśnienie szczegółów metody uwierzytelnienia.
— La-comadreja,

4
W OS X homebrew domyślnym jest zaufanie, podczas gdy w Ubuntu jakoś domyślnie jest ustawione na „peer”, co doprowadziło do rozbieżności między moją konfiguracją a konfiguracją mojego kolegi. Zmieniliśmy jego na MD5, co nie pomogło, więc „zaufanie” jest tutaj prawdziwą odpowiedzią (przeprowadzamy tylko testy programistyczne). Powinien uzyskać więcej głosów pozytywnych.
— Xji

2
możesz też ustawić md5 w każdym miejscu od samego początku
— Artem.Borysov

2
Ten sposób działa dla mnie, nie była to metoda md5.
— sianipard

potrzebujesz użyć tych samych haseł? sudo passwd postgres
— Peter Krauss

211

Jeśli łączysz się przez localhost (127.0.0.1), nie powinieneś doświadczać tego konkretnego problemu. Nie zrobiłbym wiele z pg_hba.conf, ale zamiast tego dostosowałbym twój ciąg połączenia:

psql -U someuser -h 127.0.0.1 database

gdzie użytkownik to użytkownik, z którym się łączysz, a baza danych to baza danych, z którą użytkownik ma uprawnienia do łączenia się.

Oto, co robię na Debianie, aby skonfigurować postgres:

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

Cieszyć się!


16
Myślę, że to najlepsze rozwiązanie, ponieważ faktycznie rozwiązuje lokalny problem bez bałaganu bez bałaganu w konfiguracji globalnej, jak zalecają inne odpowiedzi.
— jeteon

1
Musiałem zmienić host: 127.0.0.1domyślny na localhost w config / database.yml - jest na tej samej maszynie, więc nie rozumiem dlaczego
— Anthony

Anthony, czy mówisz, że wystąpił błąd połączenia, dopóki nie dostosowałeś localhost do 127.0.0.1 w pliku database.yml? Jeśli tak jest, sugeruję sprawdzenie pliku / etc / hosts. W przeciwnym razie może występować inna dziwność związana z rozwiązaniem localhost.
— StylusEater

1
Jest to o wiele bardziej eleganckie w porównaniu do bałaganu przy użyciu metody lokalnego uwierzytelniania równorzędnego.
— mdh

1
To zdecydowanie najlepsze rozwiązanie IMO
— Salil Junior

45

To zadziałało dla mnie !!

sudo -u postgres psql

powinno to działać poprawnie, o ile bieżący zalogowany użytkownik znajduje się w pliku sudoers.
— Abubacker Siddik

16

Jeśli masz problem, musisz go zlokalizować pg_hba.conf. Polecenie to:

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

a następnie zmień plik konfiguracyjny:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

Następnym krokiem jest: Ponowne uruchomienie instancji db:

service postgresql-9.3 restart

Jeśli masz jakieś problemy, musisz ponownie ustawić hasło:

ALTER USER db_user with password 'db_password';


16
  1. Przejdź do tego /etc/postgresql/9.x/main/ i otwórz plik pg_hba.conf

W moim przypadku:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Wymienić Peer z md5

Zostanie to zmienione na:

Logowanie administracyjne bazy danych przez gniazdo domeny Unix lokalne wszystkie 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

To:

Logowanie administracyjne bazy danych przez gniazdo domeny Unix wszystkie lokalne 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. Następnie zrestartuj serwer pg:

    $> sudo service postgresql restart

Poniżej znajduje się lista metod używanych do łączenia się z postgres:

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

Uwaga: Jeśli jeszcze go nie utworzyłeś, opublikuj postgres użytkownika. Utwórz to i teraz możesz uzyskać dostęp do serwera Postgres przy użyciu poświadczeń tego użytkownika.

WSKAZÓWKA: Jeśli nie działa po ponownym uruchomieniu postgres, zamknij terminal i otwórz ponownie.


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

To rozwiązało mój problem


3
Nie sądziłem, że to będzie takie proste, ale zadziałało to dla mnie w debianie 9
— Hayden Thring


Dzięki, działa na Ubuntu 19.10 i psql 12.3
— Happy Singh

10

Miałem ten sam problem.

Rozwiązanie od depa jest absolutnie poprawne.

Upewnij się tylko, że masz skonfigurowanego użytkownika do korzystania z PostgreSQL.

Sprawdź plik:

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

Zgoda na ten plik powinna zostać udzielona użytkownikowi, u którego zarejestrowałeś swój psql.

Dalej. Jeśli jesteś dobry do tej pory ...

Zaktualizuj zgodnie z instrukcjami @ depa.

to znaczy

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

a następnie wprowadź zmiany.


Mam do czynienia z tym samym problemem. Ale jakich uprawnień potrzebuję, nie wiem. możesz mi pomóc. Otrzymuję dane wyjściowe polecenia „ls”-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
— niedz.

8

Jeśli chcesz zachować domyślną konfigurację, ale chcesz autoryzacji md5 z połączeniem gniazdowym dla jednego konkretnego połączenia użytkownik / db, dodaj linię „lokalną” PRZED linią „lokalną wszystko / wszystko”:

# 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

„PRZED” w tej odpowiedzi zasługuje na bardziej szczegółowe opracowanie w innych odpowiedziach. Okazuje się, że psql sprawdza sekwencje w pliku pg_hba.conf sekwencyjnie, jak podano w dokumentach: postgresql.org/docs/11/static/auth-pg-hba-conf.html
— eaydin

# TYP BAZY DANYCH METODA ADRESU UŻYTKOWNIKA lokalna nazwa użytkownika dbname md5 # <- ten wiersz Nie w porządku
— Kiry Zmierza

7

Przenosiłem katalog danych na sklonowany serwer i miałem problemy z zalogowaniem się jako postgres. Zresetowanie takiego hasła postgres działało dla mnie.

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#

6

Powyższe zmiany działały dla mnie, gdy zorientowałem się, że po ich wykonaniu muszę zrestartować serwer Postgres. W przypadku Ubuntu:

sudo /etc/init.d/postgresql restart

6

Zmiana elementu równorzędnego METHOD na zaufanie do pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | linia 85) rozwiązuje problem. Dodanie md5 wymaga podania hasła, dlatego jeśli istnieje potrzeba unikania używania haseł, użyj zaufania zamiast md5 .


6

Użyj host=localhostw połączeniu.

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

5

poniższe polecenie działa dla mnie:

psql -d myDb -U username -W

mężczyzna 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.
— Yaroslav Nikitenko

3

Musisz tylko ustawić METODĘ na zaufanie.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

I przeładuj serwer Postgres.

# service postgresql-9.5 reload

Zmiany w pg_hba.conf nie wymagają RESTART serwera postgres. po prostu RELOAD.


3

Wiele innych odpowiedzi dotyczy ustawień w różnych plikach konfiguracyjnych, a te dotyczące do pg_hba.confmają zastosowanie i są w 100% poprawne. Upewnij się jednak, że modyfikujesz prawidłowe pliki konfiguracyjne .

Jak wspomnieli inni, lokalizacje plików konfiguracyjnych można zastąpić różnymi ustawieniami w głównym pliku konfiguracyjnym, a także podać ścieżkę do głównego pliku konfiguracyjnego w wierszu polecenia z -Dopcją.

Możesz użyć następującego polecenia podczas sesji psql, aby pokazać, gdzie czytane są twoje pliki konfiguracyjne (zakładając, że możesz uruchomić psql). To tylko krok rozwiązywania problemów, który może pomóc niektórym osobom:

select * from pg_settings where setting~'pgsql';  

Powinieneś także upewnić się, że katalog domowy użytkownika postgres jest tam, gdzie się spodziewasz. Mówię to, ponieważ dość łatwo to przeoczyć, ponieważ monit wyświetla „ ~” zamiast rzeczywistej ścieżki do katalogu domowego, co sprawia, że ​​nie jest to takie oczywiste. W wielu instalacjach domyślny katalog domowy użytkownika postgres to /var/lib/pgsql.

Jeśli nie jest ustawiony na taki, jaki powinien być, zatrzymaj usługę postgresql i użyj następującego polecenia, gdy jesteś zalogowany jako root. Upewnij się także, że użytkownik postgres nie jest zalogowany do innej sesji:

usermod -d /path/pgsql postgres

Na koniec upewnij się, że zmienna PGDATA jest ustawiona poprawnie, wpisując echo $PGDATA, co powinno dać wynik podobny do:

/path/pgsql/data

Jeśli nie jest ustawiony lub pokazuje coś innego niż się spodziewasz, sprawdź pliki startowe lub RC, takie jak .profile lub .bash.rc - będzie się to znacznie różnić w zależności od systemu operacyjnego i powłoki. Po określeniu poprawnego skryptu uruchamiania dla komputera możesz wstawić następujące elementy:

export PGDATA=/path/pgsql/data

W moim systemie umieściłem /etc/profile.d/profile.local.shgo tak, aby był dostępny dla wszystkich użytkowników.

Powinieneś być teraz w stanie zainicjować bazę danych jak zwykle, a wszystkie ustawienia ścieżki psql powinny być poprawne!


3

pg_config służy do informacji o kompilacji, aby pomóc rozszerzeniom i programom klienckim kompilować i łączyć się z PostgreSQL. Nic nie wie o aktywnych instancjach PostgreSQL na komputerze, tylko pliki binarne.

pg_hba.conf może pojawić się w wielu innych miejscach, w zależności od sposobu instalacji Pg. Standardową lokalizacją jest pg_hba.conf w katalogu danych bazy danych (która może znajdować się w katalogu / home, / var / lib / pgsql, / var / lib / postgresql / [wersja] /, / opt / postgres / itd. Itd. Itd.) ale użytkownicy i pakujący mogą je umieścić w dowolnym miejscu. Niestety.

Jedynym prawidłowym sposobem znalezienia pg_hba.conf jest zapytanie działającej instancji PostgreSQL, gdzie jest pg_hba.conf, lub zapytanie sysadmin, gdzie ona jest. Nie możesz nawet polegać na pytaniu, gdzie znajduje się datadir i analizowaniu pliku postgresql.conf, ponieważ skrypt inicjujący może przekazać parametr taki jak -c plik_ba_bba = / some / other / path podczas uruchamiania Pg.

Co chcesz zrobić, to zapytać PostgreSQL:

SHOW hba_file;

Ta komenda musi być uruchomiona w sesji superużytkownika, więc dla skryptów powłoki możesz napisać coś takiego:

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

i ustaw zmienne środowiskowe PGUSER, PGDATABASE itp., aby upewnić się, że połączenie jest prawidłowe.

Tak, jest to w pewnym sensie problem z kurczakiem i jajkiem, ponieważ jeśli użytkownik nie może się połączyć (powiedzmy, po zepsuciu edycji pg_hba.conf), nie możesz znaleźć pg_hba.conf, aby go naprawić.

Inną opcją jest przyjrzenie się wynikowi polecenia ps i sprawdzenie, czy argument -D katalogu danych postmaster -D jest tam widoczny, np

ps aux  | grep 'postgres *-D'

ponieważ pg_hba.conf znajdzie się w katalogu danych (chyba że korzystasz z Debiana / Ubuntu lub jakiejś pochodnej i używasz ich pakietów).

Jeśli celujesz w konkretne systemy Ubuntu z PostgreSQL zainstalowanym z pakietów Debian / Ubuntu, staje się to trochę łatwiejsze. Nie musisz mieć do czynienia z ręcznie skompilowanym ze źródła Pg, dla którego ktoś zainicjował katalog danych w swoim katalogu domowym, lub instalację EnterpriseDB Pg w / opt itp. Możesz zapytać pg_wrapper, Debian / Ubuntu multi -version Pg manager, gdzie PostgreSQL używa komendy pg_lsclusters z pg_wrapper.

Jeśli nie możesz się połączyć (Pg nie działa lub musisz edytować plik pg_hba.conf, aby się połączyć), musisz przeszukać system w poszukiwaniu plików pg_hba.conf. W systemach Mac i Linux wystarczy coś takiego jak sudo find / -type f -name pg_hba.conf. Następnie sprawdź plik PG_VERSION w tym samym katalogu, aby upewnić się, że jest to poprawna wersja PostgreSQL, jeśli masz więcej niż jedną. (Jeśli pg_hba.conf znajduje się w / etc /, zignoruj ​​to, zamiast tego jest to nazwa katalogu nadrzędnego). Jeśli masz więcej niż jeden katalog danych dla tej samej wersji PostgreSQL, musisz spojrzeć na rozmiar bazy danych, sprawdź wiersz poleceń uruchomionego postgresu z ps, aby sprawdzić, czy argument katalogu danych -D pasuje do miejsca, w którym edytujesz itp. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Mój problem polegał na tym, że nie wpisałem żadnego serwera. Myślałem, że jest domyślny z powodu symbolu zastępczego, ale kiedy wpisałem localhost, zadziałało.


2

Jeśli próbujesz zlokalizować ten plik w chmurze 9, możesz to zrobić

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

Naciśnij, Iaby edytować / wstawić, naciśnij ESC3 razy, a typ :wqzapisze plik i wyjdzie


2

Jeśli masz do czynienia z tym problemem z szynami i wiesz, że już utworzyłeś tę nazwę użytkownika z hasłem wraz z prawidłowymi prawami, wystarczy umieścić następujące na końcu pliku database.yml.

host: localhost

ogólny plik będzie wyglądał jak poniżej

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

W ogóle nie musisz dotykać pg_hba.confpliku. Szczęśliwego kodowania


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.