Hata alma: pgsql'nin raylarla çalışmasına çalışırken "postgres" kullanıcısı için eş kimlik doğrulaması başarısız oldu


737

Hatayı alıyorum:

FATAL: Peer authentication failed for user "postgres"

postgreslerin Rails ile çalışmasını sağlamaya çalıştığımda.

İşte benim pg_hba.conf, benim database.ymlve tam izin bir dökümü .

Kimlik doğrulamasını pg_hba'da md5 olarak değiştirdim ve farklı şeyler denedim, ancak hiçbiri işe yaramadı.

Ayrıca Rails 3.2, FATAL uyarınca yeni bir kullanıcı ve veritabanı oluşturmayı denedim : Kullanıcı için eş kimlik doğrulaması başarısız oldu (PG :: Hata)

Ama pgadmin'de ya da koştuğumda bile görünmüyorlar sudo -u postgres psql -l.

Nerede yanlış yaptığım hakkında bir fikrin var mı?


1
1): emin "postgres" oluşturulur ve Veritabanı sağ sahip adında bir kullanıcı var olun ) 2: emin o bir parolaya sahip olun 3): emin olun yapılandırma / database.yml hakları kimlik bilgilerini (kullanıcı adı + şifre) içerir
MrYoshiji

2
md5 olarak ayarlanmış her yerde akran ve girinti gerekir
Artem.Borysov

13
Ayrıca bkz . Bu cevap - bağlantı başarısız olabilir localhostancak başarılı olabilir 127.0.0.1.
uvsmtid

9
Benim durumumda ben eklemek için gerekli host: localhostde database.ymldosyaya.
Mihail Velikov

Yanıtlar:


1027

Sorun hala pg_hba.confdosyanız ( /etc/postgresql/9.1/main/pg_hba.conf*).

Bu hat:

local   all             postgres                                peer

Olmalı:

local   all             postgres                                md5

* Bu dosyayı bulamıyorsanız, çalışan locate pg_hba.confdosyanın nerede olduğunu göstermelidir.

Bu dosyayı değiştirdikten sonra PostgreSQL sunucunuzu yeniden başlatmayı unutmayın. Linux kullanıyorsanız, bu olurdu sudo service postgresql restart.

Bunlar, kimlik doğrulama yöntemleri hakkındaki resmi PostgreSQL belgelerine göre her iki seçeneğin kısa açıklamalarıdır .

Eş kimlik doğrulaması

Eş kimlik doğrulama yöntemi, istemcinin işletim sistemi kullanıcı adını çekirdekten alıp izin verilen veritabanı kullanıcı adı olarak (isteğe bağlı kullanıcı adı eşleme ile) kullanarak çalışır. Bu yöntem yalnızca yerel bağlantılarda desteklenir.

Parola kimlik doğrulaması

Parola tabanlı kimlik doğrulama yöntemleri md5 ve paroladır. Bu yöntemler, parolanın sırasıyla MD5 karma ve net metin üzerinden gönderilme biçimi dışında benzer şekilde çalışır.

Eğer şifre "koklama" saldırıları hakkında hiç endişe varsa o zaman md5 tercih edilir. Mümkünse düz parola her zaman kullanılmamalıdır. Ancak md5, db_user_namespace özelliğiyle kullanılamaz. Bağlantı SSL şifrelemesi ile korunuyorsa, şifre güvenli bir şekilde kullanılabilir (ancak SSL kullanımına bağlıysa SSL sertifikası kimlik doğrulaması daha iyi bir seçim olabilir).

İçin örnek konum pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Bunu değiştirdikten sonra postgresql hizmetinizi yeniden yüklemeniz gerekecek/etc/init.d/postgresql reload
funkotron

78
Bu dosyanın nerede olduğunu hep unuttuğum için buraya koyuyorum/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron En azından ElementaryOS (Ubuntu) kurulumumda sudo service postgreql restartda çalışıyor.
Marnen Laibow-Koser

