Gặp lỗi: Xác thực ngang hàng không thành công cho người dùng Postgres, khi cố gắng để pssql hoạt động với đường ray


737

Tôi đang nhận được lỗi:

FATAL: Peer authentication failed for user "postgres"

khi tôi cố gắng làm cho postgres hoạt động với Rails.

Đây là của tôi pg_hba.conf, của tôi database.ymlvà một bãi chứa đầy dấu vết .

Tôi đã thay đổi xác thực thành md5 trong pg_hba và thử nhiều thứ khác nhau, nhưng dường như không có gì hoạt động.

Tôi cũng đã thử tạo một người dùng và cơ sở dữ liệu mới theo Rails 3.2, FATAL: Xác thực ngang hàng không thành công cho người dùng (PG :: Error)

Nhưng chúng không xuất hiện trên pgadmin hoặc ngay cả khi tôi chạy sudo -u postgres psql -l.

Bất cứ ý tưởng mà tôi đang đi sai?


1
1): Hãy chắc chắn rằng bạn có một người dùng có tên "postgres" tạo ra và có ngay trên Cơ sở dữ liệu của bạn 2): Hãy chắc chắn rằng ông có một mật khẩu 3): Hãy chắc chắn rằng cấu hình của bạn / database.yml chứa các chứng quyền (username + password)
MrYoshiji

2
cần mọi nơi ngang hàng và thụt lề được đặt thành md5
Artem.Borysov

13
Xem thêm câu trả lời này - kết nối có thể thất bại localhostnhưng thành công trên 127.0.0.1.
uvsmtid

9
Trong trường hợp của tôi, tôi cần phải thêm host: localhostvào database.ymltập tin.
Mihail Velikov

Câu trả lời:


1027

Vấn đề vẫn là pg_hba.conftập tin của bạn ( /etc/postgresql/9.1/main/pg_hba.conf*).

Đường thẳng này:

local   all             postgres                                peer

Nên là:

local   all             postgres                                md5

* Nếu bạn không thể tìm thấy tệp này, việc chạy locate pg_hba.confsẽ cho bạn biết tệp đó ở đâu.

Sau khi thay đổi tệp này, đừng quên khởi động lại máy chủ PostgreSQL của bạn. Nếu bạn đang dùng Linux, điều đó sẽ xảy ra sudo service postgresql restart.

Đây là những mô tả ngắn gọn về cả hai tùy chọn theo tài liệu chính thức của PostgreSQL về phương thức xác thực .

Xác thực ngang hàng

Phương thức xác thực ngang hàng hoạt động bằng cách lấy tên người dùng hệ điều hành của máy khách từ kernel và sử dụng nó làm tên người dùng cơ sở dữ liệu được phép (với ánh xạ tên người dùng tùy chọn). Phương pháp này chỉ được hỗ trợ trên các kết nối địa phương.

Xác thực mật khẩu

Các phương thức xác thực dựa trên mật khẩu là md5 và mật khẩu. Các phương thức này hoạt động tương tự ngoại trừ cách mật khẩu được gửi qua kết nối, cụ thể là MD5 được băm và xóa văn bản tương ứng.

Nếu bạn hoàn toàn lo ngại về các cuộc tấn công "đánh hơi" mật khẩu thì md5 được ưu tiên. Mật khẩu thường phải luôn luôn tránh nếu có thể. Tuy nhiên, md5 không thể được sử dụng với tính năng db_user_namespace. Nếu kết nối được bảo vệ bằng mã hóa SSL thì mật khẩu có thể được sử dụng một cách an toàn (mặc dù xác thực chứng chỉ SSL có thể là lựa chọn tốt hơn nếu tùy thuộc vào việc sử dụng SSL).

Vị trí mẫu cho pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Bạn sẽ cần tải lại dịch vụ postgresql của mình sau khi thay đổi điều này/etc/init.d/postgresql reload
funkotron

78
đặt cái này ở đây vì tôi luôn quên tập tin này ở đâu/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron Ít nhất là trên bản cài đặt Sơ cấp (Ubuntu) của tôi, sudo service postgreql restartcũng hoạt động.
Marnen Laibow-Koser

