Обзор конфигурации PG_HBA
В ADPG поле PG_HBA используется для настройки аутентификации клиента, которая контролируется файлом pg_hba.conf в PostgreSQL. Поле PG_HBA содержит записи аутентификации в том же формате, что и pg_hba.conf.
|
ВНИМАНИЕ
Не рекомендуется редактировать непосредственно файл pg_hba.conf. Когда сервис ADPG выполняет действие Reconfigure & Restart, pg_hba.conf переписывается со служебными настройками и настройками из поля PG_HBA, находящегося на вкладке Primary configuration сервиса ADPG.
|
Формат PG_HBA
Поле PG_HBA должно содержать набор записей с правилами аутентификации, по одному на каждой строке. Запись состоит из полей, разделенных пробелами или табуляцией. Поле может содержать пробелы, если его значение заключено в двойные кавычки. Пустые строки и любой текст после символа комментария # игнорируются. Чтобы продолжить запись на следующей строке, завершите строку обратной косой чертой (\).
Записи в PG_HBA обрабатываются сверху вниз. ADPG определяет, соответствует ли запрошенное соединение записи, т.е. совпадают ли тип соединения, имя базы данных, пользователь и IP-адрес. Если да, то выполняется аутентификация с использованием метода, указанного в записи. Если результат успешный, соединение разрешается, в противном случае оно запрещается. Последующие записи не рассматриваются. Таким образом, записи должны идти от частного к общему.
Запись может иметь несколько форматов и содержать различные поля:
local database user auth-method [auth-options] host database user address auth-method [auth-options] hostssl database user address auth-method [auth-options] hostnossl database user address auth-method [auth-options] hostgssenc database user address auth-method [auth-options] hostnogssenc database user address auth-method [auth-options] host database user IP-address IP-mask auth-method [auth-options] hostssl database user IP-address IP-mask auth-method [auth-options] hostnossl database user IP-address IP-mask auth-method [auth-options] hostgssenc database user IP-address IP-mask auth-method [auth-options] hostnogssenc database user IP-address IP-mask auth-method [auth-options] include file include_if_exists file include_dir directory
Для полей database и user можно указать отдельный файл, поставив перед именем файла @. Этот файл может содержать имена баз данных или пользователей соответственно. Файлы, включенные в правила аутентификации с помощью конструкции @, считываются как списки имен, которые могут быть разделены пробелами или запятыми. Вложенные конструкции с символом @ разрешены. Используйте # для добавления комментария. Если имя файла после @ не является абсолютным путем, оно считается относительным каталогу, содержащему ссылающийся файл. При использовании @ непосредственно в поле PG_HBA путь задается относительно директории, указанной в конфигурационном параметре data_directory. Значение по умолчанию — pg_data1/adpg16/.
Поля записи подробно описаны ниже.
Поля записи аутентификации
В этом разделе описываются поля записи аутентификации. Количество полей варьируется в зависимости от типа записи.
Connection type
За исключением записей, содержащих include, первое поле определяет тип соединения. Возможные значения перечислены в таблице ниже.
| Наименование | Описание |
|---|---|
local |
Соответствует соединениям, использующим сокеты домена Unix. Без записи этого типа подключения через Unix-сокеты не допускаются |
host |
Управляет подключениями по TCP/IP. Записи |
hostssl |
Соответствует подключениям через TCP/IP, если подключение использует шифрование SSL. Поддержка SSL включается в ADPG во время сборки. Чтобы использовать |
hostnossl |
Соответствует подключениям по протоколу TCP/IP, которые не используют SSL |
hostgssenc |
Соответствует подключениям, выполненным по протоколу TCP/IP, если подключение устанавливается с шифрованием GSSAPI |
hostnogssenc |
Соответствует подключениям по протоколу TCP/IP, не использующим шифрование GSSAPI |
database
Поле database указывает каким базам данных соответствует запись. Это поле принимает следующие значения:
-
Имя определенной базы данных или регулярное выражение, определяющее имена баз данных. Можно указать несколько регулярных выражений и/или имен баз данных, разделив их запятыми (
,). Если имя начинается с символа слэш (/), значение рассматривается как регулярное выражение. См. Regular expression details. Например, значение/^db\d{2,4}$разрешает подключения к любым базам данных с именем, начинающимся сdbи заканчивающимся числом, содержащим от 2 до 4 цифр. Такими значениями могут бытьdb1234илиdb98. -
all— все базы данных. -
sameuser— запись соответствует правилу, если запрошенная база данных имеет то же имя, что и указанный пользователь. Например, если пользовательpostgres, он может подключиться только к базе данныхpostgres. -
samerole— указывает, что пользователь должен быть членом роли с тем же именем, что и база данных.samegroup— устаревшее название для опцииsamerole, которое также можно использовать. Если имя базы данных —customers, то к ней могут подключиться только пользователи, являющиеся членами ролиcustomers. Суперпользователи считаются соответствующимиsameroleтолько в том случае, если они явно принадлежат к указанной роли. -
replication— указывает, что запись соответствует правилу, если запрошено соединение для физической репликации. Однако значениеreplicationне соответствует соединению для логической репликации. -
Отдельный файл, содержащий имена баз данных и/или регулярные выражения. Его можно указать, поставив перед именем файла
@.
Например, приведенная ниже конфигурация позволяет пользователю user1 подключаться к базам данных book и author:
# type database user address auth-method
host book,author user1 0.0.0.0/0 md5
user
Поле указывает, каким именам пользователей базы данных (ролям) соответствует запись. Это поле допускает следующие значения:
-
Имя определенной роли (имя пользователя) или регулярное выражение, начинающееся с символа слэш (
/), которое определяет имя роли. Вы можете добавить несколько ролей и/или регулярных выражений, разделенных запятыми. Например, регулярное выражение/^.*support$разрешает подключения для пользователей, чьи имена заканчиваются наsupport. -
Имя группы, которому предшествует
+. В ADPG/PostgreSQL нет различия между пользователями и группами.+означает, что роли соответствуют правилу, если они являются прямыми или косвенными членами указанной роли. Имя без+соответствует только указанной роли. Суперпользователь рассматривается как член роли, только если он явно является её членом. -
all— все роли (пользователи). -
Отдельный файл, содержащий имена пользователей и/или регулярные выражения. Его можно указать, поставив перед именем файла
@.
Приведенная ниже конфигурация позволяет всем членам роли support подключаться к базе данных access_stat:
# type database user address auth-method
host access_stat +support 0.0.0.0/0 md5
address
В этом поле указываются адреса хостов клиента, которым должна соответствовать запись. Оно может содержать имя хоста, диапазон IP-адресов или одно из специальных ключевых слов. Разрешены следующие значения:
-
Диапазон IP-адресов, указанный с помощью нотации CIDR.
-
all— любой IP-адрес. -
samehost— любой из IP-адресов сервера. -
samenet— любой адрес в подсети, к которой сервер подключен напрямую. -
Имя хоста. Любое значение, которое не является диапазоном IP-адресов или специальным ключевым словом, рассматривается как имя хоста. Имя хоста, используемое в этом поле, должно быть тем, что возвращается при преобразовании IP-адреса клиента в имя, иначе строка не будет соответствовать хосту. Некоторые базы данных имен хостов позволяют связывать IP-адрес с несколькими именами хостов, но операционная система возвращает только одно имя хоста при попытке разрешить IP-адрес. Спецификация имени хоста, которая начинается с точки (
.), соответствует суффиксу фактического имени хоста. Таким образом,.example.comбудет соответствовать не толькоexample.com, но иhome.example.com.
Приведенные ниже примеры позволяют любому пользователю локальной системы подключаться к любой базе данных с любым именем пользователя базы данных.
Для локальных замкнутых подключений по TCP/IP:
# type database user address auth-method
host all all 127.0.0.1/32 trust
Для IPv6:
# type database user address auth-method
host all all ::1/128 trust
С именем хоста (обычно охватывает как IPv4, так и IPv6):
# type database user address auth-method
host all all localhost trust
Разрешает подключение любому пользователю с любого хоста с IP-адресом 192.168.54.x:
# type database user address auth-method
host all all 192.168.54.0/24 trust
IP-address и IP-mask
Эти два поля можно использовать в качестве альтернативы записи IP-адрес/длина маски CIDR. Вместо указания длины маски фактическая маска задается в отдельном столбце. Например, 255.0.0.0 представляет длину маски IPv4 CIDR 8, а 255.255.255.255 определяет длину маски IPv4 CIDR 32.
Эти поля не могут быть указаны для записи с типом подключения local.
Конфигурация ниже позволяет любому пользователю локальной системы подключаться к любой базе данных с любым именем пользователя базы данных:
# type database user IP-address IP-mask auth-method
host all all 127.0.0.1 255.255.255.255 trust
auth-method
Поле auth-method определяет метод аутентификации, который следует использовать, когда соединение соответствует записи. Все значения указываются в нижнем регистре и обрабатываются с учетом регистра, поэтому даже аббревиатуры, такие как ldap, должны быть указаны в нижнем регистре. Для получения дополнительной информации о методах аутентификации обратитесь к статье Authentication methods.
В таблице ниже перечислены поддерживаемые значения для метода аутентификации.
| Значение | Описание |
|---|---|
trust |
Разрешает подключение безусловно. Этот метод позволяет любому, кто может подключиться к серверу базы данных ADPG/PostgreSQL, войти в систему как любой пользователь PostgreSQL без какой-либо аутентификации. См. Trust authentication |
reject |
Отклоняет подключение безусловно. Это полезно для фильтрации определенных хостов из группы. Например, можно заблокировать подключение определенного хоста, в то время как более поздняя запись позволяет подключаться оставшимся хостам из определенной сети |
scram-sha-256 |
Выполняет аутентификацию |
md5 |
Выполняет аутентификацию |
password |
Требует от клиента предоставления незашифрованного пароля для аутентификации. Поскольку пароль отправляется в открытом виде по сети, его не следует использовать в ненадежных сетях. См. Аутентификация по паролю |
gss |
Использует GSSAPI для аутентификации пользователя. Доступно только для соединений TCP/IP. Может использоваться в сочетании с шифрованием GSSAPI. См. GSSAPI authentication |
sspi |
Использует SSPI для аутентификации пользователя. Доступно только для клиентов Windows. См. SSPI Authentication |
ident |
Получает имя пользователя операционной системы клиента, связываясь с сервером ident на клиенте. Система проверяет, соответствует ли оно запрошенному имени пользователя базы данных. Аутентификация |
peer |
Получает имя пользователя операционной системы клиента и проверяет, совпадает ли оно с запрошенным именем пользователя базы данных. Доступно только для локальных подключений. См. Peer authentication |
ldap |
Аутентификация производится с использованием сервера LDAP. См. Аутентификация Kerberos |
radius |
Аутентификация производится с использованием сервера RADIUS. См. RADIUS Authentication |
cert |
Аутентификация производится с использованием клиентских сертификатов SSL. См. Включение SSL-шифрования |
pam |
Аутентификация производится с использованием службы подключаемых модулей аутентификации (PAM), предоставляемой операционной системой. См. PAM Authentication |
bsd |
Аутентификация производится с использованием службы аутентификации BSD, предоставляемой операционной системой. См. BSD Authentication |
Метод trust не выполняет аутентификацию. Имеет смысл использовать trust только для локальных подключений. Метод reject безусловно запрещает доступ. Вы можете использовать его для запрета любых подключений определенного типа или с определенных адресов. Например, можно запретить незашифрованные подключения.
Методы аутентификации scram-sha-256, md5, ldap, radius и pam запрашивают у пользователя пароль и проверяют его на соответствие паролю, хранящемуся в СУБД или во внешней службе.
Методы peer, cert, gss и sspi обеспечивают внешнюю аутентификацию. В результате успешной аутентификации ADPG/PostgreSQL получает указанное при подключении имя — внутреннее имя СУБД и имя, идентифицированное внешней системой, — внешнее имя. Поэтому все перечисленные методы позволяют указать дополнительный параметр map в auth-options. Параметр map определяет правила сопоставления внутренних и внешних имен.
Следующая конфигурация позволяет всем пользователям подключаться ко всем базам данных с использованием шифрования SSL и клиентских сертификатов SSL:
# type database user address auth-method
hostssl all all 0.0.0.0/0 cert
auth-options
Поле auth-options определяет параметры для указанного значения auth-method. Параметры следует добавлять в следующем формате: <name>=<value>.
В дополнение к параметрам, зависящим от метода аутентификации, существует независимый от метода параметр аутентификации clientcert, который можно указать в любой записи hostssl. Он может принимать следующие значения:
-
verify-ca— требует, чтобы клиент предоставил действительный (доверенный) SSL-сертификат; -
verify-full— требует, чтобы клиент предоставил действительный (доверенный) SSL-сертификат и значениеCN(Common Name) в сертификате соответствовало имени пользователя или применяемому сопоставлению имен.
Этот параметр работает аналогично методу аутентификации cert, но позволяет связать проверку клиентских сертификатов с любым методом аутентификации, поддерживающим записи hostssl.
В любой записи, которая включает аутентификацию клиентского сертификата (запись с методом аутентификации cert или параметром clientcert), необязательный параметр clientname указывает, какой элемент учетных данных в клиентском сертификате должен быть сопоставлен во время проверки. Этот параметр может иметь одно из двух значений:
-
CN— имя пользователя сопоставляется с полемCommon Name(CN). Это значение по умолчанию. -
DN— имя пользователя сопоставляется с полемDistinguished Name(DN).
Параметр map указывается для методов, использующих сопоставление имен. Он определяет правила сопоставления внутренних и внешних имен. Чтобы задать параметр map, необходимо сначала добавить правила в файл pg_ident.conf. Параметр конфигурации ident_file определяет местоположение этого файла. Путь по умолчанию — pg_data1/adpg16/pg_ident.conf. Например:
# pg_ident.conf
# MAPNAME SYSTEM-USERNAME PG-USERNAME
map_admin admin admin_db
Затем нужно присвоить имя правила сопоставления параметру map. Приведенная ниже конфигурация позволяет пользователю операционной системы admin подключаться в качестве пользователя базы данных admin_db с метод аутентификации ident только с хоста 192.168.12.10:
# type database user address auth-method auth-options
host all admin_db 192.168.12.10/32 ident map=map_admin
Включение внешних файлов
Записи, перечисленные в таблице ниже, позволяют включать содержимое внешних файлов в поле PG_HBA.
| Имя | Описание |
|---|---|
include |
Запись будет заменена содержимым указанного файла |
include_if_exists |
Запись будет заменена содержимым указанного файла, если файл существует. В противном случае в лог записывается сообщение о том, что файл был пропущен |
include_dir |
Запись будет заменена содержимым всех обработанных в алфавитном порядке файлов, найденных в указанной директории, если они не начинаются с |
Пример:
include file1
Просмотр записей pg_hba.conf
Можно использовать представление pg_hba_file_rules, чтобы вывести сводную информацию о содержимом pg_hba.conf. Это представление отображает строку для каждой непустой, не являющейся комментарием строки в pg_hba.conf с информацией о том, можно ли успешно применить правило аутентификации.
Обратите внимание, что это представление отображает текущее содержимое файла, а не содержимое, которое было загружено сервером в последний раз. Строка, отражающая некорректную запись, будет иметь значения только для полей line_number и error. В ADPG содержимое pg_hba.conf проверяется во время действия Reconfigure & Restart. Если проверка не удалась, действие завершится с ошибкой и будет использовано старое содержимое pg_hba.conf.
SELECT * FROM pg_hba_file_rules;
Возможный результат:
rule_number | file_name | line_number | type | database | user_name | address | netmask | auth_method | options | error
-------------+------------------------------+-------------+-------+---------------+-------------------+--------------+-----------------+---------------+------------+-------
1 | /pg_data1/adpg16/pg_hba.conf | 3 | local | {all} | {all} | | | peer | |
2 | /pg_data1/adpg16/pg_hba.conf | 4 | local | {replication} | {adpg_replicator} | | | scram-sha-256 | |
3 | /pg_data1/adpg16/pg_hba.conf | 5 | host | {replication} | {adpg_replicator} | 10.92.40.105 | 255.255.255.255 | scram-sha-256 | |
4 | /pg_data1/adpg16/pg_hba.conf | 6 | host | {all} | {adpg_replicator} | 10.92.40.105 | 255.255.255.255 | scram-sha-256 | |
5 | /pg_data1/adpg16/pg_hba.conf | 7 | host | {replication} | {adpg_rewind} | 10.92.40.105 | 255.255.255.255 | scram-sha-256 | |
6 | /pg_data1/adpg16/pg_hba.conf | 8 | host | {all} | {adpg_rewind} | 10.92.40.105 | 255.255.255.255 | scram-sha-256 | |
7 | /pg_data1/adpg16/pg_hba.conf | 9 | host | {replication} | {adpg_replicator} | 10.92.40.214 | 255.255.255.255 | scram-sha-256 | |
8 | /pg_data1/adpg16/pg_hba.conf | 10 | host | {all} | {adpg_replicator} | 10.92.40.214 | 255.255.255.255 | scram-sha-256 | |
9 | /pg_data1/adpg16/pg_hba.conf | 11 | host | {replication} | {adpg_rewind} | 10.92.40.214 | 255.255.255.255 | scram-sha-256 | |
10 | /pg_data1/adpg16/pg_hba.conf | 12 | host | {all} | {adpg_rewind} | 10.92.40.214 | 255.255.255.255 | scram-sha-256 | |
11 | /pg_data1/adpg16/pg_hba.conf | 13 | host | {all} | {postgres} | 0.0.0.0 | 0.0.0.0 | ident | {map=test} |
12 | /pg_data1/adpg16/file1 | 1 | host | {all} | {all} | 0.0.0.0 | 0.0.0.0 | trust | |
Поле PG_HBA
Чтобы изменить поле PG_HBA, в пользовательском интерфейсе ADCM откройте страницу Clusters, выберите кластер ADPG и перейдите на вкладку Services. Выберите сервис ADPG. Кликните поле PG_HBA в дереве Configuration на вкладке Primary configuration.
Введите запись в открывшемся окне и нажмите Apply.
Для сохранения изменений нажмите Save.
Выполните действие Reconfigure & Restart, чтобы применить изменения.