Помилка отримання: Не вдалося виконати автентифікацію одноранців для "postgres" користувача при спробі заставити pgsql працювати з рейками


737

Я отримую помилку:

FATAL: Peer authentication failed for user "postgres"

коли я намагаюся змусити postgres працювати з Rails.

Ось моє pg_hba.conf, моє database.yml, і звалище повного сліду .

Я змінив автентифікацію на md5 у pg_hba і спробував різні речі, але жодна, здається, не працює.

Я також спробував створити нового користувача та базу даних відповідно до Rails 3.2, FATAL: Peer аутентифікація не вдалася для користувача (PG :: Помилка)

Але вони не відображаються на pgadmin або навіть коли я бігаю sudo -u postgres psql -l.

Будь-яка ідея, де я помиляюся?


1
1): Переконайтеся, що у вас створений користувач з назвою "postgres" і має право на Вашій базі даних 2): переконайтеся, що у нього є пароль 3): переконайтеся, що ваш config / database.yml містить дані про права (ім'я користувача + пароль)
MrYoshiji

2
потрібні будь-які однолітки та відступи встановлені на md5
Артем Борисов,

13
Дивіться також цю відповідь - підключення може не вдатися, localhostале вдатися до нього 127.0.0.1.
uvsmtid

9
У моєму випадку мені потрібно додати host: localhostв database.ymlфайл.
Михайло Великов

це посилання допомогло мені suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/…
Sudip Bhandari

Відповіді:


1027

Проблема все ще залишається у вашому pg_hba.confфайлі ( /etc/postgresql/9.1/main/pg_hba.conf*).

Цей рядок:

local   all             postgres                                peer

Має бути:

local   all             postgres                                md5

* Якщо ви не можете знайти цей файл, запуск locate pg_hba.confповинен показувати, де знаходиться файл.

Змінивши цей файл, не забудьте перезапустити ваш PostgreSQL-сервер. Якщо ви працюєте в Linux, це було б sudo service postgresql restart.

Це короткі описи обох варіантів відповідно до офіційних документів PostgreSQL про методи аутентифікації .

Peer аутентифікація

Метод аутентифікації рівних працює, отримуючи ім’я користувача операційної системи клієнта з ядра та використовуючи його як дозволене ім'я користувача бази даних (з необов'язкове відображення імен користувачів). Цей метод підтримується лише на локальних з'єднаннях.

Аутентифікація пароля

Методами аутентифікації на основі пароля є md5 та password. Ці методи діють аналогічно, за винятком способу надсилання пароля через з'єднання, а саме MD5 з хешем та чітким текстом відповідно.

Якщо ви взагалі стурбовані атак на "нюхання" паролем, тоді md5 є кращим. Потрібно уникати звичайного пароля, якщо це можливо. Однак md5 не можна використовувати з функцією простору db_user_names. Якщо з'єднання захищено шифруванням SSL, то пароль можна безпечно використовувати (хоча автентифікація сертифікатів SSL може бути кращим вибором, якщо такий залежить від використання SSL).

Зразок місця для pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
Вам потрібно буде перезавантажити службу postgresql, змінивши це/etc/init.d/postgresql reload
funkotron

78
розміщуючи це тут, оскільки я завжди забуваю, де цей файл/etc/postgresql/9.1/main/pg_hba.conf
Дуг

12
@funkotron Принаймні на моїй установці ElementarOS (Ubuntu) sudo service postgreql restartтакож працює.
Marnen Laibow-Koser

13
Щоб відповісти на моє власне запитання: "peer" аутентифікація означає, що postgres запитує операційну систему для вашого імені входу та використовує це для автентифікації, тому користувач в ОС та postgres повинен бути однаковим. 'md5' використовує зашифровану автентифікацію пароля.
Денніс

9
Я розумію зміну. Але чому це не поведінка за замовчуванням? Чи є якийсь недолік за допомогою md5?
Віктор Марконі

361