13
Để trả lời câu hỏi của riêng tôi: xác thực 'ngang hàng' có nghĩa là các postgres yêu cầu hệ điều hành cho tên đăng nhập của bạn và sử dụng tên này để xác thực, vì vậy người dùng trên HĐH và trên postgres phải giống nhau. 'md5' sử dụng xác thực mật khẩu được mã hóa.
Dennis

9
Tôi hiểu sự thay đổi. Nhưng tại sao đây không phải là hành vi mặc định? Có bất kỳ nhược điểm nào khi sử dụng md5 không?
Victor Marconi

362

Sau khi cài đặt Postgresql tôi đã làm các bước dưới đây.

  1. mở tệp pg_hba.confcho Ubuntu, nó sẽ vào /etc/postgresql/9.x/mainvà thay đổi dòng này:

    địa phương tất cả các postgres ngang hàng

    đến

    địa phương tất cả các postgres tin tưởng
  2. Khởi động lại máy chủ

    $ sudo service postgresql restart
  3. Đăng nhập vào psql và đặt mật khẩu của bạn

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Cuối cùng thay đổi pg_hba.conftừ

    địa phương tất cả các postgres tin tưởng

    đến

    địa phương tất cả các postgres md5

Sau khi khởi động lại máy chủ postgresql, bạn có thể truy cập nó bằng mật khẩu của riêng bạn

Chi tiết phương thức xác thực:

tin cậy - bất cứ ai có thể kết nối với máy chủ đều được phép truy cập cơ sở dữ liệu

ngang hàng - sử dụng tên người dùng hệ điều hành của khách hàng làm tên người dùng cơ sở dữ liệu để truy cập nó.

md5 - xác thực mật khẩu

để tham khảo thêm tại đây


18
thay đổi phương pháp để "tin tưởng" làm việc cho tôi. +1 để giải thích chi tiết về phương thức xác thực.
La-comadreja

4
Trên OS X, homebrew mặc định là tin cậy, trong khi trên Ubuntu, bằng cách nào đó, mặc định được đặt thành "ngang hàng", dẫn đến sự khác biệt giữa thiết lập của tôi và của đồng nghiệp. Chúng tôi đã đổi MD5 thành không giúp được gì, vì vậy "niềm tin" là câu trả lời thực sự ở đây (Chúng tôi chỉ đang thực hiện thử nghiệm phát triển). Nên nhận thêm upvote.
xji

2
bạn cũng có thể thiết lập md5 mọi nơi ngay từ đầu
Artem.Borysov

2
Cách này hiệu quả với tôi, trước tiên sử dụng phương pháp md5 thì không.
sianipard

Cần sử dụng cùng một mật khẩu? sudo passwd postgres
Peter Krauss

211

Nếu bạn kết nối qua localhost (127.0.0.1), bạn không nên gặp vấn đề cụ thể đó. Tôi sẽ không làm phiền nhiều với pg_hba.conf nhưng thay vào đó tôi sẽ điều chỉnh chuỗi kết nối của bạn:

psql -U someuser -h 127.0.0.1 database

trong đó một số người dùng là người dùng của bạn đang kết nối và cơ sở dữ liệu là cơ sở dữ liệu mà người dùng của bạn có quyền kết nối.

Đây là những gì tôi làm trên Debian để thiết lập 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

Thưởng thức!


16
Tôi nghĩ rằng đây là giải pháp tốt nhất vì nó thực sự giải quyết được vấn đề cục bộ mà không gây rối mà không gây rối với cấu hình toàn cầu như các câu trả lời khác khuyến nghị.
jeteon

1
Tôi đã phải thay đổi host: 127.0.0.1từ mặc định sang localhost trong config / database.yml - nó trên cùng một máy vì vậy tôi không hiểu tại sao
Anthony

Anthony, bạn đang nói rằng bạn gặp phải lỗi kết nối cho đến khi bạn điều chỉnh localhost thành 127.0.0.1 trong cơ sở dữ liệu của bạn? Tôi đề nghị kiểm tra tập tin / etc / hosts của bạn nếu đó là trường hợp. Mặt khác, có thể có một số điều kỳ lạ khác liên quan đến việc giải quyết localhost.
StylusEater

1
Điều này thanh lịch hơn nhiều khi so sánh với việc gây rối với phương thức xác thực ngang hàng cục bộ.
mdh

