Mendapatkan kesalahan: Otentikasi rekan gagal untuk "postgres" pengguna, ketika mencoba membuat pgsql bekerja dengan rel


738

Saya mendapatkan kesalahan:

FATAL: Peer authentication failed for user "postgres"

ketika saya mencoba membuat postgres bekerja dengan Rails.

Ini milikku pg_hba.conf, milikku database.yml, dan setumpuk jejak penuh .

Saya mengubah otentikasi ke md5 di pg_hba dan mencoba hal-hal yang berbeda, tetapi tidak ada yang berhasil.

Saya juga mencoba membuat pengguna dan basis data baru sesuai Rails 3.2, FATAL: Otentikasi rekan gagal untuk pengguna (PG :: Kesalahan)

Tetapi mereka tidak muncul di pgadmin atau bahkan ketika saya berlari sudo -u postgres psql -l.

Tahu di mana saya salah?


1
1): Pastikan Anda memiliki pengguna bernama "postgres" yang dibuat dan memiliki hak di Database 2): Pastikan ia memiliki kata sandi 3): Pastikan config / database.yml Anda berisi kredensial hak (nama pengguna + kata sandi)
MrYoshiji

2
membutuhkan peer dan indentasi everyplace diatur ke md5
Artem.Borysov

13
Lihat juga jawaban ini - koneksi mungkin gagal localhosttetapi berhasil 127.0.0.1.
uvsmtid

9
Dalam kasus saya saya perlu untuk menambahkan host: localhostdalam database.ymlberkas.
Mihail Velikov

Jawaban:


1028

Masalahnya masih pg_hba.conffile Anda ( /etc/postgresql/9.1/main/pg_hba.conf*).

Garis ini:

local   all             postgres                                peer

Seharusnya:

local   all             postgres                                md5

* Jika Anda tidak dapat menemukan file ini, menjalankan locate pg_hba.confharus menunjukkan di mana file tersebut berada.

Setelah mengubah file ini, jangan lupa untuk me-restart server PostgreSQL Anda. Jika Anda menggunakan Linux, itu mungkin sudo service postgresql restart.

Ini adalah deskripsi singkat dari kedua opsi menurut dokumen resmi PostgreSQL tentang metode otentikasi .

Otentikasi rekan

Metode otentikasi rekan bekerja dengan memperoleh nama pengguna sistem operasi klien dari kernel dan menggunakannya sebagai nama pengguna basis data yang diizinkan (dengan pemetaan nama pengguna opsional). Metode ini hanya didukung pada koneksi lokal.

Otentikasi kata sandi

Metode otentikasi berbasis kata sandi adalah md5 dan kata sandi. Metode ini beroperasi dengan cara yang sama kecuali untuk cara kata sandi dikirim melalui koneksi, yaitu MD5-hashed dan clear-text.

Jika Anda khawatir tentang serangan "sniffing" kata sandi, maka md5 lebih disukai. Kata sandi polos harus selalu dihindari jika memungkinkan. Namun, md5 tidak dapat digunakan dengan fitur db_user_namespace. Jika koneksi dilindungi oleh enkripsi SSL maka kata sandi dapat digunakan dengan aman (meskipun otentikasi sertifikat SSL mungkin merupakan pilihan yang lebih baik jika tergantung pada penggunaan SSL).

Lokasi sampel untuk pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Anda harus memuat ulang layanan postgresql Anda setelah mengubahnya/etc/init.d/postgresql reload
funkotron

78
meletakkan ini di sini karena saya selalu lupa di mana file ini/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron Setidaknya pada instalasi ElementaryOS (Ubuntu) saya, sudo service postgreql restartjuga berfungsi.
Marnen Laibow-Koser

13
Untuk menjawab pertanyaan saya sendiri: otentikasi 'rekan' berarti postgres meminta sistem operasi untuk nama login Anda dan menggunakan ini untuk otentikasi, sehingga pengguna pada OS dan postgres harus sama. 'md5' menggunakan otentikasi kata sandi terenkripsi.
Dennis

9
Saya mengerti perubahannya. Tetapi mengapa ini bukan perilaku standar? Apakah ada kekurangan menggunakan md5?
Victor Marconi

364

Setelah menginstal Postgresql saya melakukan langkah-langkah di bawah ini.

  1. buka file pg_hba.confuntuk Ubuntu itu akan di /etc/postgresql/9.x/maindan ubah baris ini:

    lokal semua rekan postgres

    untuk

    lokal semua kepercayaan postgres
  2. Mulai ulang server

    $ sudo service postgresql restart
  3. Masuk ke psql dan atur kata sandi Anda

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Akhirnya ubah pg_hba.confdari

    lokal semua kepercayaan postgres

    untuk

    lokal semua postgres md5

