Ограничение доступа
Управление доступом в PostgreSQL — это многослойный процесс, обеспечивающий надежную защиту данных. Помимо файла pg_hba.conf, который регулирует аутентификацию пользователей на основе их сетевого адреса и выбранного метода проверки подлинности, существует еще один важный файл — pg_ident.conf.
Вместе эти два файла образуют фундамент системы безопасности PostgreSQL, позволяя администратору гибко настраивать как сетевое разграничение доступа, так и интеграцию с внешними системами аутентификации.
Файл pg_hba.conf
При подключении к базе данных кроме проверки на право подключения пользователю необходимо также пройти процедуру аутентификации. Правила аутентификации настраиваются в файле pg_hba.conf (HBA — host-based authentication) и разрешают или запрещают подключение пользователя к серверу. Файл состоит из строк правил, которые читаются сверху вниз при проверке аутентичности пользователя. Разновидности правил покрывают все возможные способы клиентских соединений.
Все незакомментированные и непустые строки должны следовать структуре из пяти столбцов (один из них — для локальных подключений — пропущен). Когда сервер получает клиентский запрос на установку соединения, правила в pg_hba.conf последовательно проверяются, начиная с самого первого (сверху вниз). В правилах содержатся критерии, на совпадение с которыми проверяется входящее соединение. Если первое правило не подходит, проверяется второе, и так далее до тех пор, пока либо подходящее правило не будет найдено, либо в установке соединения будет отказано. Если совпадение нашлось, первое подошедшее правило будет обработано и никакие другие правила проверяться не будут.
В качестве комментария используется #. Длинные строки правил можно разбивать на несколько строк, ставя в конце строки знак обратной косой черты \ перед переводом строки.
Пример разбивки строки:
local \all \peer \
Структура записей в pg_hba.conf
Все строки в файле имеют пять полей (за исключением типа подключения local, для которого четвертое поле пропускается):
- тип соединения;
- база данных, к которой выполняется подключение;
- роль, от имени которой выполняется подключение;
- адрес узла или сети, или их имена источника соединения;
- метод аутентификации и, возможно, дополнительные опции.
Все строки правил начинаются с первого символа строки. Разделителем полей являются пробелы или табуляции, между полями их может быть несколько.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host samerole +grp_students samenet scram-sha-256
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
Рассмотрим каждое поле подробнее.
Типы соединений
Первое поле TYPE указывает тип соединения:
local— соединения посредствомUnix-сокетов (файл особого типа);host— соединение через любой сетевой адаптер, в том числе через закольцовывающий сетевой интерфейс (loopback);hostssl— то же самое, чтоhost, но обязательно с поддержкойSSL;hostnossl—hostбез поддержкиSSL;hostgssenc— засекреченные соединения по протоколуGSSAPI;hostnogssenc— соединения по протоколуGSSAPIбез засекречивания.
База данных
В поле DATABASE указывается, к какой базе данных устанавливается клиентское соединение. При этом в качестве итоговой точки подключения может быть название одной базы данных, несколько через запятую или целый файл:
@файл— имя отдельного файла со списком баз данных;sameuser— база, название которой совпадает с именем пользователя, устанавливающего соединение;samerole— база, название которой совпадает с именем группы, куда входит пользователь, устанавливающий соединение;replication— не является именем базы данных, это особый тип записей для репликации.
Во втором поле правил pg_hba.conf указывают либо имя базы данных, либо replication. В последнем случае это особый тип записей, указывающий правила аутентификации в случае, если пользователь запрашивает соединение для репликации. Примером такого клиента является pg_basebackup. Если же запись относится к обычному клиентскому подключению, то в поле должны быть значения, отличные от replication.
Роль
В третьем поле USER записей в pg_hba.conf указывают информацию о пользователе, который пытается установить соединение. В поле можно указывать:
- имя роли или имена через запятую;
+имя— группа, в которую входит пользователь;@файл— файл со списком имен пользователей.
Когда происходит попытка установить соединение, клиент указывает имя базы, с которой необходимо соединиться, и имя пользователя, от имени которого необходимо установить соединение. Пусть, например, имеется запись:
host samerole +grp_students samenet md5
Такому правилу будут подходить соединения с адресов из тех же сетей, что и адреса сетевых адаптеров сервера (samenet), происходящие от имени любых пользователей, входящих в группу grp_students и пытающихся подключиться к базе данных с именем grp_students.
Источник соединения
В четвертом поле ADDRESS для соединений типа local стоит пропуск, так как это соединения через файл Unix-сокет. Такие соединения могут устанавливаться только на локальном компьютере, поскольку Unix-сокет никак не связан с сетевыми адаптерами.
Любые типы сетевых соединений (host и тому подобное) обязательно имеют информацию об источнике соединения, которая и служит критерием проверки, подходит ли правило в pg_hba.conf запросу на соединение.
В этом поле можно указывать IPv4-, IPv6-адреса хостов или сетей, а также можно указывать имена хостов и их доменную часть. В случае, если указано имя, СУБД выполняет разрешение имени (resolve), используя штатный механизм ОС.
Варианты источника соединения для всех типов кроме local:
-
IPv4-адрес сети:IPv4-адрес, пробел, сетевая маска —192.168.0.0 255.255.255.0; -
IP-адреса в форме CIDR с длиной префикса через
/:192.168.0.0/24— IPv4-адрес сети;192.168.0.1/32— IPv4-адрес хоста;::1/128— IPv6-адрес хоста, соответствующий имениlocalhost;
-
имя_хоста— имя узла сетиserver.dbs.local; -
имя_хоста— суффикс имени хоста с доменной частью.dbs.local; -
samehost— соединение с того же адреса, что и любой из адресов интерфейсов сервера; -
samenet— соединение из любых сетей, которым принадлежат IP-адреса интерфейсов сервера.
Методы аутентификации
В последнем поле METHOD указывают метод аутентификации, перечислим некоторые из них:
trust— разрешает соединение без проверки;reject— запрещает соединение;scram-sha-256— засекреченные пароли хранятся в СУБД;md5— засекреченные пароли хранятся в СУБД;password— пароли хранятся в СУБД без засекречивания;gss— внешняя аутентификацияGSSAPIKerberos v5;peer— внешняя аутентификация в ОС;cert— внешняя аутентификацияSSL-сертификатами;pam— внешняя аутентификация в ОС библиотекой PAM;radius— внешняя аутентификация в системе RADIUS;ldap— внешняя аутентификация в дереве каталогов LDAP.
Методы trust и reject аутентичность не проверяют, а просто разрешают соединение или запрещают. Внутренние методы аутентификации scram-sha-256, md5 и password хранят пароли в системном каталоге pg_authid. При входе в сеанс при такой аутентификации необходимо вводить пароль. Клиентская библиотека libpq может работать с файлом сохраненных паролей ~/.pgpass для автоматизации входа в сеанс (не рекомендуется в целях безопасности).
В СУБД Pangolin по умолчанию включены методы scram-sha-256, ldap и radius. Дополнительные методы аутентификации, доступные для администраторов, не связанных с безопасностью (non security administrators), определяются параметром конфигурации enabled_extra_auth_methods.
postgres@postgres=# SHOW enabled_extra_auth_methods;
enabled_extra_auth_methods
----------------------------
scram-sha-256, peer, cert
(1 row)
Можно самостоятельно разрешать дополнительные методы аутентификации, например peer — метод, базирующийся на имени пользователя, полученного из ОС. Это имя должно совпадать с именем зарегистрированной роли в СУБД.
Файл отображения имен pg_ident.conf
При использовании внешних систем аутентификации серверу PostgreSQL необходимо отобразить имя пользователя. Для подобных манипуляций предназначен файл pg_ident.conf, позволяющий отобразить имя пользователя во внешней системе аутентификации на роль в PostgreSQL. В то же время в правилах pg_hba.conf должна быть опция map=map-name.
Файл pg_ident.conf содержит строки вида: map-name system-username database-username, где:
map-name— имя отображения в опцииmap=map-nameправила аутентификации;system-username— имя пользователя во внешней системе аутентификации;database-username— имя зарегистрированной в СУБД роли, на которую отображается внешнее имя.
В простейшем случае имя пользователя во внешней системе — это просто строка символов, например user1 (system-name), которую надо отобразить на роль student. Тогда получится отображение:
# Put your actual configuration here
# ----------------------------------
# MAPNAME SYSTEM-USERNAME PG-USERNAME
mapname user1 student.
Имя mapname здесь должно соответствовать заданным опцией map=... имени отображения. Например, так:
local student student peer map=mapname
Для сложных манипуляций с отображениями используют регулярные выражения.
Итоги
- Файл
pg_hba.confсодержит правила аутентификации, которые проверяются сверху вниз — применяется первое совпавшее правило; - Каждая строка
pg_hba.confсостоит из пяти полей: тип соединения, база данных, роль, адрес источника, метод аутентификации; - Тип соединения
localпредназначен дляUnix-сокетов, полеADDRESSдля этого типа пропускается; - В поле
DATABASEможно указыватьsameuser,samerole,replicationили список имен через запятую; - В поле
USERможно указывать+имядля групповой роли или@файлдля списка пользователей из внешнего файла; - В поле
ADDRESSдоступны значенияsamehostиsamenetдля сопоставления с адресами интерфейсов сервера; - Методы
trustиrejectне проверяют подлинность — они разрешают или запрещают подключение; - Внутренние методы
scram-sha-256,md5,passwordхранят пароли в системном каталогеpg_authid; - Файл
pg_ident.confотображает имена пользователей внешней системы на роли PostgreSQL — работает совместно с опциейmap=вpg_hba.conf.
Самопроверка
Вопрос 1
Какой тип соединения в pg_hba.conf соответствует Unix-сокетам?
Вопрос 2
В файле pg_hba.conf настроено правило:
host all all 10.0.0.0/8 trust
Какие утверждения верны? Выберите все.
Вопрос 3
В файле pg_hba.conf правило имеет вид:
host samerole +grp_students samenet scram-sha-256
Что означает samerole в поле DATABASE?
Вопрос 4
В pg_hba.conf для типа host указано адресное поле 192.168.0.1/32. Что это означает?
Вопрос 5
Для чего предназначен файл pg_ident.conf?