1
Đây là giải pháp tốt nhất IMO
Salil Junior

45

Điều này đã làm việc cho tôi !!

sudo -u postgres psql

điều này sẽ hoạt động tốt miễn là người dùng đăng nhập hiện tại của bạn ở trong tệp sudoers.
Abubacker Siddik

16

Nếu bạn có một vấn đề, bạn cần xác định vị trí của bạn pg_hba.conf. Lệnh là:

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

và sau đó thay đổi tập tin cấu hình:

Postgresql 9.3

Postgresql 9.3

Postgresql 9,4

Postgresql 9.3

Bước tiếp theo là: Khởi động lại cá thể db của bạn:

service postgresql-9.3 restart

Nếu bạn có bất kỳ vấn đề nào, bạn cần đặt lại mật khẩu:

ALTER USER db_user with password 'db_password';


16
  1. Tới đây /etc/postgresql/9.x/main/ và mở pg_hba.conf tập tin

Trong trường hợp của tôi:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Thay thế ngang hàng với md5

Vì vậy, điều này sẽ được thay đổi thành:

Cơ sở dữ liệu đăng nhập bằng ổ cắm tên miền Unix cục bộ tất cả các postgres ngang hàng

# 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

Điều này:

Cơ sở dữ liệu đăng nhập quản trị bởi ổ cắm tên miền Unix cục bộ tất cả các 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. Sau đó khởi động lại máy chủ pg:

    $> sudo dịch vụ postgresql khởi động lại

Dưới đây là danh sách các PHƯƠNG PHÁP được sử dụng để kết nối với 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.

Ghi chú: Nếu bạn chưa tạo người dùng postgres. Tạo điều đó và bây giờ bạn có thể truy cập máy chủ postgres bằng thông tin đăng nhập của người dùng đó.

MIPO: Nếu nó không hoạt động sau khi postgres khởi động lại, hãy đóng terminal và mở lại.


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

Điều này đã giải quyết vấn đề của tôi


3
Tôi không nghĩ nó sẽ đơn giản như vậy, nhưng điều này hiệu quả với tôi theo debian 9
Hayden Thring

Điều này đang hoạt động trên Ubuntu 19.10
Vithal Reddy

Cảm ơn, Nó hoạt động trên Ubuntu 19.10 và psql 12.3
Happy Singh

10

Tôi đã từng gặp vấn đề tương tự.

Các giải pháp từ depa là hoàn toàn chính xác.

Chỉ cần đảm bảo rằng bạn có một người dùng được cấu hình để sử dụng PostgreSQL.

Kiểm tra tập tin:

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

Sự cho phép của tập tin này nên được trao cho người dùng mà bạn đã đăng ký psql của mình.

Thêm nữa. Nếu bạn tốt cho đến bây giờ ..

Cập nhật theo hướng dẫn của @ depa.

I E

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

và sau đó thực hiện thay đổi.


Tôi đang đối mặt với vấn đề tương tự. Nhưng những quyền nào tôi cần tôi không biết. Bạn có thể giúp tôi được không. Tôi nhận được đầu ra cho lệnh 'ls' là-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

Nếu bạn muốn giữ cấu hình mặc định nhưng muốn xác thực md5 với kết nối ổ cắm cho một kết nối người dùng / db cụ thể, hãy thêm một dòng "cục bộ" TRƯỚC dòng "cục bộ tất cả / tất cả":

# 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

"TRƯỚC" trong câu trả lời này xứng đáng được trau chuốt hơn trong các câu trả lời khác. Hóa ra psql kiểm tra các bản ghi trong tệp pg_hba.conf theo tuần tự như đã nêu trong các tài liệu: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# LOẠI
TÌM KIẾM

7

Tôi đã di chuyển thư mục dữ liệu trên một máy chủ nhân bản và gặp khó khăn khi đăng nhập như postgres. Đặt lại mật khẩu postgres như thế này làm việc cho tôi.

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

Các chỉnh sửa ở trên đã có hiệu quả đối với tôi, sau khi tôi nhận ra rằng tôi cần khởi động lại máy chủ postgres sau khi thực hiện chúng. Đối với Ubuntu:

sudo /etc/init.d/postgresql restart