Setelah me-restart server postgresql, Anda dapat mengaksesnya dengan kata sandi Anda sendiri

Rincian metode otentikasi:

kepercayaan - siapa pun yang dapat terhubung ke server diizinkan untuk mengakses database

peer - gunakan nama pengguna sistem operasi klien sebagai nama pengguna basis data untuk mengaksesnya.

md5 - otentikasi basis kata sandi

untuk referensi lebih lanjut cek di sini


18
mengubah metode menjadi "percaya" berhasil bagi saya. +1 untuk penjelasan detail metode otentikasi.
La-comadreja

4
Pada OS X homebrew defaultnya adalah trust, sedangkan pada Ubuntu entah bagaimana defaultnya diatur ke "peer", yang menyebabkan perbedaan antara setup saya dan rekan saya. Kami mengubahnya ke MD5 yang tidak membantu, jadi "kepercayaan" adalah jawaban nyata di sini (Kami hanya melakukan pengujian pengembangan). Harus mendapatkan lebih banyak upvotes.
xji

2
Anda juga dapat mengatur md5 setiap tempat dari awal
Artem.Borysov

2
Cara ini berfungsi untuk saya, menggunakan metode md5 pertama tidak.
sianipard

perlu menggunakan kata sandi yang sama? sudo passwd postgres
Peter Krauss

212

Jika Anda terhubung melalui localhost (127.0.0.1) Anda tidak akan mengalami masalah khusus itu. Saya tidak akan banyak bercanda dengan pg_hba.conf tetapi saya akan menyesuaikan string koneksi Anda:

psql -U someuser -h 127.0.0.1 database

di mana seseorang pengguna Anda terhubung sebagai Anda dan database adalah database pengguna Anda memiliki izin untuk terhubung.

Inilah yang saya lakukan di Debian untuk mengatur 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

Nikmati!


16
Saya pikir ini adalah solusi terbaik karena ini benar-benar memecahkan masalah lokal tanpa mengacaukan tanpa mengacaukan konfigurasi global sebagai jawaban yang disarankan.
Juni

1
Saya harus mengubah host: 127.0.0.1dari default ke localhost di config / database.yml - ini pada mesin yang sama jadi saya tidak mengerti mengapa
Anthony

Anthony, apakah Anda mengatakan Anda mengalami kegagalan koneksi hingga Anda menyesuaikan localhost menjadi 127.0.0.1 di database.yml Anda? Saya sarankan memeriksa file / etc / hosts Anda jika itu masalahnya. Jika tidak, mungkin ada beberapa keanehan lain terkait dengan menyelesaikan localhost.
StylusEater

1
Ini jauh lebih elegan jika dibandingkan dengan mengacaukan metode otentikasi rekan lokal.
mdh

1
Sejauh ini ini adalah solusi terbaik IMO
Salil Junior

45

Ini berhasil bagi saya !!

sudo -u postgres psql

ini akan berfungsi dengan baik selama pengguna login Anda saat ini dalam file sudoers.
Abubacker Siddik

16

Jika Anda memiliki masalah, Anda perlu menemukan pg_hba.conf. Perintahnya adalah:

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

dan setelah itu ubah file konfigurasi:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

Langkah selanjutnya adalah: Restart instance db Anda:

service postgresql-9.3 restart

Jika Anda memiliki masalah, Anda perlu mengatur kata sandi lagi:

ALTER USER db_user with password 'db_password';


16
  1. Buka file /etc/postgresql/9.x/main/ ini dan buka file pg_hba.conf

Dalam hal ini:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Ganti peer dengan md5

Jadi ini akan diubah menjadi:

Login administrasi basis data oleh Unix domain socket local all 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

Ini:

Login administratif basis data oleh Unix domain socket local all 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. Kemudian restart server pg:

    $> sudo service postgresql restart

Di bawah ini adalah daftar METODE yang digunakan untuk terhubung dengan 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.

Catatan: Jika Anda belum membuat Anda pengguna postgres. Buat itu dan sekarang Anda dapat mengakses server postgres menggunakan kredensial pengguna itu.

TIP: Jika tidak berhasil setelah postgres restart maka tutup terminal dan buka lagi.


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

Ini menyelesaikan masalah saya


3
Saya tidak berpikir itu akan sesederhana itu, tetapi ini bekerja untuk saya di bawah debian 9
Hayden Thring

Ini bekerja di Ubuntu 19.10
Vithal Reddy

Terima kasih, Ini berfungsi di Ubuntu 19.10 dan psql 12.3
Happy Singh

