Перейти к основному содержимому

Ограничение доступа

Управление доступом в 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 — внешняя аутентификация GSSAPI Kerberos 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?