Нет пароля для postgresql superuser

После установки PostgreSQL 9.1 на Ubuntu 12.04 я установил пароль для учетной записи суперпользователя postgres. Я хочу, чтобы все пользователи вводили свой пароль при входе в систему. Вот почему я настроил pg_hba.conf следующим образом:

#Database administrative login by Unix domain socket
local   all             postgres                                md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5

После внесения этих изменений я перезапустил postgresql. Когда я делаю этот psql -U testuser меня спрашивают о пароле, но когда я psql -U testuser систему с учетной записью postgres, например psql -U postgres я не получаю приглашение к паролю и не вошел в систему. Если я заставляю приглашение пароля с psql -U postgres -W Я могу войти, набрав правильный пароль или не набрав ничего вообще. Ввод неправильного пароля будет отклонен.

Может ли кто-нибудь объяснить мне, почему это происходит?

Относительно примечания: я вижу много примеров, когда люди используют идентификатор в качестве метода проверки подлинности для пользователя postgres, утверждая, что для того, чтобы стать пользователем postgres, нужен корневой пароль машины. Я предполагаю, что аргументация состоит в том, что если злоумышленник получает root-доступ, все равно будет сделано. Я бы предпочел войти в систему с паролем, хотя, который не совпадает с паролем root. Я предпочитаю иметь разные пароли для разных вещей. Это разумно?

Вывод grep '^[^#]' pg_hba.conf

local   all             postgres                                md5
local   all             all                                     md5
host    all             all             127.0.0.1/32            md5

Ответ 1

Ваш pg_hba.conf действительно требует пароль для подключений сокетов unix, но есть еще пути вокруг него, которые вы должны проверить:

  1. файл .pgpass в домашнем каталоге postgres, содержащем пароль (также проверьте переменную среды PGPASSFILE для нестандартного пути).

  2. можно задать переменную среды PGPASSWORD.

Также существует вероятность того, что вы редактируете неправильный файл pg_hba.conf. При подключении в качестве постгеров правильный путь может быть получен для проверки командой SHOW hba_file SQL.

Кроме того, вы можете проверить файл журнала, /var/log/postgresql/postgresql-9.1-main.log чтобы подтвердить, что файлы конфигурации перезагружаются, когда вы его запрашиваете, и искать подозрительное сообщение во время аутентификации.

Что касается причины, по которой соединения без пароля с пользователем postgres являются общими, у debian PG-9.1 pg_hba.conf есть этот комментарий о запрете их:

# DO NOT DISABLE!  
# If you change this first entry you will need to make sure that the  
# database superuser can access the database using some other method.  
# Noninteractive access to all databases is required during automatic  
# maintenance (custom daily cronjobs, replication, and similar tasks).  
#  
# Database administrative login by Unix domain socket  
local   all             postgres                                peer  

Поскольку Debian и Ubuntu используют одни и те же пакеты postgres, это относится и к Ubuntu.

Ответ 2

Повторяю ваше странное поведение, я думаю, что вы пропустили строку pg_hba.conf, специфичную для пользователя postgres. Пожалуйста, покажите результат:

grep '^[^#]' pg_hba.conf 

Что касается ident vs md5; лично я предпочитаю идентификатор для интерактивного использования в разработке, и это нормально для обычных пользователей, но я не думаю, что предоставление доступа к пользователю postgres через sudo - отличная идея. Оба sudo -u postgres psql и psql -u postgres -W предоставляют доступ к роли суперпользователя postgres и, следовательно, к файловой системе как к пользователю базы данных. Ни один из них не требует пароля root, и sudo легко может быть ограничено с помощью sudoers чтобы ограничить вызывающего пользователя простым запуском psql. Тем не менее, с sudo -u postgres psql клиентский код работает как postgres тоже, поэтому он имеет большую поверхность атаки, и всегда есть шанс, что пользователь sudoer способ обойти ваши ограничения sudoer.

Я использую ident в dev, md5 в процессе производства.