10

Saya memiliki masalah yang sama.

Solusi dari depa benar-benar benar.

Pastikan Anda memiliki pengguna yang dikonfigurasi untuk menggunakan PostgreSQL.

Periksa file:

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

Izin file ini harus diberikan kepada pengguna yang telah Anda daftarkan psql Anda.

Lebih lanjut. Jika kamu baik sampai sekarang ..

Perbarui sesuai instruksi @ depa.

yaitu

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

lalu lakukan perubahan.


Saya menghadapi masalah yang sama. Tapi izin apa yang harus saya butuhkan, saya tidak tahu. Bisakah kamu membantuku. Saya mendapatkan output untuk perintah 'ls' adalah-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

Jika Anda ingin mempertahankan konfigurasi default tetapi menginginkan otentikasi md5 dengan koneksi soket untuk satu koneksi pengguna / db tertentu, tambahkan baris "lokal" SEBELUM baris "semua / semua lokal":

# 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

"SEBELUM" dalam jawaban ini pantas dijabarkan lebih lanjut dalam jawaban lain. Ternyata psql memeriksa catatan dalam file pg_hba.conf secara berurutan sebagaimana dinyatakan dalam dokumen: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# JENIS DATABASE MENGGUNAKAN METODE ALAMAT Nama pengguna lokal dbname md5 # <- baris ini Tidak dalam urutan
Kiry Meas

7

Saya sedang memindahkan direktori data pada server yang dikloning dan mengalami kesulitan untuk login sebagai postgres. Mengatur ulang kata sandi postgres seperti ini berhasil untuk saya.

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

Pengeditan di atas berhasil untuk saya, setelah saya tahu bahwa saya perlu me-restart server postgres setelah membuatnya. Untuk ubuntu:

sudo /etc/init.d/postgresql restart

6

Mengubah rekan METHOD menjadi percaya pada pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | line 85) menyelesaikan masalah. Menambahkan md5 meminta kata sandi, maka jika ada persyaratan untuk menghindari menggunakan kata sandi, gunakan kepercayaan alih-alih md5 .


6

Gunakan host=localhostsehubungan.

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

5

perintah di bawah ini berfungsi untuk saya:

psql -d myDb -U username -W

man 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

Anda hanya perlu mengatur METODE untuk dipercaya.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

Dan memuat kembali server postgres.

# service postgresql-9.5 reload

Perubahan pg_hba.conf tidak memerlukan RESTART server postgres. hanya BANTUAN.


3

Banyak jawaban lain berkaitan dengan pengaturan di berbagai file konfigurasi, dan yang berkaitan dengan pg_hba.confdo berlaku dan 100% benar. Namun, pastikan Anda memodifikasi file konfigurasi yang benar .

Seperti orang lain telah menyebutkan lokasi file konfigurasi dapat diganti dengan berbagai pengaturan di dalam file konfigurasi utama, serta menyediakan path ke file konfigurasi utama pada baris perintah dengan -Dopsi.

Anda dapat menggunakan perintah berikut saat dalam sesi psql untuk menunjukkan di mana file konfigurasi Anda sedang dibaca (dengan asumsi Anda dapat meluncurkan psql). Ini hanyalah langkah pemecahan masalah yang dapat membantu sebagian orang:

select * from pg_settings where setting~'pgsql';  

Anda juga harus memastikan bahwa direktori home untuk pengguna postgres Anda sesuai dengan yang Anda harapkan. Saya mengatakan ini karena cukup mudah untuk mengabaikan ini karena fakta bahwa prompt Anda akan menampilkan ' ~' alih-alih jalur sebenarnya dari direktori home Anda, membuatnya tidak begitu jelas. Banyak instalasi default direktori home pengguna postgres /var/lib/pgsql.

Jika tidak diatur ke apa yang seharusnya, hentikan layanan postgresql dan gunakan perintah berikut saat login sebagai root. Pastikan juga pengguna postgres tidak masuk ke sesi lain:

usermod -d /path/pgsql postgres

Terakhir, pastikan variabel PGDATA Anda diatur dengan benar dengan mengetik echo $PGDATA, yang akan menghasilkan sesuatu yang mirip dengan:

/path/pgsql/data

Jika tidak disetel, atau menunjukkan sesuatu yang berbeda dari yang Anda harapkan, periksa file startup atau RC Anda seperti .profile atau .bash.rc - ini akan sangat bervariasi tergantung pada OS dan shell Anda. Setelah Anda menentukan skrip startup yang benar untuk mesin Anda, Anda dapat memasukkan yang berikut ini:

export PGDATA=/path/pgsql/data

