Аутентификация клиента

  • Михаил
  • 12 мин. на прочтение
  • 133
  • 11 Nov 2022
  • 11 Nov 2022

Аутентификация клиента контролируется файлом конфигурации, который традиционно имеет имя 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