19.3. Подключения и аутентификация #
19.3.1. Параметры подключений #
listen_addresses
(string
) #Задаёт адреса TCP/IP, по которым сервер будет принимать подключения клиентских приложений. Это значение принимает форму списка, разделённого запятыми, из имён и/или числовых IP-адресов узлов. Особый элемент,
*
, обозначает все имеющиеся IP-интерфейсы. Запись0.0.0.0
позволяет задействовать все адреса IPv4, а::
— все адреса IPv6. Если список пуст, сервер не будет привязываться ни к какому IP-интерфейсу, а значит, подключиться к нему можно будет только через Unix-сокеты. При непустом списке сервер запустится, если сможет принимать подключения хотя бы по одному адресу TCP/IP. Предупреждение будет выдано для любого адреса TCP/IP, который невозможно открыть. По умолчанию этот параметр содержит localhost, что допускает подключение к серверу по TCP/IP только через локальный интерфейс «замыкания».Хотя механизм аутентификации клиентов (см. Главу 20) позволяет гибко управлять доступом пользователей к серверу, параметр
listen_addresses
может ограничить интерфейсы, через которые будут приниматься соединения, что бывает полезно для предотвращения злонамеренных попыток подключения через незащищённые сетевые интерфейсы. Этот параметр можно задать только при запуске сервера.Примечание
При подготовке отказоустойчивого кластера с помощью bihactl этот параметр изменяется автоматически. Не рекомендуется изменять его вручную, поскольку это может повлиять на нормальную работу кластера.
port
(integer
) #TCP-порт, открываемый сервером; по умолчанию, 5432. Заметьте, что этот порт используется для всех IP-адресов, через которые сервер принимает подключения. Этот параметр можно задать только при запуске сервера.
Примечание
При подготовке отказоустойчивого кластера с помощью bihactl этот параметр изменяется автоматически. Не рекомендуется изменять его вручную, поскольку это может повлиять на нормальную работу кластера.
max_connections
(integer
) #Определяет максимальное число одновременных подключений к серверу БД. По умолчанию обычно это 100 подключений, но это число может быть меньше, если ядро накладывает свои ограничения (это определяется в процессе initdb). Этот параметр можно задать только при запуске сервера.
Postgres Pro определяет размер некоторых ресурсов в зависимости от значения
max_connections
. Увеличение этого значения приводит к выделению большего объёма этих ресурсов, включая общую память.Для ведомого сервера значение этого параметра должно быть больше или равно значению на ведущем. В противном случае на ведомом сервере не будут разрешены запросы.
reserved_connections
(integer
) #Определяет количество «слотов» подключений, которые PostgreSQL будет резервировать для ролей с правами роли
pg_use_reserved_connections
. Когда число активных одновременных подключений больше superuser_reserved_connections, но меньше суммыsuperuser_reserved_connections
иreserved_connections
, принимаются только подключения суперпользователей и ролей с правамиpg_use_reserved_connections
. Если количество подключений меньше или равноsuperuser_reserved_connections
, принимаются только подключения суперпользователей.По умолчанию подключения не резервируются (параметр имеет нулевое значение). Это значение должно быть меньше значения
max_connections
минусsuperuser_reserved_connections
. Задать этот параметр можно только при запуске сервера.superuser_reserved_connections
(integer
) #Определяет количество «слотов» подключений, которые Postgres Pro будет резервировать для суперпользователей. При этом всего одновременно активными могут быть максимум max_connections подключений. Когда число активных одновременных подключений больше или равно
max_connections
минусsuperuser_reserved_connections
, принимаются только подключения суперпользователей. Слоты подключения, зарезервированные этим параметром, предназначены для использования в экстренных случаях, когда закончатся слоты, зарезервированные reserved_connections.По умолчанию резервируются три соединения. Это значение должно быть меньше значения
max_connections
минусreserved_connections
. Задать этот параметр можно только при запуске сервера.unix_socket_directories
(string
) #Задаёт каталог Unix-сокета, через который сервер будет принимать подключения клиентских приложений. Создать несколько сокетов можно, перечислив в этом значении несколько каталогов через запятую. Пробелы между элементами этого списка игнорируются; если в пути каталога содержатся пробелы, его нужно заключать в двойные кавычки. При пустом значении сервер не будет работать с Unix-сокетами, в этом случае к нему можно будет подключиться только по TCP/IP.
Значение, которое начинается с
@
, указывает, что будет создан сокет домена Unix в абстрактном пространстве имён (в настоящее время поддерживается только в Linux). Такое значение задаёт не «каталог», а префикс, из которого получается фактическое имя сокета таким же образом, как и для пространства имён файловой системы. Хотя префикс имени абстрактного сокета может быть произвольным, поскольку он не задаёт путь в файловой системе, принято использовать значения, подобные путям в файловой системе, такие как@/tmp
.Значение по умолчанию обычно
/tmp
, но оно может быть изменено во время сборки. В Windows по умолчанию это значение не задано, то есть сокет домена Unix не создаётся. Этот параметр можно установить только при запуске сервера.Помимо самого файла сокета, который называется
.s.PGSQL.
(гдеnnnn
nnnn
— номер порта сервера), в каждом каталогеunix_socket_directories
создаётся обычный файл.s.PGSQL.
. Ни в коем случае не удаляйте эти файлы вручную. Для сокетов в абстрактном пространстве имён файлnnnn
.lock.lock
не создаётся.unix_socket_group
(string
) #Задаёт группу-владельца Unix-сокетов. (Пользователем-владельцем сокетов всегда будет пользователь, запускающий сервер.) В сочетании с
unix_socket_permissions
данный параметр можно использовать как дополнительный механизм управления доступом к Unix-сокетам. По умолчанию он содержит пустую строку, то есть группой-владельцем становится основная группа пользователя, запускающего сервер. Задать этот параметр можно только при запуске сервера.В Windows данный параметр не поддерживается, так что любое его значение ни на что не влияет. Кроме того, сокеты в абстрактном пространстве имён не имеют владельца файла, поэтому для таких сокетов данный параметр также игнорируется.
unix_socket_permissions
(integer
) #Задаёт права доступа к Unix-сокетам. Для Unix-сокетов применяется обычный набор разрешений Unix. Значение параметра ожидается в числовом виде, который принимают функции
chmod
иumask
. (Для применения обычного восьмеричного формата число должно начинаться с0
(нуля).)По умолчанию действуют разрешения
0777
, при которых подключаться к сокету могут все. Другие разумные варианты —0770
(доступ имеет только пользователь и группа, см. такжеunix_socket_group
) и0700
(только пользователь). (Заметьте, что для Unix-сокетов требуется только право на запись, так что добавлять или отзывать права на чтение/выполнение не имеет смысла.)Этот механизм управления доступом не зависит от описанного в Главе 20.
Этот параметр можно задать только при запуске сервера.
Данный параметр неприменим для некоторых систем, в частности, Solaris (а именно Solaris 10), которые полностью игнорируют разрешения для сокетов. В таких системах примерно тот же эффект можно получить, указав в параметре
unix_socket_directories
каталог, доступ к которому ограничен должным образом.Сокеты в абстрактном пространстве имён не имеют прав доступа к файлам, поэтому для таких сокетов данный параметр также игнорируется.
bonjour
(boolean
) #Включает объявления о существовании сервера посредством Bonjour. По умолчанию выключен. Задать этот параметр можно только при запуске сервера.
bonjour_name
(string
) #Задаёт имя службы в среде Bonjour. Если значение этого параметра — пустая строка (
''
) (это значение по умолчанию), в качестве этого имени используется имя компьютера. Этот параметр игнорируется, если сервер был скомпилирован без поддержки Bonjour. Задать этот параметр можно только при запуске сервера.
19.3.2. Параметры TCP #
tcp_keepalives_idle
(integer
) #Задаёт период отсутствия сетевой активности, по истечении которого операционная система должна отправить клиенту TCP-сигнал сохранения соединения. Если это значение задаётся без единиц измерения, оно считается заданным в секундах. При значении 0 (по умолчанию) действует величина, принятая по умолчанию в операционной системе. В Windows при присваивании нулевого значения этот период устанавливается равным 2 часам, так как Windows не позволяет прочитать системное значение по умолчанию. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPIDLE
или равнозначный, а также в Windows; в других системах он должен быть равен нулю. В сеансах, подключённых через Unix-сокеты, он игнорируется и всегда считается равным 0.tcp_keepalives_interval
(integer
) #Задаёт интервал, по истечении которого следует повторять TCP-сигнал сохранения соединения, если от клиента не получено подтверждение предыдущего сигнала. Если это значение задаётся без единиц измерения, оно считается заданным в секундах. При значении 0 (по умолчанию) действует величина, принятая по умолчанию в операционной системе. В Windows при нулевом значении этот интервал устанавливается равным 1 секунде, так как Windows не позволяет прочитать системное значение по умолчанию. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPINTVL
или равнозначный, а также в Windows; в других системах он должен быть равен нулю. В сеансах, подключённых через Unix-сокеты, он игнорируется и всегда считается равным 0.tcp_keepalives_count
(integer
) #Задаёт число TCP-сигналов сохранения соединения, которые могут быть потеряны до того, как соединение сервера с клиентом будет признано прерванным. При значении 0 (по умолчанию) действует величина, принятая по умолчанию в операционной системе. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPCNT
или равнозначный (Windows не входит в их число); в других системах он должен быть равен нулю. В сеансах, подключённых через Unix-сокеты, он игнорируется и всегда считается равным 0.tcp_user_timeout
(integer
) #Задаёт интервал, в течение которого переданные данные могут оставаться неподтверждёнными, прежде чем будет принято решение о принудительном закрытии TCP-соединения. Если это значение задаётся без единиц измерения, оно считается заданным в миллисекундах. При значении 0 (по умолчанию) действует величина, принятая по умолчанию в операционной системе. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_USER_TIMEOUT
(Windows не входит в их число); в других системах он должен быть равен нулю. В сеансах, подключённых через доменные сокеты Unix, он игнорируется и всегда считается равным 0.client_connection_check_interval
(integer
) #Задаёт интервал между необязательными проверками соединения сервера с клиентом в процессе выполнения запроса. Такая проверка, заключающаяся в опросе состояния сокета, позволяет раньше прерывать длительные запросы, если ядро сообщает, что соединение закрыто.
Эта функциональность зависит от событий ядра, имеющихся только в Linux, macOS, illumos и операционных системах семейства BSD, и в настоящее время недоступна в других системах.
Если это значение задаётся без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию —
0
, то есть проверка соединения отключена. Если соединение не проверяется, сервер обнаружит разрыв соединения только при следующем обращении к сокету, когда будет передавать, ожидать или читать данные.Чтобы само ядро могло надёжно и в течение известного периода времени обнаруживать потерянные TCP-соединения во всех сценариях, включая сбой сети, также может потребоваться изменить параметры сохранения TCP-соединения в операционной системе или параметры Postgres Pro tcp_keepalives_idle, tcp_keepalives_interval и tcp_keepalives_count.
19.3.3. Аутентификация #
authentication_timeout
(integer
) #Максимальное время, за которое должна произойти аутентификация. Если потенциальный клиент не сможет пройти проверку подлинности за это время, сервер закроет соединение. Благодаря этому зависшие при подключении клиенты не будут занимать соединения неограниченно долго. Если это значение задаётся без единиц измерения, оно считается заданным в миллисекундах. Значение этого параметра по умолчанию — одна минута (
1m
). Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.password_encryption
(enum
) #Когда пароль передаётся в CREATE ROLE или ALTER ROLE, этот параметр определяет для него алгоритм шифрования. При значении
scram-sha-256
задаётся алгоритм шифрования SCRAM-SHA-256, а при значенииmd5
пароль хранится в виде MD5 хеша. Значение по умолчанию —scram-sha-256
. Тем не менее, в pg-setup для параметра--auth-host
по умолчанию устанавливается значениеmd5
, но и его можно изменить при необходимости, передав другое значение вinitdb
.Учтите, что старые клиенты могут не поддерживать механизм проверки подлинности SCRAM и поэтому не будут работать с паролями, зашифрованными алгоритмом SCRAM-SHA-256. За подробностями обратитесь к Разделу 20.5.
scram_iterations
(integer
) #Количество вычислительных итераций при шифровании пароля с использованием SCRAM-SHA-256. Значение по умолчанию —
4096
. Большее количество итераций обеспечивает дополнительную защиту сохранённых паролей от атак полным перебором, но замедляет аутентификацию. Изменение значения не влияет на существующие пароли, зашифрованные алгоритмом SCRAM-SHA-256, поскольку количество итераций фиксируется во время шифрования. Чтобы использовать изменённое значение, необходимо задать новый пароль.krb_server_keyfile
(string
) #Задаёт расположение файла ключей Kerberos для данного сервера. Значение по умолчанию:
FILE:/usr/local/pgsql/etc/krb5.keytab
(каталог определяется значением параметраsysconfdir
в процессе сборки; чтобы его узнать, выполнитеpg_config --sysconfdir
). Если этот параметр содержит пустую строку, используется значение по умолчанию, зависящее от системы. Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера. За подробностями обратитесь к Разделу 20.6.krb_caseins_users
(boolean
) #Определяет, должны ли имена пользователей GSSAPI обрабатываться без учёта регистра. По умолчанию значение этого параметра —
off
(регистр учитывается). Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.gss_accept_delegation
(boolean
) #Определяет, должно ли приниматься делегирование учётных данных GSSAPI от клиента. По умолчанию значение этого параметра —
off
, то есть учётные данные клиента не принимаются. Изменение этого параметра наon
заставит сервер принимать учётные данные, переданные ему от клиента. Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.
19.3.4. SSL #
За дополнительной информацией о настройке SSL обратитесь к Разделу 18.9. Параметры конфигурации для управления шифрованием передачи с использованием протоколов TLS называются ssl
по историческим причинам, несмотря на то, что протокол SSL признан устаревшим. SSL в этом контексте используется взаимозаменяемо с TLS.
ssl
(boolean
) #Разрешает подключения SSL. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. Значение по умолчанию —off
.ssl_ca_file
(string
) #Задаёт имя файла, содержащего сертификаты центров сертификации (ЦС) для SSL-сервера. При указании относительного пути он рассматривается от каталога данных. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. По умолчанию этот параметр пуст, что означает, что файл сертификатов ЦС не загружается и проверка клиентских сертификатов не производится.ssl_cert_file
(string
) #Задаёт имя файла, содержащего сертификат этого SSL-сервера. При указании относительного пути он рассматривается от каталога данных. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. Значение по умолчанию —server.crt
.ssl_crl_file
(string
) #Задаёт имя файла, содержащего список отзыва клиентских сертификатов (CRL, Certificate Revocation List) для SSL. При указании относительного пути он рассматривается от каталога данных. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. По умолчанию этот параметр пуст, что означает, что файл CRL не загружается (если не задан параметр ssl_crl_dir).ssl_crl_dir
(string
) #Задаёт имя каталога, содержащего список отзыва клиентских сертификатов (CRL, Certificate Revocation List) для SSL. При указании относительного пути он рассматривается от каталога данных. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. По умолчанию этот параметр пуст, что означает, что файл CRL не загружается (если не задан параметр ssl_crl_file).Каталог необходимо подготовить с помощью команды OpenSSL
openssl rehash
илиc_rehash
. За подробностями обратитесь к документации OpenSSL.Когда применяется этот параметр, списки отзыва сертификатов (Certificate Revocation List, CRL) в указанном каталоге загружаются при необходимости во время подключения. Новые CRL в этом каталоге будут использоваться сразу по мере добавления. Это отличает данный параметр от ssl_crl_file, с которым CRL загружаются из файла во время запуска сервера или при перезагрузке конфигурации. Эти параметры можно использовать вместе.
ssl_key_file
(string
) #Задаёт имя файла, содержащего закрытый ключ SSL-сервера. При указании относительного пути он рассматривается от каталога данных. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. Значение по умолчанию —server.key
.ssl_ciphers
(string
) #Задаёт список наборов шифров SSL, которые могут применяться для SSL-соединений. Синтаксис этого параметра и список поддерживаемых значений можно найти на странице ciphers руководства по OpenSSL. Этот параметр действует только для подключений TLS версии 1.2 и ниже. Для подключений TLS версии 1.3 возможность выбора шифров в настоящее время отсутствует. Значение по умолчанию —
HIGH:MEDIUM:+3DES:!aNULL
. Обычно оно вполне приемлемо при отсутствии особых требований по безопасности.Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.Объяснение значения по умолчанию:
HIGH
#Наборы шифров, в которых используются шифры из группы высокого уровня (
HIGH
), (например: AES, Camellia, 3DES)MEDIUM
#Наборы шифров, в которых используются шифры из группы среднего уровня (
MEDIUM
) (например, RC4, SEED)+3DES
#Порядок шифров для группы
HIGH
по умолчанию в OpenSSL определён некорректно. В нём 3DES оказывается выше AES128, что неправильно, так как он считается менее безопасным, чем AES128, и работает гораздо медленнее. Включение+3DES
меняет этот порядок, чтобы данный алгоритм следовал после всех шифров группHIGH
иMEDIUM
.!aNULL
#Отключает наборы анонимных шифров, не требующие проверки подлинности. Такие наборы уязвимы для атак с посредником (MITM), поэтому использовать их не следует.
Конкретные наборы шифров и их свойства очень различаются от версии к версии OpenSSL. Чтобы получить фактическую информацию о них для текущей установленной версии OpenSSL, выполните команду
openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'
. Учтите, что этот список фильтруется во время выполнения, в зависимости от типа ключа сервера.ssl_prefer_server_ciphers
(boolean
) #Определяет, должны ли шифры SSL сервера предпочитаться клиентским. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. Значение по умолчанию —on
.До версии Postgres Pro 9.4 этот параметр отсутствовал и предпочтение отдавалось выбору клиента. Введён этот параметр в основном для обеспечения совместимости с этими версиями. Обычно лучше использовать конфигурацию сервера, так как в конфигурации на стороне клиента более вероятны ошибки.
ssl_ecdh_curve
(string
) #Задаёт имя кривой для использования при обмене ключами ECDH. Эту кривую должны поддерживать все подключающиеся клиенты. Это не обязательно должна быть кривая, с которой был получен ключ сервера. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. Значение по умолчанию —prime256v1
.Наиболее распространённые кривые в OpenSSL —
prime256v1
(NIST P-256),secp384r1
(NIST P-384),secp521r1
(NIST P-521). Полный список доступных кривых можно получить командойopenssl ecparam -list_curves
. Однако не все из них пригодны для TLS.ssl_min_protocol_version
(enum
) #Задаёт минимальную версию протокола SSL/TLS, которая может использоваться. В настоящее время допускаются версии
TLSv1
,TLSv1.1
,TLSv1.2
,TLSv1.3
. Старые версии библиотеки OpenSSL могут не поддерживать все варианты; при выборе неподдерживаемой версии будет выдана ошибка. Версии протокола до TLS 1.0, а именно SSL v.2 и v.3, не будут использоваться в любом случае.Значение по умолчанию —
TLSv1.2
, что соответствует рекомендациям, актуальным в индустрии на момент написания этой документации.Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.ssl_max_protocol_version
(enum
) #Задаёт максимальную версию протокола SSL/TLS, которая может использоваться. Допускаются те же версии, что и для ssl_min_protocol_version, а также пустая строка, обозначающая отсутствие ограничения версии. По умолчанию версии не ограничиваются. Устанавливать максимальную возможную версию протокола полезно прежде всего для тестирования или в случае проблем при использовании нового протокола какими-то компонентами.
Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.ssl_dh_params_file
(string
) #Задаёт имя файла с параметрами алгоритма Диффи-Хеллмана, применяемого для так называемого эфемерного семейства DH шифров SSL. По умолчанию значение пустое, то есть используются стандартные параметры DH, заданные при компиляции. Использование нестандартных параметров DH защищает от атаки, рассчитанной на взлом хорошо известных встроенных параметров DH. Создать собственный файл с параметрами DH можно, выполнив команду
openssl dhparam -out dhparams.pem 2048
.Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.ssl_passphrase_command
(string
) #Задаёт внешнюю команду, которая будет вызываться, когда потребуется пароль для расшифровывания SSL-файла, например закрытого ключа. По умолчанию этот параметр не определён, то есть пароль будет запрашиваться встроенным механизмом.
Эта команда должна вывести пароль на устройство стандартного вывода и завершиться с кодом 0. В строке параметра
%p
заменяется строкой приглашения. (Напишите%%
, чтобы вывести%
буквально.) Заметьте, что строка приглашения, вероятно, будет содержать пробелы, так что её нужно будет заключить в кавычки. Если в конце добавлен один перевод строки, он будет отфильтрован при выводе.Эта команда не обязательно должна запрашивать пароль у пользователя. Она может считать его из файла, извлечь из системной связки ключей или получить другими подобными средствами. Ответственность за выбор достаточно безопасного механизма возлагается на пользователя.
Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.ssl_passphrase_command_supports_reload
(boolean
) #Этот параметр определяет, будет ли заданная параметром
ssl_passphrase_command
команда, запрашивающая пароль, также вызываться при перезагрузке конфигурации, если для файла ключа требуется пароль. Когда этот параметр отключён (по умолчанию), командаssl_passphrase_command
будет игнорироваться при перезагрузке, и конфигурация SSL не будет обновляться, если требуется пароль. Это значение подходит для команды, требующей для ввода пароля наличия терминала TTY, который может быть недоступен в процессе работы сервера. Включение данного параметра может быть уместно, если, например, пароль считывается из файла.Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.