20.1. Файл pg_hba.conf
Аутентификация клиентов управляется конфигурационным файлом, который традиционно называется pg_hba.conf
и расположен в каталоге с данными кластера базы данных. (HBA расшифровывается как host-based authentication — аутентификации по имени узла.) Файл pg_hba.conf
, со стандартным содержимым, создаётся командой initdb
при инициализации каталога с данными. Однако его можно разместить в любом другом месте; см. конфигурационный параметр hba_file.
Обычный формат файла pg_hba.conf
представляет собой набор записей, по одной в строке. Пустые строки игнорируются, как и любой текст комментария после знака #
. Записи не продолжаются на следующей строке. Записи состоят из некоторого количества полей, разделённых между собой пробелом и/или tabs. В полях могут быть использованы пробелы, если они взяты в кавычки. Если в кавычки берётся какое-либо зарезервированное слово в поле базы данных, пользователя или адресации (например, all
или replication
), то слово теряет своё особое значение и просто обозначает базу данных, пользователя или сервер с данным именем.
Каждая запись обозначает тип соединения, диапазон IP-адресов клиента (если он соотносится с типом соединения), имя базы данных, имя пользователя, и способ аутентификации, который будет использован для соединения в соответствии с этими параметрами. Первая запись с соответствующим типом соединения, адресом клиента, указанной базой данных и именем пользователя применяется для аутентификации. Процедур «fall-through» или «backup» не предусмотрено: если выбрана запись и аутентификация не прошла, последующие записи не рассматриваются. Если же ни одна из записей не подошла, в доступе будет отказано.
Запись может быть сделана в одном из семи форматов:
localбаза
пользователь
метод-аутентификации
[параметры-аутентификации
] hostбаза
пользователь
адрес
метод-аутентификации
[параметры-аутентификации
] hostsslбаза
пользователь
адрес
метод-аутентификации
[параметры-аутентификации
] hostnosslбаза
пользователь
адрес
метод-аутентификации
[параметры-аутентификации
] hostбаза
пользователь
IP-адрес
IP-маска
метод-аутентификации
[параметры-аутентификации
] hostsslбаза
пользователь
IP-адрес
IP-маска
метод-аутентификации
[параметры-аутентификации
] hostnosslбаза
пользователь
IP-адрес
IP-маска
метод-аутентификации
[параметры-аутентификации
]
Значения полей описаны ниже:
local
Управляет подключениями через Unix-сокеты. Без подобной записи подключения через Unix-сокеты невозможны.
host
Управляет подключениями, устанавливаемыми по TCP/IP. Записи
host
соответствуют подключениям с SSL и без SSL.Примечание
Удалённое соединение по TCP/IP невозможно, если сервер запущен без определения соответствующих значений для параметра конфигурации listen_addresses, поскольку по умолчанию система принимает подключения по TCP/IP только для локального адреса замыкания
localhost
.hostssl
Управляет подключениями, устанавливаемыми по TCP/IP с применением шифрования SSL.
Чтобы использовать эту возможность, сервер изначально должен быть построен с поддержкой SSL. Более того, SSL должен быть включён на момент запуска сервера, для чего необходимо установить параметр конфигурации ssl (подробнее это описано в Разделе 18.9).
hostnossl
Этот тип записей противоположен
hostssl
, ему соответствуют только подключения по TCP/IP без шифрования SSL.база
Определяет, каким именам баз данных соответствует эта запись. Значение
all
определяет, что подходят все базы данных. Значениеsameuser
определяет, что данная запись соответствует только, если имя запрашиваемой базы данных совпадает с именем запрашиваемого пользователя. Значениеsamerole
определяет, что запрашиваемый пользователь должен быть членом роли с таким же именем, как и у запрашиваемой базы данных. (samegroup
- это устаревший, но допустимый вариант значенияsamerole
.) Суперпользователи не становятся членами роли автоматически из-заsamerole
, а только если они являются явными членами роли, прямо или косвенно, и не только из-за того, что они суперпользователи. Значениеreplication
показывает, что запись соответствует, если запрашивается подключение репликации (имейте в виду, что подключения репликации не определяют какую-то конкретную базу данных). В противном случае это имя определённой базы данных Postgres Pro. Несколько имён баз данных можно указать, разделяя их запятыми. Файл, содержащий имена баз данных, можно указать, поставив знак@
в начале его имени.пользователь
Указывает, какому имени (или именам) пользователя базы данных соответствует эта запись. Значение
all
показывает, что это подходит всем пользователям. В противном случае это либо имя конкретного пользователя базы данных, либо имя группы, в начале которого стоит знак+
. (Напомним, что в Postgres Pro нет никакой разницы между пользователем и группой; знак+
означает « совпадение любых ролей, которые прямо или косвенно являются членами роли», тогда как имя без знака+
является подходящим только для этой конкретной роли.) В связи с этим, суперпользователь рассматривается как член роли, только если он явно является членом этой роли, прямо или косвенно, а не только потому, что он является суперпользователем. Несколько имён пользователей можно указать, разделяя их запятыми. Файл, содержащий имена пользователей, можно указать, поставив знак@
в начале его имени.адрес
Указывает адрес (или адреса) клиентской машины, которым соответствует данная запись. Это поле может содержать или имя компьютера, или диапазон IP-адресов, или одно из нижеупомянутых ключевых слов.
Диапазон IP-адресов указывается в виде начального адреса диапазона, дополненного косой чертой (
/
) и длиной маски CIDR. Длина маски задаёт количество старших битов клиентского IP-адреса, которые должны совпадать с битами 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 не будут приниматься, если системная библиотека С не поддерживает адреса 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-адреса.Это поле применимо только к записям
host
,hostssl
иhostnossl
.IP-адрес
IP-маска
Эти два поля могут быть использованы как альтернатива записи
IP-адрес
/
длина-маски
. Вместо того, чтобы указывать длину маски, в отдельном столбце указывается сама маска. Например,255.0.0.0
представляет собой маску CIDR для IPv4 длиной 8 бит, а255.255.255.255
представляет маску CIDR длиной 32 бита.Эти поля применимы только к записям
host
,hostssl
иhostnossl
.метод-аутентификации
Указывает метод аутентификации, когда подключение соответствует этой записи. Варианты выбора приводятся ниже; подробности в Разделе 20.3.
trust
Разрешает безусловное подключение. Этот метод позволяет тому, кто может подключиться к серверу с базой данных Postgres Pro, войти под любым желаемым пользователем Postgres Pro без введения пароля и без какой-либо другой аутентификации. За подробностями обратитесь к Подразделу 20.3.1.
reject
Отклоняет подключение безусловно. Эта возможность полезна для «фильтрации» некоторых серверов группы, например, строка
reject
может отклонить попытку подключения одного компьютера, при этом следующая строка позволяет подключиться остальным компьютерам в той же сети.md5
Требует от клиента предоставить для аутентификации пароль, дважды хешированный алгоритмом MD5. За подробностями обратитесь к Подразделу 20.3.2.
scram
Требует от клиента предоставить для аутентификации пароль, зашифрованный алгоритмом SCRAM-SHA-256. За подробностями обратитесь к Подразделу 20.3.2.
password
Требует для аутентификации введения клиентом незашифрованного пароля. Поскольку пароль посылается простым текстом через сеть, такой способ не стоит использовать, если сеть не вызывает доверия. За подробностями обратитесь к Подразделу 20.3.2.
gss
Для аутентификации пользователя использует GSSAPI. Этот способ доступен только для подключений по TCP/IP. За подробностями обратитесь к Подразделу 20.3.3.
sspi
Для аутентификации пользователя использует SSPI. Способ доступен только для Windows. За подробностями обратитесь к Подразделу 20.3.4.
ident
Получает имя пользователя операционной системы клиента, связываясь с сервером Ident, и проверяет, соответствует ли оно имени пользователя базы данных. Аутентификация ident может использоваться только для подключений по TCP/IP. Для локальных подключений применяется аутентификация peer. За подробностями обратитесь к Подразделу 20.3.5.
peer
Получает имя пользователя операционной системы клиента из операционной системы и проверяет, соответствует ли оно имени пользователя запрашиваемой базы данных. Доступно только для локальных подключений. За подробностями обратитесь к Подразделу 20.3.6.
ldap
Проводит аутентификацию, используя сервер LDAP. За подробностями обратитесь к Подразделу 20.3.7.
radius
Проводит аутентификацию, используя сервер RADIUS. За подробностями обратитесь к Подразделу 20.3.8
cert
Проводит аутентификацию, используя клиентский сертификат SSL. За подробностями обратитесь к Подразделу 20.3.9
pam
Проводит аутентификацию, используя службу подключаемых модулей аутентификации (PAM), предоставляемую операционной системой. За подробностями обратитесь к Подразделу 20.3.10.
bsd
Проводит аутентификацию, используя службу аутентификации BSD, предоставляемую операционной системой. За подробностями обратитесь к Подразделу 20.3.11.
.
параметры-аутентификации
После поля
метод-аутентификации
может идти поле (поля) видаимя
=
значение
, определяющее параметры метода аутентификации. Подробнее о параметрах, доступных для различных методов аутентификации, рассказывается ниже.Помимо описанных далее параметров, относящихся к различным методам, есть один общий параметр аутентификации
clientcert
, который можно задать в любой записиhostssl
. Если он равен1
, клиент должен представить подходящий (доверенный) сертификат SSL, в дополнение к другим требованиям метода проверки подлинности.
Файлы, включённые в конструкции, начинающиеся с @
, читаются, как список имён, разделённых запятыми или пробелами. Комментарии предваряются знаком #
, как и в файле pg_hba.conf
, и вложенные @
конструкции допустимы. Если только имя файла, начинающегося с @
не является абсолютным путём.
Поскольку записи файла pg_hba.conf
рассматриваются последовательно для каждого подключения, порядок записей имеет большое значение. Обычно более ранние записи определяют чёткие критерии для соответствия параметров подключения, но для методов аутентификации допускают послабления. Напротив, записи более поздние смягчают требования к соответствию параметров подключения, но усиливают их в отношении методов аутентификации. Например, некто желает использовать trust
аутентификацию для локального подключения по TCP/IP, но при этом запрашивать пароль для удалённых подключений по TCP/IP. В этом случае запись, устанавливающая аутентификацию trust
для подключения адреса 127.0.0.1, должна предшествовать записи, определяющей аутентификацию по паролю для более широкого диапазона клиентских IP-адресов.
Файл pg_hba.conf
прочитывается при запуске системы, а также в тот момент, когда основной сервер получает сигнал SIGHUP. Если вы редактируете файл во время работы системы, необходимо послать сигнал процессу postmaster (используя pg_ctl reload
, вызвав SQL-функцию pg_reload_conf()
или выполнив kill -HUP
), чтобы он прочел обновлённый файл.
Подсказка
Чтобы подключиться к конкретной базе данных, пользователь не только должен пройти все проверки файла pg_hba.conf
, но должен иметь привилегию CONNECT
для подключения к базе данных. Если вы хотите ограничить доступ к базам данных для определённых пользователей, проще предоставить/отозвать привилегию CONNECT
, нежели устанавливать правила в записях файла pg_hba.conf
.
Примеры записей файла pg_hba.conf
показаны в Примере 20.1. Обратитесь к следующему разделу за более подробной информацией по методам аутентификации.
Пример 20.1. Примеры записей pg_hba.conf
# Позволяет любому пользователю локальной системы подключаться # к любой базе данных, используя любое пользователя баз данных, через # Unix-сокеты (по умолчанию для локальных подключений). # # TYPE DATABASE USER ADDRESS METHOD local all all trust # То же, но для локальных подключений по TCP/IP. # # TYPE DATABASE USER ADDRESS METHOD host all all 127.0.0.1/32 trust # То же, что и в предыдущей строке, но с указанием # сетевой маски в отдельном столбце # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust # То же для IPv6. # # TYPE DATABASE USER ADDRESS METHOD host all all ::1/128 trust # То же самое, но с использованием имени компьютера # (обычно покрывает и IPv4, и IPv6). # # TYPE DATABASE USER ADDRESS METHOD host all all localhost trust # Позволяет любому пользователю любого компьютера с IP-адресом # 192.168.93.x подключаться к базе данных "postgres" # с именем, которое сообщает для данного подключения ident # (как правило, имя пользователя операционной системы). # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.93.0/24 ident # Позволяет любому пользователю компьютера 192.168.12.10 подключаться # к базе данных "postgres" если пользователь передал правильный пароль, # используя заданный метод. # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.12.10/32 md5 host postgres all 192.168.12.10/32 scram # Позволяет пользователям с компьютеров в домене example.com подключаться # к любой базе данных при условии передачи правильного пароля, защищённого # с применением MD5. # # TYPE DATABASE USER ADDRESS METHOD host all all .example.com md5 # То же, что и в предыдущей строке, но пароль должен быть защищён # с применением SCRAM-SHA-256. host all all .example.com scram # В случае отсутствия предшествующих строчек с "host", следующие две строки # откажут в подключении с 192.168.54.1 (поскольку данная запись будет # сопоставляться первой), но разрешат подключения GSSAPI с любых других # адресов. С нулевой маской ни один бит из IP-адреса компьютера # не учитывается, так что этой строке соответствует любой компьютер. # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 gss # Позволяет пользователям с любого компьютера 192.168.x.x подключаться # к любой базе данных, если они проходят проверку ident. Если же ident # говорит, например, что это пользователь "bryanh" и он запрашивает # подключение как пользователь PostgreSQL "guest1", подключение # будет разрешено, если в файле pg_ident.conf есть сопоставление для # "omicron", позволяющее пользователю "bryanh" подключаться как "guest1". # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.0.0/16 ident map=omicron # Если для локальных подключений предусмотрены только эти три строки, # они позволят локальным пользователям подключаться только к своим # базам данных (базам данных с именами, совпадающими с # именами пользователей баз данных), кроме администраторов # или членов роли "support", которые могут подключиться к любой БД. # Файл $PGDATA/admins содержит список имён администраторов. # Пароли запрашиваются в любом случае. # # TYPE DATABASE USER ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5 # Последние две строчки выше могут быть объединены в одну: local all @admins,+support md5 # В столбце DATABASE также могут указываться списки и имена файлов: local db1,db2,@demodbs all md5