Получение ошибки: аутентификация равноправного узла для пользователя «postgres» не удалась при попытке заставить pgsql работать с rails

739

Я получаю ошибку:

FATAL: Peer authentication failed for user "postgres"

когда я пытаюсь заставить postgres работать с Rails.

Вот мой pg_hba.conf, мой database.ymlи дамп полного следа .

Я изменил аутентификацию на md5 в pg_hba и пробовал разные вещи, но, похоже, ничего не работает.

Я также попытался создать нового пользователя и базу данных в соответствии с Rails 3.2, FATAL: неудачная аутентификация для пользователя (PG :: Error)

Но они не появляются на pgadmin или даже когда я бегу sudo -u postgres psql -l.

Есть идеи, где я иду не так?

orderof1
источник
1
1): убедитесь, что у вас есть пользователь с именем «postgres», созданный и имеющий права на вашу базу данных 2): убедитесь, что у него есть пароль 3): убедитесь, что ваш config / database.yml содержит учетные данные прав (имя пользователя + пароль)
Мр. Йошиджи
2
нужно везде сверстники и отступы ставить на md5
Артем.Борысов
13
См. Также этот ответ - соединение может быть неуспешным, localhostно успешным 127.0.0.1.
Uvsmtid
9
В моем случае мне нужно было добавить host: localhostв database.ymlфайл.
Михаил Великов
эта ссылка мне помогла suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/…
Судип Бхандари

Ответы:

1030

Проблема все еще в вашем 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 по методам аутентификации .

Одноранговая аутентификация

Метод одноранговой аутентификации работает путем получения имени пользователя операционной системы клиента из ядра и использования его в качестве разрешенного имени пользователя базы данных (с необязательным отображением имени пользователя). Этот метод поддерживается только на локальных соединениях.

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

Методы аутентификации на основе пароля - это md5 и пароль. Эти методы работают аналогично, за исключением того, что пароль передается по соединению, а именно, MD5-хэшированный и открытый текст соответственно.

Если вас вообще беспокоят атаки с «перехватом» пароля, тогда md5 предпочтительнее. Простой пароль всегда следует избегать, если это возможно. Однако md5 нельзя использовать с функцией db_user_namespace. Если соединение защищено шифрованием 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 По крайней мере на моей установке ElementaryOS (Ubuntu) sudo service postgreql restartтоже работает.
Марнен Лайбоу-Козер
13
Чтобы ответить на мой собственный вопрос: «peer» аутентификация означает, что postgres запрашивает у вашей операционной системы ваше имя для входа и использует его для аутентификации, поэтому пользователь в ОС и на postgres должен быть одним и тем же. «md5» использует аутентификацию по зашифрованному паролю.
Денис
9
Я понимаю изменения. Но почему это не поведение по умолчанию? Есть ли недостаток использования md5?
Виктор Маркони
364

После установки 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

    в

    местный все postgres md5

После перезапуска сервера postgresql вы можете получить к нему доступ со своим собственным паролем.

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

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

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

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

для дальнейшей проверки здесь

Ариварасан Л
источник
18
изменение метода на «доверие» сработало для меня. +1 для объяснения деталей метода аутентификации.
La-comadreja
4
В OS X homebrew по умолчанию используется доверие, в то время как в Ubuntu каким-то образом по умолчанию установлено значение «peer», что привело к расхождению между моей настройкой и настройкой моего коллеги. Мы изменили его на MD5, что не помогло, поэтому реальный ответ здесь - «доверие» (мы проводим только тестирование разработки). Должен получить больше голосов.
xji
2
Вы также можете установить md5 везде с самого начала
Артем. Борисов
2
Этот способ у меня работает, с использованием метода md5 сначала не было.
Сианипард
нужно использовать одинаковые пароли? sudo passwd postgres
Питер Краусс
213

Если вы подключаетесь через localhost (127.0.0.1), у вас не должно возникнуть этой конкретной проблемы. Я бы не стал много гадать с pg_hba.conf, но вместо этого я бы изменил строку подключения:

psql -U someuser -h 127.0.0.1 database

где someuser - это ваш пользователь, к которому вы подключаетесь, а database - это база данных, к которой у вас есть права доступа.

Вот что я делаю на 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

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