Untuk sistem saya, saya menempatkan ini /etc/profile.d/profile.local.shsehingga dapat diakses untuk semua pengguna.

Anda sekarang harus dapat init database seperti biasa dan semua pengaturan jalur psql Anda harus benar!


3

pg_config adalah untuk informasi pelengkap, untuk membantu ekstensi dan program klien menyusun dan menautkannya dengan PostgreSQL. Ia tidak tahu apa-apa tentang instance PostgreSQL aktif pada mesin, hanya binari-binari.

pg_hba.conf dapat muncul di banyak tempat lain tergantung pada bagaimana Pg dipasang. Lokasi standar adalah pg_hba.conf dalam data_directory database (yang bisa di / home, / var / lib / pgsql, / var / lib / postgresql / [versi] /, / opt / postgres /, dll dll) tetapi pengguna dan pembuat paket dapat meletakkannya di mana saja mereka suka. Sayangnya.

Satu-satunya cara yang valid untuk menemukan pg_hba.conf adalah dengan menanyakan instance PostgreSQL yang menjalankan di mana pg_hba.conf berada, atau bertanya kepada sysadmin di mana letaknya. Anda bahkan tidak dapat bergantung pada bertanya di mana datadir berada dan mem-parsing postgresql.conf karena skrip init mungkin melewati param seperti -c hba_file = / some / other / path ketika memulai Pg.

Yang ingin Anda lakukan adalah bertanya pada PostgreSQL:

SHOW hba_file;

Perintah ini harus dijalankan pada sesi pengguna super, jadi untuk skrip shell Anda dapat menulis sesuatu seperti:

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

dan atur variabel lingkungan PGUSER, PGDATABASE, dll untuk memastikan bahwa koneksi benar.

Ya, ini agak masalah ayam-dan-telur, dalam hal itu jika pengguna tidak dapat terhubung (katakanlah, setelah mengacaukan pengeditan pg_hba.conf) Anda tidak dapat menemukan pg_hba.conf untuk memperbaikinya.

Pilihan lain adalah untuk melihat output perintah ps dan melihat apakah argumen direktori data postmaster -D terlihat di sana, misalnya

ps aux  | grep 'postgres *-D'

karena pg_hba.conf akan berada di dalam direktori data (kecuali jika Anda menggunakan Debian / Ubuntu atau turunan dan menggunakan paket-paket mereka).

Jika Anda menargetkan secara khusus sistem Ubuntu dengan PostgreSQL terinstal dari paket Debian / Ubuntu, itu akan menjadi sedikit lebih mudah. Anda tidak harus berurusan dengan Pg yang dikompilasi dengan tangan dari sumber yang initdb milik seseorang di dir rumah mereka, atau menginstal EnterpriseDB Pg di / opt, dll. Anda dapat meminta pg_wrapper, multi Debian / Ubuntu multi -version Pg manager, di mana PostgreSQL menggunakan perintah pg_lsclusters dari pg_wrapper.

Jika Anda tidak dapat terhubung (Pg tidak berjalan, atau Anda perlu mengedit pg_hba.conf untuk terhubung) Anda harus mencari file pg_hba.conf sistem. Di Mac dan Linux, sesuatu seperti sudo find / -type f -name pg_hba.conf akan berfungsi. Kemudian periksa file PG_VERSION di direktori yang sama untuk memastikan itu adalah versi PostgreSQL yang tepat jika Anda memiliki lebih dari satu. (Jika pg_hba.conf di / etc /, abaikan ini, itu adalah nama direktori induk). Jika Anda memiliki lebih dari satu direktori data untuk versi PostgreSQL yang sama, Anda harus melihat ukuran basis data, periksa baris perintah postgres yang berjalan dari ps untuk melihat apakah direktori data -D argumen yang cocok dengan tempat Anda mengedit, dll. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Masalah saya adalah bahwa saya tidak mengetikkan server apa pun. Saya pikir ini adalah default karena placeholder tetapi ketika saya mengetik localhost itu berhasil.


2

Jika Anda mencoba mencari file ini di Cloud 9, Anda dapat melakukannya

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

Tekan Iuntuk mengedit / menyisipkan, tekan ESC3 kali dan ketik :wqakan menyimpan file dan berhenti


2

Jika Anda menghadapi masalah ini dengan rails dan Anda tahu bahwa Anda telah membuat nama pengguna itu dengan kata sandi bersama dengan hak-hak yang benar, maka Anda hanya perlu memasukkan berikut di akhir file database.yml Anda.

host: localhost

keseluruhan file akan terlihat seperti di bawah ini

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

Anda tidak perlu menyentuh pg_hba.conffile Anda sama sekali. Selamat coding


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.