Файл pg_hba.conf
Эта страница переведена при помощи нейросети GigaChat.
Аутентификация клиентского приложения контролируется файлом конфигурации, который традиционно называется pg_hba.conf
и хранится в каталоге данных кластера баз данных. (HBA означает аутентификацию на основе хоста.) Файл pg_hba.conf
по умолчанию устанавливается при инициализации каталога данных с помощью initdb. Однако возможно разместить файл настройки аутентификации в другом месте; см. параметр конфигурации hba_file.
Файл pg_hba.conf
прочитывается при запуске системы, а также в тот момент, когда основной сервер получает сигнал SIGHUP. Если файл редактируется во время работы системы, необходимо послать сигнал процессу postmaster (используя pg_ctl reload
, вызвав SQL-функцию pg_reload_conf()
или выполнив kill -HUP
), чтобы он прочел обновленный файл.
Примечание
Предыдущее утверждение не касается Microsoft Windows: там любые изменения в pg_hba.conf сразу применяются к последующим подключениям. Системное представление pg_hba_file_rules может быть полезно для предварительной проверки изменений в файле pg_hba.conf или для диагностики проблем, когда перезагрузка этого файла не дает желаемого эффекта. Строки в этом представлении, содержащие в поле error не NULL, указывают на проблемы в соответствующих строках файла.
Общий формат файла pg_hba.conf
представляет собой набор записей, по одной на строку. Пустые строки игнорируются, как и любой текст после символа комментария #
. Запись может быть продолжена на следующую строку путем завершения строки обратной косой чертой. (Обратные слеши не являются специальными, за исключением конца строки.) Запись состоит из нескольких полей, которые разделены пробелами и/или табуляциями. Поля могут содержать пробелы, если значение поля заключено в двойные кавычки. Заключение одного из ключевых слов в базе данных, поле пользователя или адреса (например, all
или replication
) лишает слово его специального значения и просто соответствует базе данных, пользователю или хосту с таким именем. Продолжение строки с помощью обратного слеша применяется даже внутри текста в кавычках или комментариев.
Каждая запись аутентификации указывает тип подключения, диапазон IP-адресов клиента (если это применимо для типа подключения), имя базы данных, имя пользователя и метод аутентификации, который будет использоваться для подключений, соответствующих этим параметрам. Первая запись с соответствующим типом соединения, адресом клиента, запрошенной базой данных и именем пользователя используется для выполнения аутентификации. Процедуры «fall-through» или «backup» не предусмотрены: если одна запись выбрана и аутентификация не удалась, последующие записи не рассматриваются. Если ни одна запись не соответствует, доступ запрещен.
Каждая запись может быть директивой включения или записью аутентификации. Директивы включения указывают, что нужно обработать дополнительные файлы с записями. Записи будут вставлены вместо директив включения. Директивы включения содержат только два поля: директиву include
, include_if_exists
или include_dir
и включаемый файл или каталог. Путь к файлу или каталогу может задаваться и как абсолютный, и как относительный и заключаться в двойные кавычки. Для формы include_dir
будут включены все файлы, не начинающиеся с .
и заканчивающиеся на .conf
. Набор файлов во включаемом каталоге обрабатывается по порядку имен (определяемому правилами, принятыми в C, т. е. цифры идут перед буквами, а буквы в верхнем регистре — перед буквами в нижнем).
Запись может иметь несколько форматов:
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
Значение полей следующее:
local
Эта запись соответствует попыткам подключения с использованием сокетов домена Unix. Без записи этого типа подключение через сокеты домена Unix запрещено.
host
Эта запись соответствует попыткам подключения, выполненным с использованием TCP/IP. host
записи соответствуют SSL или не-SSL попыткам подключения, а также зашифрованным GSSAPI или незашифрованным GSSAPI попыткам подключения.
Удаленные подключения TCP/IP будут невозможны, если сервер не будет запущен с соответствующим значением для параметра конфигурации listen_addresses, поскольку поведение по умолчанию заключается в прослушивании подключений TCP/IP только на локальном адресе обратной связи localhost
.
hostssl
Эта запись соответствует попыткам подключения, выполненным с использованием TCP/IP, но только тогда, когда подключение осуществляется с помощью шифрования SSL.
Чтобы воспользоваться этой опцией, сервер должен быть собран с поддержкой SSL. Кроме того, SSL должен быть включен путем установки параметра конфигурации ssl (см. раздел Безопасные соединения TCP/IP с SSL для получения дополнительной информации). В противном случае запись 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 нет реального различия между пользователями и группами; метка +
фактически означает «соответствует любой из ролей, которые являются прямыми или косвенными членами этой роли», тогда как имя без отметки +
соответствует только конкретной роли.) Для этого суперюзер считается членом роли только в том случае, если он явно является членом роли, прямо или косвенно, а не просто по причине того, что он является суперюзером. Несколько имен пользователей могут быть предоставлены путем их разделения запятыми. Отдельный файл, содержащий имена пользователей, может быть указан путем предварительного указания имени файла с помощью @
.
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-в-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-адреса клиента. Это усложняет использование функции в случае, если обратная запись DNS-клиента не настроена или дает какое-то нежелательное имя хоста. Это делается главным образом для повышения эффективности: таким образом, попытка подключения требует максимум двух поисков в резолвере, одного обратного и одного прямого. Если возникает проблема с разрешением какого-либо адреса, она становится проблемой только этого клиента. Гипотетическая альтернативная реализация, которая выполняла бы только прямые запросы, должна была бы разрешать каждое имя хоста, упомянутое в pg_hba.conf
, при каждой попытке подключения. Это может быть довольно медленно, если перечислено много имен. И если есть проблема с разрешением одного из имен хостов, это становится проблемой для всех.
Кроме того, обратный поиск необходим для реализации функции сопоставления суффиксов, поскольку необходимо знать фактическое имя хоста клиента, чтобы можно было сопоставить его с шаблоном.
Обратите внимание, что такое поведение согласуется с другими популярными реализациями контроля доступа на основе имени хоста, такими как веб-сервер Apache HTTP и TCP-обертки.
IP-address
IP-mask
Эти два поля могут использоваться вместо обозначения IP-address
/
mask-length
. Вместо указания длины маски указывается фактическая маска в отдельном столбце. Например, 255.0.0.0
представляет длину маски IPv4 CIDR равной 8, а 255.255.255.255
представляет длину маски CIDR равную 32.
Эти поля не применимы к записям local
.
auth-method
Задает метод аутентификации, который следует использовать при совпадении этого соединения с записью. Возможные варианты выбора здесь кратко изложены; подробности приведены в Разделе Методы аутентификации. Все параметры указаны строчными буквами и чувствительны к регистру, поэтому даже аббревиатуры, такие как ldap
, должны быть указаны строчными буквами.
trust
: Разрешите соединение безоговорочно. Этот метод позволяет любому, кто может подключиться к серверу баз данных PostgreSQL, войти в систему как любой пользователь PostgreSQL, не требуя пароля или какой-либо другой аутентификации. См. раздел Аутентификация доверия для получения подробной информации.
reject
: Отказать в соединении безоговорочно. Это полезно для «отфильтровывания» определенных хостов из группы, например, строка reject
могла бы заблокировать конкретному хосту подключение, тогда как более поздняя строка разрешила бы оставшимся хостам в определенной сети подключаться.
scram-sha-256
: Выполните аутентификацию SCRAM-SHA-256 для проверки пароля пользователя. См. раздел Аутентификация паролем для получения подробной информации.
md5
: Выполните аутентификацию SCRAM-SHA-256 или MD5 для проверки пароля пользователя. См. раздел Аутентификация паролем для получения подробной информации.
password
: Требовать от клиента предоставить незашифрованный пароль для аутентификации. Поскольку пароль отправляется открытым текстом через сеть, это не следует использовать в ненадежных сетях. См. раздел Аутентификация паролем для получения подробной информации.
gss
: Используйте GSSAPI для аутентификации пользователя. Это доступно только для соединений TCP/IP. См. раздел Аутентификация GSSAPI для получения дополнительной информации. Он может использоваться вместе со шифрованием GSSAPI.
sspi
: Используйте SSPI для аутентификации пользователя. Это доступно только в Windows. См. раздел Аутентификация SSPI для получения подробной информации.
ident
: Получите имя операционной системы клиента, связавшись с сервером ident на клиенте и проверьте, совпадает ли оно с запрошенным именем пользователя базы данных. Аутентификацию Ident можно использовать только для соединений TCP/IP. При указании для локальных подключений вместо этого будет использоваться аутентификация однорангового узла. См. раздел «Аутентификация ident» для получения дополнительной информации.
peer
: Получите имя пользователя операционной системы клиента от операционной системы и проверьте, совпадает ли оно с запрошенным именем пользователя базы данных. Это доступно только для локальных подключений. См. раздел Аутентификация одноранговых узлов для получения подробной информации.
ldap
: Аутентификация с использованием сервера LDAP. См. раздел Аутентификация LDAP для получения подробной информации.
radius
: Аутентификация с использованием сервера RADIUS. См. раздел Аутентификация RADIUS для получения подробной информации.
cert
: Аутентификация с помощью сертификатов клиента SSL. См. раздел «Аутентификация по сертификату» для получения подробной информации.
pam
: Аутентификация с помощью службы аутентификации Pluggable Authentication Modules (PAM), предоставляемой операционной системой. См. раздел Аутентификация PAM для получения подробной информации.
bsd
: Аутентификация с помощью службы аутентификации BSD, предоставляемой операционной системой. См. раздел Аутентификация BSD для получения подробной информации.
auth-options
После поля auth-method
могут быть поле(я) формы name
=
value
, которые задают параметры для метода аутентификации. Подробности о том, какие параметры доступны для каких методов аутентификации, приведены ниже.
В дополнение к метод-специфическим параметрам, перечисленным ниже, существует независимый от метода параметр аутентификации clientcert
, который может быть указан в любой записи hostssl
. Этот параметр можно установить на verify-ca
или verify-full
. Оба параметра требуют, чтобы клиент представил действительный (доверенный) сертификат SSL, тогда как verify-full
дополнительно обеспечивает соответствие cn
(Общее имя) в сертификате имени пользователя или соответствующей привязке. Это поведение аналогично методу аутентификации cert
(см. раздел Аутентификация по сертификату), но позволяет сочетать проверку клиентских сертификатов с любым методом аутентификации, поддерживающим записи 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
.
include
Эта строка будет заменена на содержимое указанного файла.
include_if_exists
Эта строка будет заменена на содержимое указанного файла, если файл существует. В противном случае в журнал вносится сообщение о том, что файл был пропущен.
include_dir
Эта строка будет заменена на содержимое всех файлов, найденных в каталоге, если они не начинаются с .
и заканчиваются на .conf
, обработанными в алфавитном порядке (определяемому правилами, принятыми в C, т. е. цифры идут перед буквами, а буквы в верхнем регистре — перед буквами в нижнем).
Файлы, включенные конструкциями @
, читаются как списки имен, которые могут быть разделены пробелами или запятыми. Комментарии вводятся с помощью #
, так же как и в pg_hba.conf
, и вложенные конструкции @
разрешены. Если имя файла после @
не является абсолютным путем, оно считается относительным к каталогу, содержащему ссылающийся файл.
Поскольку записи pg_hba.conf
проверяются последовательно для каждой попытки подключения, порядок записей имеет значение. Обычно более ранние записи будут иметь строгие параметры соответствия подключений и менее надежные методы аутентификации, тогда как более поздние записи будут иметь менее строгие параметры соответствия и более сильные методы аутентификации. Например, можно было бы пожелать использовать аутентификацию trust
для локальных соединений TCP/IP, но потребовать пароль для удаленных соединений TCP/IP. В этом случае запись, указывающая на аутентификацию trust
для подключений с 127.0.0.1, будет предшествовать записи, указывающей на аутентификацию паролем для более широкого диапазона разрешенных IP-адресов клиентов.
Представление системы pg_hba_file_rules
может быть полезно для предварительного тестирования изменений файла pg_hba.conf
, или для диагностики проблем, если загрузка файла не дала желаемого эффекта. Строки в представлении с непустыми полями error
указывают на проблемы в соответствующих строках файла.
Чтобы подключиться к конкретной базе данных, пользователь должен не только пройти проверку pg_hba.conf
, но и иметь привилегию CONNECT
для этой базы данных. Если требуется ограничить, какие пользователи могут подключаться к каким базам данных, обычно проще контролировать это путем предоставления/отмены привилегии CONNECT
, чем указывать правила в записях pg_hba.conf
.
Некоторые примеры записей pg_hba.conf
показаны в примере ниже. См. следующий раздел для получения подробной информации о различных методах аутентификации.
Примеры записей pg_hba.conf
:
# Allow any user on the local system to connect to any database with
# any database user name using Unix-domain sockets (the default for local
# connections).
#
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
# The same using local loopback TCP/IP connections.
#
# TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 trust
# The same as the previous line, but using a separate netmask column
#
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
host all all 127.0.0.1 255.255.255.255 trust
# The same over IPv6.
#
# TYPE DATABASE USER ADDRESS METHOD
host all all ::1/128 trust
# The same using a host name (would typically cover both IPv4 and IPv6).
#
# TYPE DATABASE USER ADDRESS METHOD
host all all localhost trust
# The same using a regular expression for DATABASE, that allows connection
# to any databases with a name beginning with "db" and finishing with a
# number using two to four digits (like "db1234" or "db12").
#
# TYPE DATABASE USER ADDRESS METHOD
host "/^db\d{2,4}$" all localhost trust
# Allow any user from any host with IP address 192.168.93.x to connect
# to database "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.93.0/24 ident
# Allow any user from host 192.168.12.10 to connect to database
# "postgres" if the user's password is correctly supplied.
#
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.12.10/32 scram-sha-256
# Allow any user from hosts in the example.com domain to connect to
# any database if the user's password is correctly supplied.
#
# Require SCRAM authentication for most users, but make an exception
# for user 'mike', who uses an older client that doesn't support SCRAM
# authentication.
#
# TYPE DATABASE USER ADDRESS METHOD
host all mike .example.com md5
host all all .example.com scram-sha-256
# In the absence of preceding "host" lines, these three lines will
# reject all connections from 192.168.54.1 (since that entry will be
# matched first), but allow GSSAPI-encrypted connections from anywhere else
# on the Internet. The zero mask causes no bits of the host IP address to
# be considered, so it matches any host. Unencrypted GSSAPI connections
# (which "fall through" to the third line since "hostgssenc" only matches
# encrypted GSSAPI connections) are allowed, but only from 192.168.12.10.
#
# TYPE DATABASE USER ADDRESS METHOD
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
# Allow users from 192.168.x.x hosts to connect to any database, if
# they pass the ident check. If, for example, ident says the user is
# "bryanh" and he requests to connect as PostgreSQL user "guest1", the
# connection is allowed if there is an entry in pg_ident.conf for map
# "omicron" that says "bryanh" is allowed to connect as "guest1".
#
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.0.0/16 ident map=omicron
# If these are the only four lines for local connections, they will
# allow local users to connect only to their own databases (databases
# with the same name as their database user name)except for users whose
# name end with "helpdesk", administrators and members of role "support", who can connect to all databases. The file
# $PGDATA/admins contains a list of names of administrators. Passwords
# are required in all cases.
#
# TYPE DATABASE USER ADDRESS METHOD
local sameuser all md5
local all /^.*helpdesk$ md5
local all @admins md5
local all +support md5
# The last two lines above can be combined into a single line:
local all @admins,+support md5
# The database column can also use lists and file names:
local db1,db2,@demodbs all md5