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ę?

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

Marcelo De Polli
źródło
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

Arivarasan L.
źródło
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ę!

StylusEater
źródło
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
iamuser2
źródło
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';

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

Taimoor Changaiz
źródło
15
sudo psql --host=localhost --dbname=database-name --username=postgres

To rozwiązało mój problem

Gihan Gamage
źródło
3
Nie sądziłem, że to będzie takie proste, ale zadziałało to dla mnie w debianie 9
Hayden Thring
Działa
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.

nirvanastack
źródło
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
Åsmund
źródło
„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=#
Luca Marletta
źródło
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
sibosop
źródło
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 .

Supun Muthutantrige
źródło
6

Użyj host=localhostw połączeniu.

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);
Manisha Vasani
źródło
5

poniższe polecenie działa dla mnie:

psql -d myDb -U username -W
Mazen Ora
źródło
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.

Alexandr Zaichenko
źródło
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!

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

tayfun Kılıç
źródło
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.

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

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

ImranNaqvi
źródło