Аутентификация и шифрование
Допустим, на сервере базы данных booktown имеются учетные записи системных пользователей jdrake, jworsley и auditor, принадлежащие соответственно двум специалистам по сбыту и аудитору.
Для двух групп пользователей было бы логично создать пару карт идентификации. Предположим, рабочая станция отдела сбыта имеет IP-адрес 192.168.1.3 и ей необходим доступ только к базе данных booktown. Рабочая станция аудитора имеет IP-адрес 192.168.1.4 и требует доступа ко всем базам данных. Файл pgajiba.conf для такого сценария приведен в листинге 8.11.
Листинг 8.11. Выбор режима аутентификации ident в файле pgajiba.conf.
host booktown 192.168.1.3 255.255.255.255 ident sales host all 192.168.1.4 255.255.255.255 ident audit
Содержимое этого конфигурационного файла означает, что компьютер sales подключается к базе данных booktown с использованием карты идентификации sales, а компьютер audit может подключаться к любой базе данных с использованием карты audit. Обе карты должны быть соответствующим образом настроены в файле pgjdent.conf. Пример настройки приведен в листинге 8.12.
Листинг 8.12. Пример файла pgjdent.conf.
# MAP IDENT POSTGRESQLJJSERNAME sales jdrake sales sales jworsley sales audit, auditor sales audit auditor postgres
Файл, приведенный в листинге 8.12, разрешает системным пользователям jdrake и jworsley подключение в качестве пользователя PostgreSQL sales. Системному пользователю auditor разрешается подключение к PostgreSQL в качестве пользователя sales или postgres.
Примечание
Идентификационное имя пользователя может связываться с несколькими именами пользователей PostgreSQL, как показано для пользователя auditor в листинге 8.12.
Если вы ограничиваетесь автоматической идентификацией удаленных пользователей по методу ident, файл pgjdent.conf вам не понадобится. В этом случае вместо имени карты в файле pgjiba.conf указывается специальное ключевое слово sameuser.
Стоит напомнить, что этот вариант в целом аналогичен методу trust, но в методе ident sameuser подключения ограничиваются по имени пользователя, предоставленному демоном identd. Попытка задания имени пользователя PostgreSQL (например, при помощи ключа – U клиента psql), отличающегося от имени, передаваемого identd, приводит к отказу в подключении.
Пример использования ключевого слова sameuser приведен в листинге 8.13.
Листинг 8.13. Конфигурирование с использованием ключевого слова sameuser.
host booktown 192.168.1.0 255.255.255.0 ident sameuser
В этой конфигурации любой компьютер из сетевого блока 192.168.1 может подключиться к базе данных booktown с именем PostgreSQL, совпадающим с именем пользователя, предоставленным службой identd. Ключевое слово sameuser заставляет PostgreSQL сравнивать имя пользователя PostgreSQL с именем, предоставленным identd.
Отказ в аутентификации
Если попытка аутентификации завершается неудачей, PostgreSQL обычно предоставляет содержательную информацию об ошибке, не ограничиваясь простым отказом. Ниже перечислены некоторые распространенные сообщения об ошибках с краткими пояснениями.
- FATAL I: user "testuser" does not exist. Имя пользователя не найдено в системной таблице pg_shadow; это означает, что учетная запись пользователя не существует. Создание новых пользователей описано в главе 10.
- FATAL I: Database "testdb" does not exist In the system catalog. Указанная база данных не существует. Если при подключении к PostgreSQL имя базы данных не указано, по умолчанию используется имя текущего пользователя.
- No pg_hba.conf entry for host 123.123.123.1 .user testuser, database testdb. Связь с сервером была установлена, но сервер не принял подключение. Причина отказа заключается в том, что сервер не находит в файле pg_hba.conf запись для пользователя testuser, обращающегося к базе данных testdb со своего IP-адреса (123.123.123.1).
- Password authentication failed for user 'testuser'. Связь с сервером была установлена, но в подключении отказано из-за неправильного пароля. Проверьте введенный пароль и убедитесь в его правильности. Далее следует проверить настройку аутентификационных пакетов (например, Kerberos или Ident), если они используются в вашей системе.
Проверьте, назначен ли пароль указанному пользователю. Если файл pg_hba.conf настроен на проверку паролей, эта проверка производится в любом случае, даже если пароль не указан. Всем пользователям без пароля присваивается пароль NULL. Когда такой пользователь пытается подключиться без указания пароля, пароль NULL сравнивается с NULL – результат равен false.
С другой стороны, если пользователь пытается ввести пароль (пусть даже пустую строку), введенное значение также сравнивается с NULL и результат по-прежнему остается равным false. Если в системе требуется аутентификация с помощью паролей, вы должны назначить пароли всем пользователям. Если какому-либо пользователю не будет назначен пароль, аутентификация всегда будет завершаться неудачей и пользователь не сможет подключиться к серверу.