13
Kendi sorumu yanıtlamak için: 'eş' kimlik doğrulaması, postgres'in işletim sisteminden oturum açma adınızı istediğini ve bunu kimlik doğrulama için kullandığını, bu nedenle işletim sistemindeki ve postgres'deki kullanıcının aynı olması gerektiği anlamına gelir. 'md5' şifreli parola kimlik doğrulamasını kullanır.
Dennis

9
Değişimi anlıyorum. Peki bu neden varsayılan davranış değil? Md5 kullanmanın bir sakıncası var mı?
Victor Marconi

361

Postgresql'i yükledikten sonra aşağıdaki adımları yaptım.

  1. pg_hba.confiçinde olacak Ubuntu için dosyayı açın /etc/postgresql/9.x/mainve bu satırı değiştirin:

    yerel tüm postgres eş

    için

    yerel tüm postgres güven
  2. Sunucuyu yeniden başlatın

    $ sudo service postgresql restart
  3. Psql'ye giriş yapın ve şifrenizi ayarlayın

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Son pg_hba.confolarak

    yerel tüm postgres güven

    için

    yerel tüm postgres md5

Postgresql sunucusunu yeniden başlattıktan sonra, kendi şifrenizle erişebilirsiniz

Kimlik doğrulama yöntemleri ayrıntıları:

güven - sunucuya bağlanabilen herkes veritabanına erişmeye yetkilidir

peer - erişmek için veritabanı kullanıcı adı olarak istemcinin işletim sistemi kullanıcı adını kullanın.

md5 - şifre tabanlı kimlik doğrulama

daha fazla referans için buradan kontrol edin


17
yöntemi "güven" olarak değiştirmek benim için çalıştı. Kimlik doğrulama yöntemi ayrıntılarının açıklaması için +1.
La-comadreja

4
OS X homebrew'da varsayılan güven, Ubuntu'da varsayılan olarak "peer" olarak ayarlanmış, bu da benim kurulumumla meslektaşımın arasında tutarsızlıklara yol açtı. Biz onu MD5 olarak değiştirmedik, bu yüzden "güven" burada gerçek cevap (biz sadece geliştirme testi yapıyoruz). Daha fazla oy almalı.
xji

2
ayrıca
md5'i

2
Bu şekilde benim için çalışıyor, ilk önce md5 yöntemini kullanarak değildi.
sianipard

aynı şifreleri kullanmanız mı gerekiyor? sudo passwd postgres
Peter Krauss

211

Localhost (127.0.0.1) üzerinden bağlanıyorsanız, bu sorunla karşılaşmamalısınız. Ben pg_hba.conf ile çok muck olmaz ama bunun yerine bağlantı dizesini ayarlamak istiyorsunuz:

psql -U someuser -h 127.0.0.1 database

Burada bazı kullanıcı, bağlandığınız kullanıcı ve veritabanı, kullanıcının bağlanma iznine sahip olduğu veritabanıdır.

İşte postgres kurmak için Debian ne yapıyorum:

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

Zevk almak!


16
Diğer yanıtların önerdiği gibi, küresel yapılandırmayı bozmadan yerel sorunu gerçekten çözmeden çözdüğünü düşünüyorum.
jeteon

1
host: 127.0.0.1Varsayılan olarak config / database.yml dosyasında localhost'a geçmek zorunda kaldım - aynı makinede, bu yüzden nedenini anlamıyorum
Anthony

Anthony, database.yml dosyasında localhost ayarını yapana kadar bir bağlantı hatası yaşadığını mı söylüyorsun? Bu durumda / etc / hosts dosyanızı kontrol etmenizi öneririm. Aksi takdirde, yerel ana bilgisayarı çözmeyle ilgili başka tuhaflıklar olabilir.
StylusEater

1
Bu, yerel eş kimlik doğrulama yöntemiyle uğraşmaya kıyasla çok daha zariftir.
MHD

1
Bu açık ara en iyi çözüm IMO
Salil Junior

45

Bu benim için çalıştı !!

sudo -u postgres psql

