воскресенье, 20 января 2013 г.

19.1. Файл pg_hba.conf

Аутентификация клиента контролируется конфигурационным файлом, который обычно называется pg_hba.conf и хранится в каталоге кластера БД. (HBA означает host-based authentication - аутентификацию на основе хоста.) Файл со значениями по умолчанию создаётся при инициализации кластера при помощи initdb. Тем не менее можно разместить этот файл где угодно, для этого используется параметр hba_file.
Этот файл состоит из записей, по одной на строку. Пустые строки игнорируются, так же как и любой текст после знака #. Запись не может располагаться на нескольких строках. Каждая запись состоит из нескольких полей, разделённых пробелами или знаками табуляции. Значение поля может содержать пробелы, если это значение заключено в кавычки. Заключение в кавычки одного из ключевых слов в полях имени БД, пользователя или адреса (например, all или replication) приводит к тому, что это слово теряет свою специальную функцию и трактуется просто как набор соответствующих символов (то есть "all" будет означать не "любое значение", а значение с именем "all").
Каждая запись определяет тип подключения, интервал клиентских 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]
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]

Значение полей следующее:
local
Такая запись будет соответствовать соединениям, производимым через Unix-domain socket. Если записи такого типа нет, то подключения через Unix-domain socket будут запрещены.
host
Эта запись соответсвует подключениям через TCP/IP. Запись host соответствует как SSL так и не SSL подключениям.
Примечание: Удалённые TCP/IP подключения будут не возможны, пока сервер не будет запущен с соответствующем значением параметра listen_addresses, так как по умолчанию такие соединения будут ожидаться только на localhost.
hostssl
Эта запись будет соответствовать подключениям через TCP/IP, но только если они происходят с SSL шифрованием.
Для того, чтобы использовать эту опцию, сервер должен быть собран с поддержкой SSL. Более того, SSL должен быть активирован при запуске сервера при помощи параметра настройки ssl (более подробно - в разделе 17.9)
hostnossl
Эта запись ведёт себя обратным образом от hostssl, ей подходят только те записи, которые делаются через TCP/IP и не используют SSL.
database
Определяет, какое / какие имена БД будут соответствовать этой записи. all означает, что подходит любая БД. Значение sameuser означает, что запись будет походить для запросов, где БД имеет то же имя, что и подключающийся пользователь. Значение samerole определяет, запись будет соответствовать случаю, когда подключающийся пользователь будет являться членом роли с именем запрашиваемой БД. (samegroup - устаревший, но всё ещё допустимый аналог samerole.) Значение replication определяет, что запись будет соответствовать случаю подключения для репликации (обратите внимание, что подключения для репликации не определяют конкретную БД). Другими словами, это имя определённой БД PostgreSQL. Можно указать несколько имён БД, разделив их запятыми. Можно указать файл, содержащий имена БД, указав его имя с предварительным знаком @.
user
Определяет при каком / каких имени пользователя будет происходить совпадение с данной записью. Значение all означает, что запись будет совпадать с любым имененем пользователя. Другими словами, это поле определяет или имя пользователя БД, или имя группы, если перед значением стоит +. (Напомним, что нет реальной разницы между пользователями и группами в PostgreSQL; знак + на самом деле означает "совпадает с любой ролью, которая прямо или не прямо является членом этой роли", тогда как имя без + означает, что совпадение будет только при совпадении именно с этой ролью.) Можно указать несколько имён пользователей, разделив их запятыми. Можно указать файл, содержащий имена пользователей, указав его имя с предварительным знаком @.
address
Определяет адреса машины клиента, которым соответствует эта запись. Это поле может содержать либо имя хоста, либо диапазон IP адресов, либо одно из специальных слов, указанных ниже.
IP адрес задаётся в обычной точечной десятичной нотации с длиной маски бесклассовой адресации. Длина маски определяет сколько бит IP адреса должны совпадать с заданными тут. Биты справа от маски в указанном IP адресе должны быть равны нулю. Не должно быть пробелов между адресом, знаком / и длиной маски.
Обычным примером диапазона IP адресов, указанного таким образом, является 172.20.143.89/32 для конкретного хоста, 172.20.143.0/24 для небольшой сети, 10.6.0.0/16 для большой. 0.0.0.0/0 означает любой IPv4 адрес, а ::/0 - любой IPv6 адрес. Для того, чтобы указать конкретный хост, используйте маску 32 для IPv4 или 128 для IPv6. В сетевом адресе не пропускайте конечные нули.
IP адрес, заданный в формате IPv4 будет соответствовать IPv6 подключению с соответствующим адресом, например, 127.0.0.1 будет соответствовать адресу ::ffff:127.0.0.1. Адрес же, заданный в формате IPv6, будет соответствовать только IPv6 подключениям, даже если сам этот адрес находится в диапазоне IPv4-in-IPv6.  Обратите внимание, что записи в формате IPv6 будут отклонены, если системная библиотека С не поддерживает IPv6 адреса.
Кроме того, Вы можете использовать all, чтобы указать любой адрес, samehost, чтобы указать IP адрес самого сервера, и samenetto, что будет указывать на любой адрес в подсети, к которой подключён сервер.
Если указано имя хоста (всё, что не является IP адресом или ключевым словом - рассматривается как имя хоста), то это имя сравнивается с результатом получения имени узла по IP (то есть, используется reverse DNS lookup, если используется DNS). При сравнении регистр не учитывается. Если находится совпадение, то по имени определяется IP хоста при помощи forward DNS lookup, соответствует ли хоть один из полученных IP адресу хоста. Только если обе проверки выполняются,  тогда считается что совпадение с записью произошло. (Имя узла, которое используется в pg_hba.conf, должно быть одним из адресов, полученных при разрешении имени, иначе совпадение не будет засчитано. Некоторые базы данных имён позволяют ассоциировать с IP адресом несколько имён хостов, но ОС будет возвращать только одно имя при запросе на получения имени по IP.)
Имя хоста, начинающееся с точки указывает на суффикс имени хоста. Таким образом, .example.com будет соответствовать foo.example.com (но не будет соответствовать просто example.com).
Когда имена хостов определены в pg_hba.conf, Вы должны быть уверены, что разрешение имён работает достаточно быстро. Может быть разумным настроить локальный кэш разрешения имён, например, nscd. Кроме того, Вы можете захотеть активировать параметр конфигурации log_hostname, чтобы видеть в логе имена хостов клиентов, вместо их IP.
Это поле применимо только к записям host, hostssl и hostnossl.
IP-address
IP-mask
Эти поля могут быть использованы как альтернатива нотации бесклассовой адресации. Вместо указания длины маски, можно указать просто маску в отдельной колонке. Например, 255.0.0.0 будет соответствовать длине маске 8, а 255.255.255.255 - длине маски 32.
Эти поля актуальны только для записей host, hostssl и hostnossl.
auth-method
Определяет метод аутентификации, который будет использован при совпадении с записью. Возможные значения приведены тут, детали - в разделе 19.3
trust
Безусловно разрешает все подключения. Этот метод разрешает любому, кто может подключиться к серверу БД, зайти под любым пользователем PostgreSQL без необходимости предоставить пароль или использования какого-либо ещё способа аутентификации. Более подробно - в разделе 19.3.1.
reject
Безусловно отклоняет подключение. Это полезно для "отфильтровывания" некоторых узлов из группы, например строка reject может запретить конкретному узлу подключение, тогда как следующая строка разрешает подключения для остальных узлов этой сети.
md5
Требует от клиента предоставить md5 шифрованный пароль для аутентификации. Подробнее - в разделе 19.3.2
password
Требует от клиента предоставить незашифрованный пароль для аутентификации. Так как пароль посылается по сети в открытом виде, эта опция не должна использоваться для небезопасных сетей. Подробнее - в разделе 19.3.2
gss
Использует GSSAPI для аутентификации пользователя. Доступно только для TCP/IP подключений. Подробнее - в разделе 19.3.3
sspi
Использует SSPI для аутентификации пользователя. Доступно только для Windows. Подробнее - в разделе 19.3.4
krb5
Использует Kreberos V5 для аутентификации пользователя. Доступно только для TCP/IP подключений. Подробнее - в разделе 19.3.5
ident
Получает имя пользователя ОС клиента, соединяясь с сервером ident на клиенте и проверяет, соответствует ли оно имени пользователя для запрашиваемой БД. Аутентификация ident может использоваться только на TCP/IP соединениях. Когда это значение используется для локальных соединений, то вместо этого используется peer аутентификация. Подробнее - в разделе 19.3.6
peer
Получает имя пользователя ОС из самой ОС и проверяет, соответствует ли оно имени пользователя для запрашиваемой БД. Доступно только для локальных подключений. Подробнее - в разделе 19.3.7
ldap
Аутентификация при помощи сервера LDAP. Подробнее - раздел 19.3.8
radius
Аутентификация при помощи сервера RADIUS. Подробнее - раздел 19.3.9
cert
Аутентификация при помощи SSL сертификата клиента. Подробнее - раздел 19.3.10
pam
Аутентификация при помощи Pluggable Authentication Modules (PAM), предоставляемыми ОC. Подробнее - раздел 19.3.11

