![]() |
![]() |
![]() |
Аутентификация клиента Аутентификация клиентов занимает центральное место в PostgreSQL. Без нее пришлось бы либо пожертвовать возможностью удаленного подключения, либо слепо разрешать каждому, кто подключается к серверу, выборку и даже модификацию данных. PostgreSQL предоставляет в ваше распоряжение несколько механизмов аутентификации клиентов, и вы как администратор базы данных должны выбрать тот механизм, который лучше подходит для вашей системы. В PostgreSQL 7.1.x клиентский доступ на уровне хоста задается в файле pg_hba.conf. Права и ограничения, описанные в этом файле, не следует путать с правами доступа к объектам базы данных, установленными для пользователей PostgreSQL. Файл pg_hba.conf позволяет задать тип аутентификации на уровне хоста, выполняемой перед подключением к базе данных, после которого вступают в силу права пользователей. ПРИМЕЧАНИЕ Файл pg_hba.conf находится в каталоге данных PostgreSQL (например, /usr/local/pgsql/data) и создается автоматически при выполнении команды initdb в процессе установки PostgreSQL. Аутентификация PostgreSQL на уровне хоста отличается высокой гибкостью и большим разнообразием настраиваемых параметров. Например, доступ к базе данных можно ограничить отдельными хостами или предоставить его семейству IP-адресов при помощи сетевых масок. С каждым хостом связывается специальная запись, представленная отдельной строкой в файле pg_hba.conf. Используя хостовые записи, можно ограничить доступ пользователя одной конкретной базой данных или разрешить ему доступ ко всем базам. Более того, при поступлении запроса на подключение пользователя с заданного хоста можно потребовать, чтобы пользователь прошел аутентификацию по таблице пользователей PostgreSQL. Проще говоря, файл pg_hba.conf определяет, кому, с какого компьютера и к каким базам данных разрешено подключение, а также каким образом должна проходить проверка для предоставления доступа. ВНИМАНИЕ В механизме удаленной аутентификации пароли могут пересылаться по сети в обычном текстовом виде. Все зависит от того, организовали ли вы шифрование клиентского сеанса. Прежде чем разрешать пользователям удаленное подключение к базам данных PostgreSQL, необходимо хорошо разобраться в том, как ваше приложение взаимодействует с PostgreSQL. Аутентификация с использованием паролей Пароли используются для подтверждения личности пользователей PostgreSQL и предотвращения посторонних подключений. В PostgreSQL 7.1.x пароли хранятся в текстовом виде в системной таблице pg_shadow, структура которой описана в табл. 8.1. Хотя пароли хранятся в виде простого текста, просмотр содержимого таблицы pg_shadow разрешен только суперпользователям PostgreSQL. Таблица 8.1. Структура таблицы pg_shadow
Системная таблица pg_shadow доступна из любой базы данных. Из этого следует, что пользовательский доступ не ограничивается конкретной базой. Если данные некоторого пользователя присутствуют в таблице pg_shadow, то этот пользователь сможет подключиться к любой базе данных на серверном компьютере (конечно, если ему вообще разрешено подключение). Пароли обычно задаются в PostgreSQL при создании учетной записи пользователя (командой CREATE USER) или при ее дальнейших модификациях (командой ALTER USER). Кроме того, пароль можно изменить вручную командой UPDATE. Дополнительная информация о назначении паролей приведена в главе 10. Если пароль не задан, по умолчанию используется псевдозначение NULL. При включении парольной аутентификации в файле pgjiba.conf попытки подключения со стороны пользователей, не имеющих паролей, всегда завершаются неудачей. С другой стороны, если подключение устанавливается с доверенного хоста (как, например, local host по умолчанию), любой пользователь сможет подключиться с паролем NULL. Для доверенных хостов пароли полностью игнорируются. ПРИМЕЧАНИЕ Команда GRANT ограничивает доступ к таблицам в базе данных. За дополнительной информацией обращайтесь к главе 10. Если ваши требования к безопасности выходят за рамки абсолютного минимума, одной парольной аутентификации на сервере PostgreSQL будет недостаточно. Любой аутентифицироваыный пользователь сможет обратиться к любой базе данных в системе, а передаваемые в текстовом виде пароли могут попасть в посторонние руки. Если вы планируете организовать доступ к базе данных через Интернет, обязательно прочитайте следующие подразделы. В них рассматриваются файл pg_hba.conf и шифрование сеансов. Файл pg_hba.conf В начале главы уже упоминалось о том, что файл pg_hba.conf обеспечивает аутентификацию клиента на сервере PostgreSQL. Файл состоит из записей, описывающих хосты и предоставляемые им права (например, база данных, к которой разрешено подключение, метод аутентификации и т. д.). Когда приложение обращается к серверу с запросом на подключение, в этот запрос включается имя пользователя PostgreSQL и база данных, к которой он намеревается подключиться. В зависимости от настройки хоста также может передаваться пароль. ПРИМЕЧАНИЕ PostgreSQL ведет собственные таблицы пользователей и паролей, не имеющие отношения к системным таблицам. Данные пользователей PostgreSQL не обязаны совпадать с данными пользователей операционной системы. Получив запрос на подключение, PostgreSQL обращается к файлу pgjiba.conf и проверяет, разрешен ли доступ к указанной базе данных хосту, на котором работает приложение. Если подключения с этого хоста разрешены, PostgreSQL проверяет условия, которым должно удовлетворять приложение для успешного подключения. Это относится как к локальным, так и к удаленным подключениям. Для каждого запроса на подключение сервер читает из файла pgjiba.conf сведения о способе аутентификации. Проверка производится при каждом подключении к серверу PostgreSQL, поэтому после добавления, изменения или удаления записей из файла pg_hba.conf перезапускать PostgreSQL не нужно. В листинге 8.1 приведен простой пример файла pgjiba.conf. Листинг 8.1. Простой файл pgjiba.conf # PostgreSQL HOST ACCESS CONTROL FILE f # Configured Hosts: local all trust host all 127.0.0.1 255.255.255.255 trust host booktown 192.168.1.3 255.255.255.255 ident sales host all 192.168.1.4 255.255.255.255 ident audit При инициализации подключения PostgreSQL читает файл pg_hba.conf сверху вниз по одной записи. Как только найдена подходящая запись, PostgreSQL прекращает поиск и разрешает или отвергает подключение в зависимости от результата. Если PostgreSQL не находит подходящей записи в файле pg_hba.conf, подключение автоматически отвергается. Даже если пользователю разрешается подключение к базе данных, права доступа к таблицам по-прежнему продолжают действовать. Если пользователь подключается к базе данных, но не может получить данные из таблицы, проверьте, что ему разрешено выполнение команды SELECT для этой таблицы. В клиенте командной строки psql права доступа к таблицам базы данных проверяются при помощи команды \z. В любом другом интерфейсе к PostgreSQL для получения этой информации можно воспользоваться запросом, приведенным в листинге 8.2. Листинг 8.2. Проверка прав доступа testdb=# SELECT relname as "Relation", relacl as "Access permissions" testdb-# FROM pg_class testdb-# WHERE relkind IN Cr', 'V. 'S') testdb-# AND relname !- '*pg_' testdb-# ORDER BY relname; Relation I Access permissions foo {"=arwR"."jdrake=arwR"} myjlist {"=","jdrake=arwR"."jworsley=r"} (2 rows) Структура файла pg_hba.conf Конфигурационный файл pg_hba.conf содержит серию записей, определяющих параметры аутентификации клиентов с заданных хостов. Структура этого файла позволяет легко изменить его в соответствии с вашими требованиями. В этом файле IP-адрес хоста (или интервал адресов) связывается с некоторой базой данных (или всеми базами) и одним из нескольких методов аутентификации. Для локальных подключений вместо внешнего IP-адреса используется обозначение local host или 127.0.0.1. Синтаксис файла pg_hba.conf должен удовлетворять ряду правил. Во-первых, каждая строка файла содержит одну хостовую запись, при этом перенос записей на следующую строку не разрешен. Во-вторых, каждая запись содержит несколько полей, разделенных табуляциями или пробелами. Количество полей определяемой хостовой записи напрямую связано с ее типом. В листинге 8.3 приведены две записи; в первой поля разделены пробелами, а во второй — символами табуляции. Листинг 8.3. Разделение полей в записях pg_hba.conf пробелами и табуляциями host all 127.0.0.1 255.255.255.255 trust host all 127.0.0.1 255.255.255.255 trust Файл pg_hba.conf может содержать комментарии, строки которых начинаются с символа #. Примеры комментариев приведены в листинге 8.4. Листинг 8.4. Комментарии в файле pgjiba.conf # Book Town host entries # # host all 127.0.0.1 255.255.255.255 trust Хостовые записи, содержащиеся в файле pg_hba.conf, делятся на три общих типа (тип всегда задается первым словом каждой записи).
ПРИМЕЧАНИЕ Ключи, с которыми запускается процесс postmaster, описаны в главе 9. В листинге 8.5 приведен обобщенный синтаксис всех типов записей файла pg_hba.conf. Обратите внимание: все типы записей практически идентичны, разве что в записях типа local не нужно указывать IP-адрес или сетевую маску — подключение заведомо осуществляется с компьютера, на котором работает PostgreSQL. Листинг 8.5. Синтаксис записей файла pg_hba.conf # Запись типа "local" local база_дднных метод^аутентификации [ параметр ] # Запись типа "host" host база_данных 1р_адрес сетевая_наска метод_аутентификации [ параметр ] # Запись типа "hostssl" hostssl база_данных тр_адрес сетевая_маска метод_аутентификации [ параметр ] ПРИМЕЧАНИЕ Помните, что каждая запись в файле pg_hba.conf должна полностью умещаться в одной строке. Перенос записей на другую строку запрещен. Ниже перечислены компоненты записей pg_hba.conf, упоминаемые в листинге 8.5.
ПРИМЕЧАНИЕ За информацией о сетевых масках обращайтесь на сайт Linux Networking HOWTO (http://www. thelinuxreview.com/howto/networking) или к системному администратору.
ВНИМАНИЕ Методы password и crypt рекомендуется использовать лишь в сочетании с внешним механизмом шифрования. Информация о применении единого механизма шифрования для всего трафика PostgreSQL приведена в разделе «Шифрование сеанса». Примеры записей в файле pg_hba.conf В этом разделе приведены некоторые примеры записей в файле pg_hba.conf. Запись, приведенная в листинге 8.6, разрешает подключиться к любой (all) базе данных без пароля (trust) всем пользователям хоста с IP-адресом 192.168.1.10. Листинг 8.6. Один доверенный хост host all 192.168.1.10 255.255.255.255 trust Следующая запись (листинг 8.7) запрещает подключение всем пользователям с IP-адреса 192.168.1.10. Для этого в режиме аутентификации reject вместо базы данных указывается ключевое слово all. Листинг 8.7. Запрет доступа с одного хоста host all 192.168.1.10 255.255.255.255 reject Следующая запись (листинг 8.8) разрешает подключение к базе данных templatel с хоста 192.168.1.10 любому пользователю, указавшему правильный пароль. Режим crypt обеспечивает шифрование пароля в процессе аутентификации. Листинг 8.8. Один хост, одна база данных host templatel 192.168.1.10 255.255.255.255 crypt Запись в листинге 8.9 разрешает доступ к базам данных без пароля из небольшой подсети. Подсеть состоит из всех IP-адресов в интервале от 192.168.1.1 до 192.168.1.15. Как упоминалось ранее, за информацией о сетевых масках следует обращаться на сайт Linux Networking HOWTO (http://www.thelinuxreview.com/howto/ networking) или к администратору сети. Листинг 8.9. Доверенная подсеть host all 192.168.1.0 255.255.255.240 trust Запись, приведенная в листинге 8.10, разрешает доступ с любого хоста из блока 192.168.1 к базе данных booktown без указания пароля. Листинг 8.10. Доверенная подсеть host booktown 192.168.1.0 255.255.255.0 trust Вспомните, о чем говорилось выше: при проверке очередного подключения записи файла pg_hba.conf последовательно читаются от начала к концу, и режим аутентификации определяется первой найденной записью. Если в файле не обнаруживается ни одного совпадения, подключение полностью запрещается. Файл pgjdent.conf Если в хостовой записи указан метод аутентификации ident, PostgreSQL использует файл pgjdent.conf для отображения идентификационного имени пользователя на имя пользователя PostgreSQL. «Идентификационное имя пользователя» предоставляется службой identd (RFC 1413) и определяет имя системной учетной записи, инициировавшей подключение. В целом этот метод аутентификации аналогичен методу trust, но с ограничением доступа по идентификационному имени пользователя. Как сказано в спецификации протокола ident, «Идентификационный протокол не предназначен для аутентификации или управления доступом». Он всего лишь является удобным средством идентификации в сетях, состоящих из защищенных, хорошо контролируемых компьютеров, и не обеспечивает надежной защиты при внешнем доступе. Дело в том, что демон identd всего лишь возвращает имя, описывающее текущего пользователя системы. Например, предоставление пользователю jworsl ey доступа из подсети IP-адресов создает серьезную угрозу для безопасности системы, поскольку любой пользователь компьютера, входящего в эту подсеть, сможет создать учетную запись jworsl еу и успешно пройти «аутентификацию». Файл pgjdent.conf должен находиться в одном каталоге с файлом pg_hba.conf. Путь к этому каталогу определяется переменной среды PGDATA (например, /usr/local/ pgsql/data). Как и в случае с pg_hba.conf, внесение изменений в pgjdent.conf не требует перезапуска PostgreSQL. Содержимое файла pgjdent.conf связывает идентификационные имена с именами пользователей PostgreSQL при помощи особых определений, называемых картами идентификации. Карты идентификации обычно применяются в системах, в которых системные имена пользователей не совпадают с именами пользователей PostgreSQL. Основные правила определения и использования карт идентификации перечислены ниже.
Отдельная запись файла pgjdent.conf состоит из трех полей: имени карты, идентификационного имени пользователя и преобразованного имени пользователя PostgreSQL: HMfljopibi идентификационное_имя KKfl_PostgreSQL Поля разделяются пробелами или символами табуляции.
Допустим, на сервере базы данных booktown имеются учетные записи системных пользователей jdrake, jworsl ey и 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 обычно предоставляет содержательную информацию об ошибке, не ограничиваясь простым отказом. Ниже перечислены некоторые распространенные сообщения об ошибках с краткими пояснениями.
Проверьте, назначен ли пароль указанному пользователю. Если файл pg_hba.conf настроен на проверку паролей, эта проверка производится в любом случае, даже если пароль не указан. Всем пользователям без пароля присваивается пароль NULL. Когда такой пользователь пытается подключиться без указания пароля, пароль NULL сравнивается с NULL — результат равен false. С другой стороны, если пользователь пытается ввести пароль (пусть даже пустую строку), введенное значение также сравнивается с NULL и результат по-прежнему остается равным false. Если в системе требуется аутентификация с помощью паролей, вы должны назначить пароли всем пользователям. Если какому-либо пользователю не будет назначен пароль, аутентификация всегда будет завершаться неудачей и пользователь не сможет подключиться к серверу. |
![]() |
![]() |
![]() |