geçerli oturum açmış kullanıcı sudoers dosyasında olduğu sürece bu iyi çalışmalıdır.
Abubacker Siddik

16

Bir sorununuz varsa, cihazınızı bulmanız gerekir pg_hba.conf. Komut:

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

ve bundan sonra yapılandırma dosyasını değiştirin:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

Sonraki adım: db örneğinizi yeniden başlatma:

service postgresql-9.3 restart

Herhangi bir sorunuz varsa, şifreyi tekrar ayarlamanız gerekir:

ALTER USER db_user with password 'db_password';


16
  1. Bu /etc/postgresql/9.x/main/ adresine gidin ve pg_hba.conf dosyasını açın

Benim durumumda:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Değiştir akran ile md5

Yani bu şu şekilde değiştirilecek:

Unix etki alanı soketi yerel tüm postgres eş tarafından veritabanı yönetici giriş

# 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

Bu:

Unix etki alanı soketi yerel tüm postgres md5 tarafından veritabanı yönetici giriş

# 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. Sonra pg sunucusunu yeniden başlatın:

    $> sudo service postgresql restart

Postgres ile bağlantı kurmak için kullanılan YÖNTEMLER aşağıda listelenmiştir:

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

Not: Henüz kullanıcı postgres oluşturmadıysanız. Bunu oluşturun ve şimdi bu kullanıcı kimlik bilgilerini kullanarak postgres sunucusuna erişebilirsiniz.

İPUCU: Postgres yeniden başladıktan sonra çalışmazsa, terminali kapatın ve tekrar açın.


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

Bu benim sorunumu çözdü


3
Bu kadar basit olacağını düşünmedim, ama bu benim için debian 9 altında çalıştı
Hayden Thring

Bu Ubuntu 19.10 üzerinde çalışıyor
Vithal Reddy

Teşekkürler, Ubuntu 19.10 ve psql 12.3 üzerinde çalışıyor
Happy Singh

10

Ben de aynı problemi yaşadım.

Depa'nın çözümü kesinlikle doğrudur.

Sadece PostgreSQL kullanmak için yapılandırılmış bir kullanıcı olduğundan emin olun.

Dosyayı kontrol edin:

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

Bu dosyanın izni psql'nizi kaydettirdiğiniz kullanıcıya verilmelidir.

Daha ileri. Şimdiye kadar iyiyseniz ..

@ Depa'nın talimatlarına göre güncelleyin.

yani

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

ve sonra değişiklikler yapın.


Aynı sorunla karşı karşıyayım. Ama hangi izinlere ihtiyacım var bilmiyorum. Bana yardımcı olabilir misiniz. 'Ls' komutu için çıktı alıyorum-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

Varsayılan yapılandırmayı korumak, ancak belirli bir kullanıcı / db bağlantısı için soket bağlantısıyla md5 kimlik doğrulaması yapmak istiyorsanız, "yerel tümü / tümü" satırından ÖNCE "yerel" bir satır ekleyin:

# 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

Bu yanıttaki "ÖNCE" diğer yanıtlarda daha fazla ayrıntılandırmayı hak ediyor. Psql, pg_hba.conf dosyasındaki kayıtları dokümanlarda belirtildiği gibi sırayla inceler: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# TİP VERİTABANI KULLANICI ADRESİ YÖNTEMİ yerel kullanıcı adı dbname md5 # <- bu satır Sırayla değil
Kiry Meas

7

Klonlanmış bir sunucuda veri dizinini taşıyordum ve postgres olarak oturum açmakta zorlanıyordum. Bunun gibi postgres şifresini sıfırlamak benim için çalıştı.

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

Postgres sunucusunu yaptıktan sonra yeniden başlatmam gerektiğini anladıktan sonra yukarıdaki düzenlemeler benim için çalıştı. Ubuntu için:

sudo /etc/init.d/postgresql restart

6