auth-options
После поля auth-method могут быть поля в форме name=value, которые задают опции для метода аутентификации. О доступных опциях для каждого метода - см. ниже
Файлы, добавляемые при помощи знака @, прочитываются как список имён, которые могут быть разделены пробелами или запятыми. Комментарии предваряются знаком #. Допустимы конструкции с вложением фалов. Если имя, следующее за @ не является абсолютным путём, то путь рассчитывается относительно каталога, содержащего ссылающийся файл.
Так как записи pg_hba.conf проверяются последовательно при каждой попытке подключения, порядок расположения записей крайне важен. Обычно, более ранние записи будут иметь более строгие требования к совпадению и более лёгкие методы аутентификации, тогда как более поздние подходят для большего числа случаев подключений и требуют более серьёзных методов аутентификации. Например, мы можем хотеть использовать trust для локальных TCP/IP соединений, но требовать пароль для удалённых TCP/IP соединений. В этом случае запись, определяющая метод аутентификации trust для соединений с 127.0.0.1 должна быть раньше, чем запись, требующая предоставления пароля для более широкого диапазона клиентских IP адресов.
Файл pg_hba.conf прочитывается при старте системы и при получении главным процессом сигнала SIGHUP. Если Вы отредактировали этот файл на работающей системе, Вы должны послать сигнал главному процессу (при помощи pg_ctl reload или kill -HUP), чтобы файл был перечитан.
Совет: для подключения к конкретной БД пользователь должен не только пройти проверку через файл pg_hba.conf, но и должен иметь привилегию CONNECT для этой БД. Если Вы хотите ограничить список пользователей к некоторым БД, обычно это проще всего сделать выдавая или отбирая привилегию CONNECT, а не редактировать правила в pg_hba.conf
Некоторые примеры записей pg_hba.conf приведены ниже. В следующем же разделе более подробно будут описаны различные методы аутентификации. (Копипаста из примера работать, возможно, не будет из-за смеси пробелов и табуляций - примечание переводчика)