6

Thay đổi METHOD ngang hàng để tin tưởng vào pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | dòng 85) giải quyết vấn đề. Thêm md5 yêu cầu mật khẩu, do đó nếu có yêu cầu tránh sử dụng mật khẩu, hãy sử dụng niềm tin thay vì md5 .


6

Sử dụng host=localhosttrong kết nối.

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

5

lệnh dưới đây hoạt động với tôi:

psql -d myDb -U username -W

người đàn ông 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 7/12/2015

3

Bạn chỉ cần đặt PHƯƠNG PHÁP để tin tưởng.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

Và tải lại máy chủ postgres.

# service postgresql-9.5 reload

Những thay đổi trong pg_hba.conf không yêu cầu máy chủ postgres RESTART. chỉ cần ĐÁNG TIN CẬY.


3

Nhiều câu trả lời khác liên quan đến cài đặt trong các tệp cấu hình khác nhau và các câu trả lời liên quan đến pg_hba.confviệc áp dụng và chính xác 100%. Tuy nhiên, hãy chắc chắn rằng bạn đang sửa đổi các tệp cấu hình chính xác .

Như những người khác đã đề cập, các vị trí tệp cấu hình có thể được ghi đè bằng các cài đặt khác nhau bên trong tệp cấu hình chính, cũng như cung cấp đường dẫn đến tệp cấu hình chính trên dòng lệnh với -D tùy chọn.

Bạn có thể sử dụng lệnh sau trong khi trong phiên psql để hiển thị nơi tệp cấu hình của bạn đang được đọc (giả sử bạn có thể khởi chạy psql). Đây chỉ là một bước khắc phục sự cố có thể giúp một số người:

select * from pg_settings where setting~'pgsql';  

Bạn cũng nên đảm bảo rằng thư mục chính cho người dùng postgres của bạn là nơi bạn mong đợi. Tôi nói điều này bởi vì nó khá dễ dàng để bỏ qua điều này do thực tế là lời nhắc của bạn sẽ hiển thị ' ~' thay vì đường dẫn thực tế của thư mục chính của bạn, làm cho nó không quá rõ ràng. Nhiều cài đặt mặc định thư mục nhà người dùng postgres đến /var/lib/pgsql.

Nếu nó không được đặt thành đúng như mong muốn, hãy dừng dịch vụ postgresql và sử dụng lệnh sau trong khi đăng nhập với quyền root. Đồng thời đảm bảo rằng người dùng postgres không đăng nhập vào phiên khác:

usermod -d /path/pgsql postgres

Cuối cùng, hãy đảm bảo biến PGDATA của bạn được đặt chính xác bằng cách nhập echo $PGDATA, sẽ xuất ra một cái gì đó tương tự như:

/path/pgsql/data

Nếu nó không được đặt hoặc hiển thị một cái gì đó khác với những gì bạn mong đợi, hãy kiểm tra các tệp khởi động hoặc RC của bạn như .profile hoặc .bash.rc - điều này sẽ thay đổi rất nhiều tùy thuộc vào hệ điều hành và hệ vỏ của bạn. Khi bạn đã xác định tập lệnh khởi động chính xác cho máy của mình, bạn có thể chèn đoạn mã sau:

export PGDATA=/path/pgsql/data

Đối với hệ thống của tôi, tôi đặt cái này vào /etc/profile.d/profile.local.sh để mọi người dùng đều có thể truy cập được.

Bây giờ bạn có thể khởi tạo cơ sở dữ liệu như bình thường và tất cả các cài đặt đường dẫn psql của bạn phải chính xác!


3

pg_config dành cho thông tin khiếu nại, để giúp các phần mở rộng và chương trình máy khách biên dịch và liên kết với PostgreQuery. Nó không biết gì về (các) phiên bản PostgreQuery đang hoạt động trên máy, chỉ có các tệp nhị phân.

pg_hba.conf có thể xuất hiện ở nhiều nơi khác tùy thuộc vào cách cài đặt PG. Vị trí tiêu chuẩn là pg_hba.conf trong data_directory của cơ sở dữ liệu (có thể ở / home, / var / lib / pssql, / var / lib / postgresql / [version] /, / opt / postgres /, v.v. v.v.) nhưng người dùng và người đóng gói có thể đặt nó bất cứ nơi nào họ thích. Không may.