YÖNTEM değiştirme akran için güven pg_hba.conf içinde (/etc/postgresql/9.1/main/pg_hba.conf | çizgi 85) sorunu çözer. Md5 eklenmesi bir şifre ister, bu nedenle şifre kullanmaktan kaçınmak için bir gereklilik varsa , md5 yerine güven kullanın .


6

host=localhostBağlantıda kullanın .

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

5

Aşağıdaki komut benim için çalışıyor:

psql -d myDb -U username -W

adam 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

Sadece YÖNTEM'i güvenecek şekilde ayarlamanız gerekiyor.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

Ve postgres sunucusunu yeniden yükleyin.

# service postgresql-9.5 reload

Pg_hba.conf dosyasındaki değişiklikler RESTART postgres sunucusunu gerektirmez. sadece RELOAD.


3

Diğer yanıtların çoğu çeşitli yapılandırma dosyalarındaki ayarlarla ilgilidir ve pg_hba.confdo ile ilgili olanlar geçerlidir ve% 100 doğrudur. Ancak, doğru yapılandırma dosyalarını değiştirdiğinizden emin olun .

Diğerlerinin de belirttiği gibi, yapılandırma dosyası konumları, ana yapılandırma dosyasının içindeki çeşitli ayarlarla geçersiz kılmanın yanı sıra, komut satırındaki ana yapılandırma dosyasına bir yol sağlayarak -D seçenekle .