Після установки Postgresql я зробив наступні кроки.

  1. відкрийте файл pg_hba.confдля Ubuntu, в якому він буде, /etc/postgresql/9.x/mainі змініть цей рядок:

    місцеві всі postgres однолітків

    до

    місцеві всі постгреси довіряють
  2. Перезавантажте сервер

    $ sudo service postgresql restart
  3. Увійдіть в psql і встановіть свій пароль

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. Нарешті змінити pg_hba.confз

    місцеві всі постгреси довіряють

    до

    локальні всі postgres md5

Після перезавантаження сервера postgresql ви можете отримати доступ до нього з власним паролем

Деталі методів аутентифікації:

довіра - кожен, хто може підключитися до сервера, має право доступу до бази даних

peer - використовуйте ім'я користувача операційної системи клієнта як ім'я користувача бази даних для доступу до нього.

md5 - автентифікація на основі пароля

для подальшої перевірки тут


17
зміна методу на "довіру" працювала на мене. +1 для пояснення деталей методу аутентифікації.
La-comadreja

4
У домашньої версії OS X за замовчуванням є довіра, тоді як для Ubuntu якось за замовчуванням встановлено "peer", що призвело до розбіжностей між моєю установкою та моїм колегою. Ми змінили його на MD5, що не допомогло, тому "довіра" - справжня відповідь тут (ми лише робимо тестування розробки). Слід отримати більше оновлень.
xji

2
Ви також можете встановити md5 у будь-якому місці з самого початку
Артем Борисов,

2
Цей спосіб працює для мене, використовуючи метод md5 спочатку не було.
sianipard

потрібно використовувати ті ж паролі? sudo passwd postgres
Пітер Краус

211

Якщо ви підключитесь через localhost (127.0.0.1), ви не повинні відчувати цю проблему. Я б не мучився сильно з pg_hba.conf, але замість цього я скоригував би ваш рядок з'єднання:

psql -U someuser -h 127.0.0.1 database

де someuser - ваш користувач, до якого ви підключаєтесь, а база даних - це база даних, до якої користувач має дозвіл на підключення.

Ось що я роблю в Debian для налаштування 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

Насолоджуйтесь!


16
Я думаю, що це найкраще рішення, оскільки воно фактично вирішує локальну проблему, не возившись, не возившись із глобальною конфігурацією, як рекомендують інші відповіді.
jeteon

1
Мені довелося перейти host: 127.0.0.1з дефолту на localhost в config / database.yml - це на одній машині, тому я не розумію, чому
Ентоні

Ентоні, ти хочеш сказати, що у вас виникли помилки підключення, поки ви не налаштували localhost до 127.0.0.1 у своїй database.yml? Я пропоную перевірити файл / etc / hosts, якщо це так. В іншому випадку може виникнути інша дивацтво, пов'язане з вирішенням localhost.
StylusEater

1
Це набагато елегантніше в порівнянні з возитися з місцевим методом аутентифікації однолітків.
mdh

1
Це, безумовно, найкраще рішення ІМО
Саліл Юніор

45

Це працювало для мене !!

sudo -u postgres psql

це має працювати нормально до тих пір, поки ваш поточний зареєстрований користувач знаходиться у файлі sudoers.
Abubacker Siddik

16

Якщо у вас є проблеми, вам потрібно знайти свою pg_hba.conf. Команда така:

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

і після цього змініть файл конфігурації:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

Наступний крок: Перезапуск вашого примірника db:

service postgresql-9.3 restart

Якщо у вас є якісь проблеми, вам потрібно знову встановити пароль:

ALTER USER db_user with password 'db_password';


16
  1. Перейти до цього /etc/postgresql/9.x/main/ і відкрити pg_hba.conf файл

У моєму випадку:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Замініть одноранговий на md5

Отже, це буде змінено на:

Адміністративний вхід в базу даних за допомогою сокета домену Unix для локальних всіх однорангових послідовностей

# 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

Це:

Адміністративний вхід в базу даних по сокету домену Unix локальним всім 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. Потім перезапустіть сервер pg:

    $> sudo service postgresql перезапуск

Нижче наведено перелік МЕТОДІВ, які використовуються для з'єднання з 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.

Примітка: Якщо ви ще не створили користувача postgres. Створіть це, і тепер ви можете отримати доступ до сервера postgres за допомогою даних облікових даних користувачів.

ПОРАДА: Якщо після перезавантаження postgres не працює, закрийте термінал і відкрийте знову.


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

