Иллюстрированный самоучитель по PostgreSQL

Аутентификация и шифрование

Пароли обычно задаются в 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)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.