Аутентификация клиента
Аутентификация клиента контролируется файлом конфигурации, который традиционно имеет имя pg_hba.conf
и хранится в каталоге данных кластера базы данных. ( HBA означает аутентификацию на основе хоста.) pg_hba.conf
Файл по умолчанию устанавливается, когда каталог данных инициализируется с помощью initdb . Однако файл конфигурации аутентификации можно поместить в другое место; см . параметр конфигурации hba_file .
Общий формат pg_hba.conf
файла представляет собой набор записей, по одной в строке. Пустые строки игнорируются, как и любой текст после #
символа комментария. Запись можно продолжить на следующей строке, завершив строку обратной косой чертой. (Обратные слэши используются только в конце строки.) Запись состоит из ряда полей, разделенных пробелами и/или символами табуляции. Поля могут содержать пробелы, если значение поля заключено в двойные кавычки. Заключение одного из ключевых слов в поле базы данных, пользователя или адреса (например, all
или replication
) приводит к тому, что слово теряет свое особое значение и просто соответствует базе данных, пользователю или хосту с этим именем. Продолжение строки обратной косой черты применяется даже в цитируемом тексте или комментариях.
Каждая запись указывает тип соединения, диапазон клиентских 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]
Смысл полей следующий:
local
Эта запись соответствует попыткам подключения с использованием сокетов домена Unix. Без записи этого типа соединения сокетов домена Unix запрещены.
host
Эта запись соответствует попыткам подключения, выполненным с использованием TCP/IP. host
записи соответствуют попыткам подключения SSL или не SSL , а также попыткам подключения с шифрованием GSSAPI или без шифрования GSSAPI .
hostssl
Эта запись соответствует попыткам подключения, выполненным с использованием TCP/IP, но только в том случае, если подключение выполняется с шифрованием SSL .
Чтобы использовать эту опцию, сервер должен быть построен с поддержкой SSL . Кроме того, необходимо включить SSL , установив параметр конфигурации ssl (дополнительную информацию см. в Разделе 19.9 ). В противном случае hostssl
запись игнорируется, за исключением регистрации предупреждения о том, что она не может соответствовать никаким соединениям.
hostnossl
Этот тип записи ведет себя противоположно hostssl
; он соответствует только попыткам подключения через TCP/IP, которые не используют SSL .
hostgssenc
Эта запись соответствует попыткам подключения, выполненным с использованием TCP/IP, но только в том случае, если подключение выполняется с шифрованием GSSAPI .
Чтобы использовать эту опцию, сервер должен быть построен с поддержкой GSSAPI . В противном случае hostgssenc
запись игнорируется, за исключением регистрации предупреждения о том, что она не может соответствовать никаким соединениям.
hostnogssenc
Этот тип записи ведет себя противоположно hostgssenc
; он соответствует только попыткам подключения через TCP/IP, которые не используют шифрование GSSAPI .
database
Указывает, каким именам баз данных соответствует эта запись. Значение all
указывает, что оно соответствует всем базам данных. Значение sameuser
указывает, что запись соответствует, если запрошенная база данных имеет то же имя, что и запрошенный пользователь. Значение samerole
указывает, что запрошенный пользователь должен быть членом роли с тем же именем, что и запрошенная база данных. ( samegroup
является устаревшим, но все еще принятым вариантом написания samerole
.) Суперпользователи не считаются членами роли для целей, samerole
если только они не являются явными членами роли, прямо или косвенно, а не только в силу того, что они являются суперпользователями. Значениеreplication
указывает, что запись совпадает, если запрашивается физическое соединение репликации, однако она не совпадает с логическими соединениями репликации. Обратите внимание, что физические соединения репликации не указывают какую-либо конкретную базу данных, в то время как логические соединения репликации указывают ее. В противном случае это имя конкретной базы данных PostgreSQL . Можно указать несколько имен баз данных, разделив их запятыми. Отдельный файл, содержащий имена баз данных, можно указать, указав перед именем файла @
.
user
Указывает, каким именам пользователей базы данных соответствует эта запись. Значение all
указывает, что оно соответствует всем пользователям. В противном случае это либо имя конкретного пользователя базы данных, либо имя группы, которому предшествует +
. (Напомним, что в PostgreSQL нет реального различия между пользователями и группами ; +
пометка на самом деле означает « соответствовать любой из ролей, которые прямо или косвенно являются членами этой роли » , тогда как имя без+
mark соответствует только этой конкретной роли.) Для этой цели суперпользователь считается членом роли только в том случае, если он явно является членом роли, прямо или косвенно, а не только в силу того, что он является суперпользователем. Можно указать несколько имен пользователей, разделив их запятыми. Можно указать отдельный файл, содержащий имена пользователей, поставив перед именем файла @
.
address
Указывает адрес(а) клиентского компьютера, которым соответствует эта запись. Это поле может содержать имя хоста, диапазон IP-адресов или одно из специальных ключевых слов, упомянутых ниже.
Диапазон IP-адресов указывается с использованием стандартной числовой записи для начального адреса диапазона, затем косой черты ( /
) и длины маски CIDR . Длина маски указывает количество старших битов IP-адреса клиента, которые должны совпадать. Биты справа от этого должны быть нулевыми в данном IP-адресе. /
Между IP-адресом, символом и длиной маски CIDR не должно быть пробелов .
Типичные примеры диапазона адресов IPv4, указанного таким образом, относятся 172.20.143.89/32
к одному узлу, 172.20.143.0/24
к небольшой сети или 10.6.0.0/16
к более крупной сети. Диапазон адресов IPv6 может выглядеть как ::1/128
для одного хоста (в данном случае адрес обратной связи IPv6) или fe80::7a31:c1ff:0000:0000/96
для небольшой сети. 0.0.0.0/0
представляет все адреса IPv4 и ::0/0
представляет все адреса IPv6. Чтобы указать один хост, используйте длину маски 32 для IPv4 или 128 для IPv6. В сетевом адресе не опускайте нули в конце.
Запись в формате IPv4 будет соответствовать только подключениям IPv4, а запись в формате IPv6 будет соответствовать только подключениям IPv6, даже если представленный адрес находится в диапазоне IPv4-in-IPv6. Обратите внимание, что записи в формате IPv6 будут отклонены, если системная библиотека C не поддерживает адреса IPv6.
Вы также можете написать all
для соответствия любому IP-адресу, samehost
для соответствия любому из собственных IP-адресов сервера или samenet
для соответствия любому адресу в любой подсети, к которой сервер напрямую подключен.
Если указано имя хоста (все, что не является диапазоном IP-адресов или специальным ключевым словом, рассматривается как имя хоста), это имя сравнивается с результатом обратного разрешения имени IP-адреса клиента (например, обратного DNS). поиск, если используется DNS). При сравнении имен хостов регистр не учитывается. Если есть совпадение, то для имени хоста выполняется прямое разрешение имени (например, прямой поиск DNS), чтобы проверить, равен ли какой-либо из адресов, которые оно разрешает, IP-адресу клиента. Если оба направления совпадают, то запись считается соответствующей. (Имя хоста, которое используется вpg_hba.conf
должен быть тот, который возвращает преобразование адреса в имя IP-адреса клиента, иначе строка не будет сопоставлена. Некоторые базы данных имен хостов позволяют связать IP-адрес с несколькими именами хостов, но операционная система будет возвращать только одно имя хоста, когда ее попросят разрешить IP-адрес.)
Спецификация имени хоста, начинающаяся с точки ( .
), соответствует суффиксу фактического имени хоста. Так .example.com
бы совпало foo.example.com
(но не только example.com
).
Когда имена хостов указаны в pg_hba.conf
, вы должны убедиться, что разрешение имен выполняется достаточно быстро. Может оказаться полезным настроить локальный кеш разрешения имен, например nscd
. Кроме того, вы можете включить параметр конфигурации, log_hostname
чтобы видеть имя хоста клиента вместо IP-адреса в журнале.
Эти поля не применяются к local
записям.
IP-address
IP-mask
Эти два поля можно использовать как альтернативу нотации. Вместо указания длины маски фактическая маска указывается в отдельном столбце. Например, представляет длину маски CIDR IPv4, равную 8, и представляет длину маски CIDR, равную 32.IP-address/mask-length255.0.0.0255.255.255.255
Эти поля не применяются к local
записям.
auth-method
Указывает метод проверки подлинности, который следует использовать, когда соединение соответствует этой записи. Возможные варианты суммированы здесь; подробности в Разделе 21.3 . Все параметры вводятся в нижнем регистре и обрабатываются с учетом регистра, поэтому даже аббревиатуры, такие как ldap
, должны быть указаны в нижнем регистре.
trust
Разрешить подключение безоговорочно. Этот метод позволяет любому, кто может подключиться к серверу базы данных PostgreSQL , войти в систему как любой пользователь PostgreSQL , который пожелает, без необходимости ввода пароля или какой-либо другой аутентификации. Подробности см. в Разделе 21.4 .
reject
Безоговорочно отклонить соединение. Это полезно для « отфильтровывания » определенных хостов из группы, например, reject
линия может блокировать подключение определенного хоста, в то время как более поздняя строка разрешает подключение оставшимся хостам в определенной сети.
scram-sha-256
Выполните аутентификацию SCRAM-SHA-256, чтобы проверить пароль пользователя. Подробности см. в Разделе 21.5 .
md5
Выполните аутентификацию SCRAM-SHA-256 или MD5, чтобы проверить пароль пользователя. Подробности см. в Разделе 21.5 .
password
Требовать от клиента предоставления незашифрованного пароля для аутентификации. Поскольку пароль передается по сети в виде открытого текста, его не следует использовать в ненадежных сетях. Подробности см. в Разделе 21.5 .
gss
Используйте GSSAPI для аутентификации пользователя. Это доступно только для соединений TCP/IP. Подробности см. в Разделе 21.6 . Его можно использовать в сочетании с шифрованием GSSAPI.
sspi
Используйте SSPI для аутентификации пользователя. Это доступно только в Windows. Подробности см. в Разделе 21.7 .
ident
Получите имя пользователя операционной системы клиента, связавшись с сервером ident на клиенте и проверив, соответствует ли оно запрошенному имени пользователя базы данных. Идентификационная аутентификация может использоваться только для соединений TCP/IP. Если указано для локальных подключений, вместо этого будет использоваться одноранговая аутентификация. Подробности см. в Разделе 21.8 .
peer
Получите имя пользователя операционной системы клиента из операционной системы и проверьте, совпадает ли оно с запрошенным именем пользователя базы данных. Это доступно только для локальных подключений. Подробности см. в Разделе 21.9 .
ldap
Аутентификация с использованием сервера LDAP . Подробнее см. Раздел 21.10 .
radius
Аутентификация с использованием сервера RADIUS. Подробности см. в Разделе 21.11 .
cert
Аутентификация с использованием клиентских сертификатов SSL. Подробности см. в Разделе 21.12 .
pam
Выполните аутентификацию с помощью службы подключаемых модулей аутентификации (PAM), предоставляемой операционной системой. Подробнее см. Раздел 21.13 .
bsd
Выполните аутентификацию с помощью службы аутентификации BSD, предоставляемой операционной системой. Подробнее см. Раздел 21.14 .
auth-options
После auth-method
поля могут быть поля формы , которые определяют параметры метода аутентификации. Подробная информация о том, какие параметры доступны для тех или иных методов аутентификации, представлена ??ниже.name=value
В дополнение к перечисленным ниже параметрам, зависящим от метода, существует параметр аутентификации, не зависящий от метода clientcert
, который можно указать в любой hostssl
записи. Этот параметр может быть установлен на verify-ca
или verify-full
. Оба варианта требуют от клиента предоставления действительного (доверенного) SSL-сертификата, а verify-full
также требуют, чтобы cn
(общее имя) в сертификате соответствовало имени пользователя или применимому сопоставлению. Это поведение аналогично cert
методу аутентификации (см. Раздел 21.12 ), но позволяет сочетать проверку клиентских сертификатов с любым методом аутентификации, который поддерживает hostssl
записи.
В любой записи, использующей аутентификацию сертификата клиента (т. е. в той, которая использует cert
метод аутентификации, или в той, которая использует clientcert
параметр), вы можете указать, какая часть учетных данных сертификата клиента должна соответствовать с помощью clientname
параметра. Эта опция может иметь одно из двух значений. Если вы укажете clientname=CN
, что является значением по умолчанию, имя пользователя сопоставляется с сертификатом Common Name (CN)
. Если вместо этого вы укажете clientname=DN
, что имя пользователя сопоставляется со всем Distinguished Name (DN)
сертификатом. Эту опцию, вероятно, лучше всего использовать в сочетании с картой имени пользователя. Сравнение выполнено с DN
форматом RFC 2253 . Чтобы увидеть DN
сертификат клиента в этом формате, выполните
openssl x509 -in myclient.crt -noout --subject -nameopt RFC2253 | sed "s/^subject=//"
Следует соблюдать осторожность при использовании этого параметра, особенно при сопоставлении регулярных выражений с файлом DN
.
Файлы, включенные в @
конструкции, читаются как списки имен, которые могут быть разделены пробелами или запятыми. Комментарии вводятся с помощью #
, как и в , разрешены pg_hba.conf
вложенные конструкции. @
Если последующее имя файла @
не является абсолютным путем, оно считается относительным к каталогу, содержащему ссылающийся файл.
Поскольку pg_hba.conf
записи проверяются последовательно для каждой попытки подключения, порядок записей имеет значение. Как правило, более ранние записи будут иметь параметры жесткого соответствия соединения и более слабые методы проверки подлинности, в то время как более поздние записи будут иметь более слабые параметры соответствия и более надежные методы проверки подлинности. Например, можно использовать trust
аутентификацию для локальных соединений TCP/IP, но требовать пароль для удаленных соединений TCP/IP. В этом случае запись, указывающая trust
аутентификацию для соединений с 127.0.0.1, появится перед записью, указывающей аутентификацию по паролю для более широкого диапазона разрешенных клиентских IP-адресов.
Файл pg_hba.conf
читается при запуске и когда основной серверный процесс получает сигнал SIGHUP .сигнал. Если вы редактируете файл в активной системе, вам нужно будет сигнализировать администратору почты (используя pg_ctl reload
, вызывая функцию SQL pg_reload_conf()
или используя kill -HUP
), чтобы он перечитал файл.
Системный вид pg_hba_file_rules
может быть полезен для предварительного тестирования изменений в pg_hba.conf
файле или для диагностики проблем, если загрузка файла не привела к желаемому результату. Строки в представлении с ненулевыми error
полями указывают на проблемы в соответствующих строках файла.
Некоторые примеры pg_hba.conf
записей показаны в примере. Подробнее о различных методах аутентификации см. в следующем разделе.
Примеры pg_hba.conf
записей
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 trust
host all all 127.0.0.1 255.255.255.255 trust
host all all ::1/128 trust
host all all localhost trust
host postgres all 192.168.93.0/24 ident
host postgres all 192.168.12.10/32 scram-sha-256
host all mike .example.com md5
host all all .example.com scram-sha-256
host all all 192.168.54.1/32 reject
hostgssenc all all 0.0.0.0/0 gss
host all all 192.168.12.10/32 gss
host all all 192.168.0.0/16 trust
local sameuser all md5
local all @admins md5
local all +support md5
local all @admins,+support md5
local db1,db2,@demodbs all md5
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.