# Позволяем любому локальному пользователю подключиться к любой БД с любым именем
# пользователя при помощи Unix-domain sockets (значение по умолчанию для локальных
# подключений).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local      all                    all                                                 trust

# То же самое, но при помощи loopback 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

# Позволяет любому пользователю с хоста домена example.com
# подключиться к любой БД при верном пароле пользователя
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host      all                     all                .example.com           md5

# В отсутствии предыдущих строк, эти две записи будут отклонять
# все подключения с 192.168.54.1 (так как они совпадают с первой
# записью), но разрешает подключения Kerberos 5 со всего
# интернета.  Маска 0 означает, что не рассматриваются биты IP
# адреса хоста, так что сюда попадает любой узел.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host      all                    all                192.168.54.1/32       reject
host      all                    all                0.0.0.0/0                   krb5

# Позволяет пользователям с узлов 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

# Поле БД тоже может использовать список и имена файлов:
local    db1,db2,@demodbs  all                                        md5

3 комментария:

  1. Скорей всего это скорировано с первоисточника компании Postgres Pro https://postgrespro.ru/docs/postgrespro/9.6/auth-pg-hba-conf

    ОтветитьУдалить
  2. Кто знает, возможно ли настроить PostgreSQL таким образом, что бы он блокировал БД при некотором количестве неудачных аутентификаций к ней? если да то как?

    ОтветитьУдалить