Це вирішило моє питання


3
Я не думав, що це буде так просто, але це працювало для мене під debian 9
Hayden Thring

Це працює над Ubuntu 19.10
Вітал Редді

Дякую, він працює над Ubuntu 19.10 та psql 12.3
Happy Singh

10

У мене була така ж проблема.

Рішення від депа абсолютно правильне.

Просто переконайтеся, що у вас налаштований користувач для використання PostgreSQL.

Перевірте файл:

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

Дозвіл на цей файл повинен бути наданий користувачеві, з яким ви зареєстрували ваш psql.

Далі. Якщо ти добрий досі ..

Оновіть згідно інструкцій @ depa.

тобто

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

а потім внести зміни.


Я зіткнувся з тим же питанням. Але які дозволи мені потрібні, я не знаю. можеш допомогти мені. Я отримую вихід для команди 'ls'-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Нд

8

Якщо ви хочете зберегти конфігурацію за замовчуванням, але хочете автентифікацію md5 із з'єднанням сокета для одного конкретного користувача / db-з'єднання, додайте "локальну" рядок перед тим, як "локальне все / все":

# 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

"ПЕРЕД" у цій відповіді заслуговує на більшу деталізацію в інших відповідях. Виявляється, psql розглядає записи у файлі pg_hba.conf послідовно, як зазначено в документах: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin


7

Я переміщував каталог даних на клонованому сервері і мав проблеми із входом у систему як postgres. Скидання пароля postgres, як це, працювало для мене.

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 після їх внесення. Для ubuntu:

sudo /etc/init.d/postgresql restart

6

Зміна однорангового METHOD на довіру до pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | рядок 85) вирішує проблему. Додавання md5 запитує пароль, отже, якщо є вимога уникати використання паролів, використовуйте довіру замість md5 .



5

нижченаведена команда працює для мене:

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.
Ярослав Нікітенко

3

Вам потрібно просто встановити МЕТОД, щоб довіряти.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

І перезавантажити сервер postgres.

# service postgresql-9.5 reload

Зміни в pg_hba.conf не вимагають RESTART postgres сервера. просто ПОВЕРНЕНО.


3

Багато інших відповідей стосуються налаштувань у різних файлах конфігурацій, а ті, що стосуються pg_hba.confдій, застосовуються і на 100% вірні. Однак переконайтеся, що ви змінюєте правильні конфігураційні файли .

Як уже згадували інші, місця розташування конфігураційних файлів можуть бути замінені різними налаштуваннями всередині основного конфігураційного файлу, а також подання шляху до основного конфігураційного файлу в командному рядку за допомогою -D можливістю вибору.

Ви можете використовувати наступну команду під час сеансу psql, щоб показати, де читаються ваші конфігураційні файли (якщо припустити, що ви можете запустити psql). Це лише крок усунення несправностей, який може допомогти деяким людям:

select * from pg_settings where setting~'pgsql';  

Ви також повинні переконатися, що домашній каталог вашого postgres користувача є там, де ви очікуєте його. Я кажу це, тому що це досить просто не помітити через те, що у вашому підказці відображатиметься ' ~' замість фактичного шляху вашого домашнього каталогу, що робить його не таким очевидним. Багато установок за замовчуванням призначено домашній каталог користувача postgres /var/lib/pgsql.

Якщо воно не встановлено таким, яким воно повинно бути, зупиніть службу postgresql і використовуйте наступну команду під час входу в систему як root. Також переконайтеся, що користувач postgres не увійшов до іншого сеансу:

usermod -d /path/pgsql postgres

Нарешті переконайтеся, що ваша змінна PGDATA правильно встановлена, ввівши echo $PGDATA, що має вивести щось подібне до:

/path/pgsql/data

Якщо він не встановлений або показує щось інше, ніж очікується, вивчіть файли запуску або RC, наприклад. Визначивши правильний сценарій запуску для своєї машини, ви можете вставити наступне:

export PGDATA=/path/pgsql/data

У своїй системі я розмістив це, /etc/profile.d/profile.local.shщоб воно було доступним для всіх користувачів.