Các cách hợp lệ duy nhất tìm thấy pg_hba.conf là hỏi một cá thể PostgreQuery đang chạy, nơi pg_hba.conf đang ở đó, hoặc hỏi sysadmin ở đâu. Thậm chí, bạn không thể dựa vào việc hỏi datadir ở đâu và phân tích cú pháp postgresql.conf vì tập lệnh init có thể truyền một thông số như -c hba_file = / some / other / path khi bắt đầu PG.

Những gì bạn muốn làm là hỏi PostgreSQL:

SHOW hba_file;

Lệnh này phải được chạy trên một phiên siêu người dùng, vì vậy để tạo kịch bản shell, bạn có thể viết một cái gì đó như:

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

và đặt các biến môi trường PGUSER, PGDATABASE, v.v để đảm bảo rằng kết nối là đúng.

Vâng, đây là một phần của vấn đề trứng gà, trong đó nếu người dùng không thể kết nối (giả sử, sau khi chỉnh sửa pg_hba.conf), bạn không thể tìm thấy pg_hba.conf để khắc phục.

Một tùy chọn khác là xem xét đầu ra của lệnh ps và xem liệu đối số thư mục dữ liệu postmaster -D có hiển thị ở đó không, ví dụ:

ps aux  | grep 'postgres *-D'

vì pg_hba.conf sẽ nằm trong thư mục dữ liệu (trừ khi bạn sử dụng Debian / Ubuntu hoặc một số dẫn xuất và sử dụng các gói của chúng).

Nếu bạn đang nhắm mục tiêu các hệ thống Ubuntu cụ thể có PostgreQuery được cài đặt từ các gói Debian / Ubuntu thì mọi chuyện sẽ dễ dàng hơn một chút. Bạn không phải đối phó với PG được biên dịch từ nguồn mà ai đó đã khởi tạo một datadir trong thư mục nhà của họ hoặc cài đặt EnterpriseDB PG trong / opt, v.v. Bạn có thể hỏi pg_wrapper, Debian / Ubuntu multi -version Trình quản lý PG, trong đó PostgreSQL đang sử dụng lệnh pg_lscl cluster từ pg_wrapper.

Nếu bạn không thể kết nối (PG không chạy hoặc bạn cần chỉnh sửa pg_hba.conf để kết nối), bạn sẽ phải tìm kiếm hệ thống cho các tệp pg_hba.conf. Trên Mac và Linux, một cái gì đó như sudo find / -type f -name pg_hba.conf sẽ làm. Sau đó kiểm tra tệp PG_VERSION trong cùng thư mục để đảm bảo đó là phiên bản PostgreQuery phù hợp nếu bạn có nhiều hơn một. (Nếu pg_hba.conf nằm trong / etc /, hãy bỏ qua cái này, thay vào đó là tên thư mục mẹ). Nếu bạn có nhiều thư mục dữ liệu cho cùng một phiên bản PostgreSQL, bạn sẽ phải xem kích thước cơ sở dữ liệu, kiểm tra dòng lệnh của các postgres đang chạy từ ps để xem liệu đối số thư mục -D có khớp với nơi bạn đang chỉnh sửa không, v.v. . https://askubfox.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Vấn đề của tôi là tôi đã không gõ bất kỳ máy chủ. Tôi nghĩ rằng nó là mặc định vì giữ chỗ nhưng khi tôi gõ localhost thì nó đã hoạt động.


2

Nếu bạn đang cố gắng định vị tệp này trong Cloud 9, bạn có thể làm

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

Nhấn Iđể chỉnh sửa / chèn, nhấn ESC3 lần và gõ :wqsẽ lưu tệp và thoát


2

Nếu bạn đang đối mặt với vấn đề này với đường ray và bạn biết rằng bạn đã tạo tên người dùng đó bằng mật khẩu cùng với các quyền chính xác thì bạn chỉ cần đặt theo dõi ở cuối tệp cơ sở dữ liệu của bạn.

host: localhost

tập tin tổng thể sẽ trông như dưới đây

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

Bạn không cần phải chạm pg_hba.confvào tập tin của bạn cả. Chúc mừng mã hóa


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.