Bir psql oturumundayken, yapılandırma dosyalarınızın nerede okunduğunu göstermek için aşağıdaki komutu kullanabilirsiniz (psql'yi başlatabileceğinizi varsayarak). Bu sadece bazı insanlara yardımcı olabilecek bir sorun giderme adımıdır:

select * from pg_settings where setting~'pgsql';  

Ayrıca postgres kullanıcınızın giriş dizininin olmasını istediğiniz yerde olduğundan emin olmalısınız. Bunu söylüyorum çünkü isteminizin ~ana dizininizin gerçek yolu yerine ' ' göstermesi nedeniyle bunu göz ardı etmek oldukça kolay , bu da çok açık değil. Birçok kurulum postgres kullanıcı ana dizinini varsayılan olarak/var/lib/pgsql .

Ne olması gerektiği olarak ayarlanmamışsa, postgresql hizmetini durdurun ve root olarak oturum açarken aşağıdaki komutu kullanın. Ayrıca postgres kullanıcısının başka bir oturumda oturum açmadığından emin olun:

usermod -d /path/pgsql postgres

Son olarak, PGDATA değişkeninizin aşağıdakine echo $PGDATAbenzer bir çıktı vermesi gereken doğru ayarlandığından emin olun :

/path/pgsql/data

Ayarlanmamışsa veya olmasını beklediğinizden farklı bir şey gösteriyorsa, başlangıç ​​veya .profile veya .bash.rc gibi RC dosyalarını inceleyin - bu, işletim sisteminize ve kabuğunuza bağlı olarak büyük ölçüde değişecektir. Makineniz için doğru başlangıç ​​komut dosyasını belirledikten sonra, aşağıdakileri ekleyebilirsiniz:

export PGDATA=/path/pgsql/data

Sistemim için, bunu /etc/profile.d/profile.local.shtüm kullanıcılar için erişilebilir olacak şekilde yerleştirdim .

Artık her zamanki gibi veritabanını başlatabilmelisiniz ve tüm psql yolu ayarlarınız doğru olmalıdır!


3

pg_config, uyumluluk bilgileri, uzantıların ve istemci programlarının PostgreSQL ile derlenmesine ve bağlantı kurmasına yardımcı olmak içindir. Makinedeki etkin PostgreSQL örnekleri ile ilgili hiçbir şey bilmiyor, sadece ikili dosyalar.

pg_hba.conf, Pg'nin nasıl kurulduğuna bağlı olarak başka birçok yerde görünebilir. Standart konum, veritabanının data_dizini içinde pg_hba.conf'dur (/ home, / var / lib / pgsql, / var / lib / postgresql / [sürüm] /, / opt / postgres / vb. Vb. Olabilir) ancak kullanıcılar ve paketleyiciler istedikleri yere koyabilirler. Ne yazık ki.

Pg_hba.conf dosyasını bulmanın tek geçerli yolu, çalışan bir PostgreSQL örneğine pg_hba.conf'un nerede olduğunu sormak veya sysadmin'e nerede olduğunu sormaktır. Init betiği Pg başlatılırken -c hba_file = / some / other / path gibi bir param iletebileceğinden, datadir'in nerede olduğunu sormaya ve postgresql.conf dosyasını ayrıştırmaya bile güvenemezsiniz.

Yapmak istediğiniz şey PostgreSQL'e sormak:

SHOW hba_file;

Bu komut bir süper kullanıcı oturumunda çalıştırılmalıdır, bu nedenle kabuk komut dosyası oluşturmak için şöyle bir şey yazabilirsiniz:

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

ve bağlantının doğru olduğundan emin olmak için PGUSER, PGDATABASE, vb. ortam değişkenlerini ayarlayın.

Evet, bu biraz tavuk ve yumurta sorunudur, eğer kullanıcı bağlanamazsa (diyelim ki pg_hba.conf düzenlemesini bozduktan sonra) düzeltmek için pg_hba.conf'u bulamazsınız.

Başka bir seçenek ps komutunun çıktısına bakmak ve postmaster veri dizini bağımsız değişkeni -D'nin orada görünür olup olmadığını görmek, ör.

ps aux  | grep 'postgres *-D'

pg_hba.conf veri dizininin içinde olacağından (Debian / Ubuntu veya bazı türevlerde değilseniz ve paketlerini kullanmıyorsanız).

Debian / Ubuntu paketlerinden kurulu PostgreSQL ile özellikle Ubuntu sistemlerini hedefliyorsanız, biraz daha kolaylaşır. Birinin kendi dizininde bir veri dizini başlattığı kaynaktan derlenmiş Pg ile veya / opt vb. Bir EnterpriseDB Pg yüklemesi ile uğraşmanız gerekmez. Pg_wrapper, Debian / Ubuntu multi -version Pg yöneticisi; burada PostgreSQL, pg_wrapper'dan pg_lsclusters komutunu kullanır.

Bağlanamıyorsanız (Pg çalışmıyorsa veya bağlanmak için pg_hba.conf dosyasını düzenlemeniz gerekiyor), sistemde pg_hba.conf dosyaları aramalısınız. Mac ve Linux'ta sudo find / -type f -name pg_hba.conf gibi bir şey yapacaktır. Daha sonra, aynı dizindeki PG_VERSION dosyasını kontrol edin, birden fazla dosya varsa doğru PostgreSQL sürümü olduğundan emin olun. (Pg_hba.conf / etc / dizinindeyse, bunu dikkate almayın, bunun yerine üst dizin adıdır). Aynı PostgreSQL sürümü için birden fazla veri dizininiz varsa, veritabanı boyutuna bakmanız, veri dizini -D bağımsız değişkeninin düzenlediğiniz yerle eşleşip eşleşmediğini görmek için ps'den çalışan postgres komut satırını kontrol etmeniz gerekir. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Benim sorunum herhangi bir sunucu yazmadım oldu. Bunun yer tutucu nedeniyle varsayılan olduğunu düşündüm ama localhost yazdığımda işe yaradı.


2

Bu dosyayı Cloud 9'da bulmaya çalışıyorsanız,

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

Basın Idüzenleme / ekleme için basın ESC3 kez ve tip :wqdosyayı kaydedin ve çıkılacak


2

Raylarla bu sorunla karşı karşıyaysanız ve doğru kullanıcı haklarıyla birlikte bu kullanıcı adını parolayla oluşturduğunuzu biliyorsanız, sadece database.yml dosyanızın sonuna aşağıdakileri eklemeniz gerekir.

host: localhost

genel dosya aşağıdaki gibi görünecektir

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

pg_hba.confDosyaya hiç dokunmanıza gerek yok . Mutlu kodlama


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.