StylusEater
источник
16
Я думаю, что это лучшее решение, так как на самом деле оно решает локальную проблему, не вмешиваясь в нее и не портя глобальную конфигурацию, как рекомендуют другие ответы.
Jeteon
1
Мне пришлось изменить значение host: 127.0.0.1по умолчанию на localhost в config / database.yml - оно находится на той же машине, поэтому я не понимаю, почему
Энтони
Энтони, ты хочешь сказать, что у тебя произошел сбой подключения, пока ты не настроил localhost на 127.0.0.1 в своем database.yml? Я предлагаю проверить ваш файл / etc / hosts, если это так. В противном случае, может быть некоторая другая странность, связанная с разрешением localhost.
StylusEater
1
Это гораздо более элегантно по сравнению с использованием метода локальной аутентификации.
МДГ
1
На сегодняшний день это лучшее решение IMO
Салил Джуниор
45

Это сработало для меня!

sudo -u postgres psql
iamuser2
источник
это должно работать нормально, если ваш текущий зарегистрированный пользователь находится в файле sudoers.
Абубакер Сиддик
16

Если у вас есть проблема, вам нужно найти свой pg_hba.conf. Команда:

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

и после этого измените файл конфигурации:

Postgresql 9,3

Postgresql 9,3

Postgresql 9,4

Postgresql 9,3

Следующий шаг: Перезапуск вашего экземпляра БД:

service postgresql-9.3 restart

Если у вас возникли проблемы, вам нужно снова установить пароль:

ALTER USER db_user with password 'db_password';

d.danailov
источник
16
  1. Перейдите в этот /etc/postgresql/9.x/main/ и откройте файл pg_hba.conf

В моем случае:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. Замените пира с md5

Так что это будет изменено на:

Административный вход в базу данных с помощью доменного сокета Unix local все 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

Эта:

Административный вход в базу данных через сокет домена 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 после перезапуска

Ниже приведен список методов, используемых для соединения с 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
Это работает над Ubuntu 19.10
Vithal Reddy
Спасибо, это работает на 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

а затем внести изменения.

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

Если вы хотите сохранить конфигурацию по умолчанию, но хотите аутентификацию md5 с сокетным соединением для одного конкретного пользователя / db-соединения, добавьте «локальную» строку ДО строки «local all / all»:

# 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
источник
«ДО» в этом ответе заслуживает большей проработки в других ответах. Оказывается, psql последовательно просматривает записи в файле pg_hba.conf, как указано в документах: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin
# TYPE DATABASE USER АДРЕС METHOD локального имени пользователя имя_бд md5 # <- эта линия не в порядке
Киры Meas
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 после их создания. Для убунту:

sudo /etc/init.d/postgresql restart
sibosop
источник
6

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

Supun Muthutantrige
источник
6

Используйте host=localhostв связи.

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);
Маниша Васани
источник
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.confdo, применимы и являются на 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, такие как .profile или .bash.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 в каталоге data_directory базы данных (который может быть в / home, / var / lib / pgsql, / var / lib / postgresql / [версия] /, / opt / postgres /, и т. Д. И т. Д. И т. Д. И т. Д.) но пользователи и упаковщики могут поставить его где угодно. К несчастью.

Единственный действительный способ найти pg_hba.conf - это спросить работающий экземпляр PostgreSQL, где находится pg_hba.conf, или спросить системного администратора, где он находится. Вы даже не можете полагаться на вопрос о том, где находится datadir и парсинге postgresql.conf, потому что сценарий инициализации может передать такой параметр как -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 и посмотреть, виден ли там аргумент каталога данных postmaster -D, например

ps aux  | grep 'postgres *-D'

поскольку pg_hba.conf будет находиться в каталоге данных (если вы не используете Debian / Ubuntu или какую-либо производную и используете их пакеты).

Если вы нацелены конкретно на системы Ubuntu с PostgreSQL, установленным из пакетов Debian / Ubuntu, это станет немного проще. Вам не нужно иметь дело с Pg, скомпилированным вручную из исходного кода, для которого чей-то initdb-файл dadadir установлен в его домашнем каталоге, или с помощью EnterpriseDB Pg, установленным в / opt и т. Д. Вы можете задать pg_wrapper, Debian / Ubuntu multi -version 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, это сработало.

Epsilon47
источник
2

Если вы пытаетесь найти этот файл в Cloud 9, вы можете сделать

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

Нажмите Iдля редактирования / вставки, нажмите ESC3 раза и введите, :wqчтобы сохранить файл и выйти

Маршалл
источник
2

Если вы столкнулись с этой проблемой, связанной с rails, и знаете, что вы уже создали это имя пользователя с паролем и правильные права, то вам просто нужно добавить следующее в конец файла database.yml.

host: localhost

общий файл будет выглядеть ниже

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

Вам не нужно трогать ваш pg_hba.confфайл вообще. Удачного кодирования

ImranNaqvi
источник