Тепер ви маєте змогу запускати базу даних як завжди, і всі ваші налаштування шляху до psql повинні бути правильними!


3

pg_config призначений для отримання інформації про компліментацію, щоб допомогти розширенням та клієнтським програмам збирати та посилатися на PostgreSQL. Він нічого не знає про активні екземпляри PostgreSQL на машині, лише двійкові файли.

pg_hba.conf може відображатися в багатьох інших місцях залежно від того, як встановлено Pg. Стандартне розташування - pg_hba.conf в каталозі даних_даного бази даних (який може бути в / home, / var / lib / pgsql, / var / lib / postgresql / [версія] /, / opt / postgres /, тощо, тощо тощо) але користувачі та пакувальники можуть розміщувати його куди завгодно. На жаль,

Єдиний вірний спосіб знайти pg_hba.conf - це запитати запущений екземпляр PostgreSQL, де це pg_hba.conf, або запитати sysadmin, де він є. Ви навіть не можете розраховувати на запитання, де знаходиться datadir, і аналізує postgresql.conf, оскільки сценарій init може пропустити параметр на зразок -c hba_file = / some / other / path при запуску Pg.

Що ви хочете зробити, це запитати PostgreSQL:

SHOW hba_file;

Ця команда повинна бути запущена на суперсесійному сеансі, тому для сценаріїв оболонок ви можете написати щось на зразок:

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

і встановити змінні середовища PGUSER, PGDATABASE тощо, щоб гарантувати правильність з'єднання.

Так, це дещо проблема курки-яєць, оскільки, якщо користувач не може підключитися (скажімо, після викручування редагування pg_hba.conf), ви не зможете знайти pg_hba.conf, щоб виправити це.

Інший варіант полягає в тому, щоб подивитися на висновок команди ps і побачити, чи там видно аргумент каталогу D-майстра -D, наприклад,

ps aux  | grep 'postgres *-D'

оскільки pg_hba.conf буде знаходитися всередині каталогу даних (якщо ви не перебуваєте на Debian / Ubuntu чи якійсь похідній і використовуєте їх пакети).

Якщо ви орієнтовані саме на системи Ubuntu з встановленим PostgreSQL з пакунків Debian / Ubuntu, це стає трохи простіше. Вам не доведеться мати справу зі складеним вручну Pg-джерелом, для якого хтось initdb'd даними даних у своєму домашньому режимі, або EnterpriseDB Pg встановлюється в / opt тощо. Ви можете запитати pg_wrapper, Debian / Ubuntu multi -версія Pg manager, де PostgreSQL використовує команду pg_lsclusters від pg_wrapper.

Якщо ви не можете підключитися (Pg не працює, або вам потрібно відредагувати pg_hba.conf для підключення), вам доведеться шукати в системі файли pg_hba.conf. На Mac і Linux буде робити щось на зразок sudo find / -type f -name pg_hba.conf. Потім перевірте файл PG_VERSION у тому самому каталозі, щоб переконатися, що це правильна версія PostgreSQL, якщо у вас є декілька. (Якщо pg_hba.conf знаходиться в / etc /, ігноруйте це, натомість це ім'я батьківського каталогу). Якщо у вас є декілька каталогів даних для тієї ж версії PostgreSQL, вам доведеться переглянути розмір бази даних, перевірте командний рядок запущених postgres з ps, щоб побачити, чи відповідає каталог аргументів даних -D, де ви редагуєте тощо. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

Моя проблема полягала в тому, що я не вводив жодного сервера. Я подумав, що це за замовчуванням через заповнювача, але коли я набрав localhost, він спрацював.


2

Якщо ви намагаєтесь знайти цей файл у Cloud 9, ви можете зробити це

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

Натисніть Iдля редагування / вставки, натисніть ESC3 рази і введіть, :wqщоб зберегти файл і вийти


2

Якщо ви зіткнулися з цією проблемою з рейками і вам відомо, що ви вже створили це ім’я користувача з паролем разом з правильними правами, вам просто потрібно вписати наступне в кінці файлу database.yml.

host: localhost

загальний файл буде мати вигляд нижче

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

Вам взагалі не потрібно чіпати pg_hba.confфайл. Щасливе кодування


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.