Подключения и аутентификация

Параметры подключения

listen_addresses (string)

Задает адреса TCP/IP, по которым сервер должен принимать подключения от клиентских приложений. Значение имеет форму разделенного запятыми списка имен хостов и/или числовых IP-адресов. Специальная запись * соответствует всем доступным IP-интерфейсам. Запись 0.0.0.0 позволяет прослушивать все адреса IPv4, а :: — все адреса IPv6. Если список пуст, сервер вообще не прослушивает ни один IP-интерфейс, и в этом случае для подключения к нему можно использовать только сокеты домена Unix. Значением по умолчанию является localhost, что позволяет устанавливать только локальные «петлевые» подключения по TCP/IP. Хотя аутентификация клиента позволяет скрупулезно управлять доступом к серверу, listen_addresses определяет, через какие именно интерфейсы будут приниматься соединения, что может помочь предотвратить злонамеренные попытки подключения через незащищенные сетевые интерфейсы. Этот параметр можно задать только при запуске сервера.

port (integer)

TCP-порт, который прослушивает сервер; по умолчанию это 5432. Обратите внимание, что этот номер порта используется для всех IP-адресов, через которые сервер принимает подключения. Этот параметр можно задать только при запуске сервера.

max_connections (integer)

Определяет максимальное количество одновременных подключений к серверу баз данных. По умолчанию обычно это 100 подключений, но может быть и меньше, если настройки ядра не будут это поддерживать (что определяется в процессе qhb_bootstrap (или initdb)). Этот параметр можно задать только при запуске сервера.

При запуске резервного сервера следует установить для этого параметра значение большее или равное значению на главном сервере. В противном случае на резервном сервере не будут разрешены запросы.

superuser_reserved_connections (integer)

Определяет количество «слотов» подключений, которые зарезервированы для суперпользователей QHB. В большинстве случаев подключения max_connections могут быть активными одновременно. Всякий раз, когда число активных одновременных подключений больше или равно max_connections минус superuser_reserved_connections, новые подключения будут приниматься только от суперпользователей, а подключения для репликации приниматься не будут.

По умолчанию резервируется три соединения. Это значение должно быть меньше значения max_connections. Этот параметр можно задать только при запуске сервера.

unix_socket_directories (string)

Задает каталог сокетов домена Unix, через которые сервер должен принимать подключения от клиентских приложений. Можно создать несколько сокетов, перечислив несколько каталогов, разделенных запятыми. Пробелы между записями игнорируются; если в имени каталога требуются пробелы или запятые, заключите его в кавычки. Пустое значение указывает, что сервер не принимает подключения через сокеты домена Unix, и в этом случае к нему можно подключиться только по TCP/IP.

Значение, начинающееся с @, указывает, что должен быть создан сокет домена Unix в абстрактном пространстве имен (в настоящее время поддерживается в Linux). В таком случае это значение задает не «каталог», а префикс, из которого вычисляется фактическое имя сокета таким же образом, как и для пространства имен файловой системы. Хотя префикс имени абстрактного сокета можно выбрать произвольно, поскольку он не задает расположение в файловой системе, все равно принято использовать значения как в файловой системе, например @/tmp.

Значением по умолчанию обычно является /tmp, но его можно изменить во время сборки. Этот параметр можно задать только при запуске сервера.

В дополнение к самому файлу сокета, который называется .s.PGSQL.nnnn, где nnnn — это номер порта сервера, в каждом из каталогов unix_socket_directories будет создан обычный файл с именем .s.PGSQL.nnnn.lock. Эти файлы ни в коем случае нельзя удалять вручную. Для сокетов в абстрактном пространстве имен файл .lock не создается.

unix_socket_group (string)

Задает группу-владельца сокета домена Unix. (Пользователем-владельцем сокетов всегда является пользователь, запускающий сервер). В сочетании с параметром unix_socket_permissions этот параметр можно использовать в качестве дополнительного механизма управления доступом для подключений через сокеты домена Unix. По умолчанию это пустая строка, что делает владельцем группу по умолчанию пользователя сервера. Этот параметр можно задать только при запуске сервера.

Сокеты в абстрактном пространстве имен не имеют владельца, поэтому в их случае этот параметр игнорируется.

unix_socket_permissions (integer)

Задает права доступа к сокетам домена Unix. Для этих сокетов применяется обычный набор разрешений файловой системы Unix. Ожидается, что значение параметра будет иметь числовой вид, указанный в формате, принимаемом системными функциями chmod и umask. (Для использования обычного восьмеричного формата число должно начинаться с 0 (нуля).)

Разрешения по умолчанию — 0777, при которых подключаться к сокету могут все. Разумными альтернативами являются 0770 (доступ имеет только пользователь и группа, см. также unix_socket_group) и 0700 (доступ имеет только пользователь). (Обратите внимание, что для сокетов домена Unix имеет значение только право на запись, поэтому нет смысла устанавливать или отзывать права на чтение или выполнение.)

Этот механизм управления доступом не зависит от механизма, описанного в главе Аутентификация клиентского приложения.

Этот параметр можно задать только при запуске сервера.

Этот параметр не применим к системам, которые полностью игнорируют разрешения для сокетов, особенно к Solaris (а именно, к Solaris 10). Там схожего эффекта можно достичь, задав в параметре unix_socket_directories каталог, доступ к которому ограничен желаемой аудиторией.

Сокеты в абстрактном пространстве имен не имеют прав доступа к файлам, поэтому в их случае этот параметр тоже игнорируется.

bonjour (boolean)

Включает оповещение о существование сервера посредством Bonjour. По умолчанию выключен. Этот параметр можно задать только при запуске сервера.

bonjour_name (string)

Задает имя службы в среде Bonjour. Если для этого параметра задана пустая строка, '' (это значение по умолчанию), то в качестве имени службы используется имя компьютера. Этот параметр игнорируется, если сервер был скомпилирован без поддержки Bonjour. Этот параметр можно задать только при запуске сервера.

tcp_keepalives_idle (integer)

Задает время отсутствия активности в сети, по истечении которого операционная система должна отправлять клиенту сигнал TCP о поддержании активного состояния. Если это значение указано без единиц измерения, оно считается заданным в секундах. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_KEEPIDLE или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты Unix-домена, этот параметр игнорируется и всегда считается равным нулю.

tcp_keepalives_interval (integer)

Задает время, по истечении которого следует повторно передать сигнал TCP о поддержании активного состояния, если получение предыдущего сигнала не было подтверждено клиентом. Если это значение указано без единиц измерения, оно считается заданным в секундах. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_KEEPINTVL или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты домена Unix, этот параметр игнорируется и всегда считается равным нулю.

tcp_keepalives_count (integer)

Задает количество сигналов TCP о поддержании активного состояния, которые могут быть потеряны до того, как соединение сервера с клиентом будет считаться прерванным. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_KEEPCNT или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты домена Unix, этот параметр игнорируется и всегда считается равным нулю.

tcp_user_timeout (integer)

Задает время, в течение которого передаваемые данные могут оставаться неподтвержденными, прежде чем TCP-соединение будет принудительно закрыто. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При значении 0 (по умолчанию) выбирается значение, принятое по умолчанию в операционной системе. Этот параметр поддерживается только в системах, поддерживающих TCP_USER_TIMEOUT или равнозначный ему параметр сокета; в других системах он должен быть равен нулю. В сеансах, подключенных через сокеты домена Unix, этот параметр игнорируется и всегда считается равным нулю.

client_connection_check_interval (integer)

Устанавливает интервал времени между необязательными проверками соединения клиента с сервером при выполнении запроса. Эта проверка осуществляется путем упорядоченного опроса сокета и позволяет прерывать длительные запросы раньше, если ядро сообщает, что соединение закрыто.

В настоящий момент этот параметр доступен только в системах, поддерживающих нестандартное расширение POLLRDHUP для системного вызова poll (в том числе в Linux).

Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. При значении 0 (по умолчанию) проверка соединения выключена. Без этих проверок сервер обнаружит потерю соединения только при следующем обращении к сокету, когда будет ожидать, получать или передавать данные.

Чтобы само ядро могло надежно и в течение известного промежутка времени обнаружить потерянные TCP-соединения во всех сценариях, включая сбой сети, также может понадобиться скорректировать параметры сохранения TCP-соединения в операционной системе или параметры QHB tcp_keepalives_idle, tcp_keepalives_interval и tcp_keepalives_count.


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

authentication_timeout (integer)

Максимальное время, за которое должна завершиться аутентификация клиента. Если потенциальный клиент не завершил протокол аутентификации за это время, сервер закрывает соединение. Это не дает зависшим при подключении клиентам занимать соединение неограниченно долго. Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию составляет одну минуту (1m). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

password_encryption (enum)

Если в CREATE ROLE или ALTER ROLE указан пароль, этот параметр определяет алгоритм, которым тот будет зашифрован. Возможные значения: scram-sha-256, при котором пароль зашифруется алгоритмом SCRAM-SHA-256, и md5, при котором пароль сохраняется в виде хэша MD5. Значение по умолчанию — scram-sha-256.

Обратите внимание, что старые клиенты могут не поддерживать механизм аутентификации SCRAM и, следовательно, не будут работать с паролями, зашифрованными алгоритмом SCRAM-SHA-256. Подробную информацию см. в разделе Аутентификация по паролю.

krb_server_keyfile (string)

Задает путь к файлу ключей Kerberos для данного сервера. Значение по умолчанию — FILE:/usr/local/qhb/etc/krb5.keytab (где в качестве каталога подставляется значение, указанное в параметре sysconfdir при сборке; чтобы его узнать, выполните pg_config --sysconfdir). Если в качестве значения задается пустая строка, то используется значение по умолчанию, зависящее от системы. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Подробную информацию см. в разделе Аутентификация GSSAPI.

krb_caseins_users (boolean)

Определяет, должны ли имена пользователей GSSAPI обрабатываться без учета регистра. По умолчанию установлено значение off (регистр учитывается). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

db_user_namespace (boolean)

Этот параметр позволяет относить имена пользователей к базам данных. По умолчанию установлено значение off (выключен). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Если этот параметр включен, имена пользователей следует создавать в виде имя_пользователя@база_данных. Когда подключающийся клиент передает имя_пользователя, к нему добавляются @ и имя базы данных, и сервер ищет пользователя по этому специфическому для базы данных имени. Обратите внимание, что при создании в среде SQL пользователей с именами, содержащими @, потребуется заключать эти имена в кавычки.

Если этот параметр включен, вы все равно можете создавать обычных глобальных пользователей. Для этого достаточно добавить @ при указании имени пользователя в клиенте, например joe@. Символ @ будет удален раньше, чем сервер найдет имя пользователя.

Параметр db_user_namespace вызывает расхождения в представлении имени пользователя на стороне клиента и сервера. Проверка подлинности всегда выполняется с именем на стороне сервера, поэтому методы аутентификации должны настраиваться по серверному имени пользователя, а не клиентскому. Поскольку метод аутентификации md5 использует имя пользователя в качестве соли как на стороне клиента, так и на стороне сервера, при включенном параметре db_user_namespace этот метод использовать нельзя.

Примечание
Эта возможность предполагается как временная мера, пока не будет найдено полноценное решение. Тогда этот параметр будет удален.


SSL

Дополнительную информацию о настройке SSL см. в разделе Защита TCP/IP-соединений посредством SSL.

ssl (boolean)

Разрешает подключения SSL. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — off (выключен).

ssl_ca_file (string)

Задает имя файла, содержащего сертификаты центров сертификации (ЦС) для SSL- сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. По умолчанию этот параметр пуст, то есть файл ЦС не загружается, и проверка клиентских сертификатов не выполняется.

ssl_cert_file (string)

Задает имя файла, содержащего сертификат SSL-сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — server.crt.

ssl_crl_file (string)

Задает имя файла, содержащего список отозванных сертификатов (Certificate Revocation List, CRL) для SSL-клиента. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. По умолчанию этот параметр пуст, то есть файл CRL не используется (если только не установлен параметр ssl_crl_dir).

ssl_crl_dir (string)

Задает имя каталога, содержащего список отозванных сертификатов (Certificate Revocation List, CRL) для SSL-клиента. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. По умолчанию этот параметр пуст, то есть файл CRL не используется (если только не установлен параметр ssl_crl_file).

Этот каталог необходимо подготовить с помощью команды OpenSSL openssl rehash или c_rehash. Более подробную информацию см. в документации OpenSSL.

При использовании этого параметра CRL в указанном каталоге загружаются при необходимости во время подключения. В каталог можно добавлять новые CRL, которые сразу же будут использоваться. Это отличает данный параметр от ssl_crl_file, с которым CRL загружается в файл при запуске сервера или перезагрузке конфигурации. Оба эти параметра можно применять вместе.

ssl_key_file (string)

Задает имя файла, содержащего закрытый ключ SSL-сервера. Относительные пути рассматриваются от каталога данных. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — server.key.

ssl_ciphers (string)

Задает список наборов шифров SSL, которые разрешено использовать для SSL- соединений. Синтаксис этого параметра и список поддерживаемых значений можно найти на странице руководства по шифрам в пакете OpenSSL. Этот параметр действует только на подключения TLS версии 1.2 и ниже. Для подключений TLS версии 1.3 параметры, управляющие выбором шифров, в настоящее время отсутствуют. Значение по умолчанию — HIGH:MEDIUM:+3DES:!aNULL. Обычно это разумный выбор, если у вас нет особых требований к безопасности.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Объяснение значения по умолчанию:

  • HIGH
    Наборы шифров, в которых используются шифры из группы HIGH (например AES, Camellia, 3DES)

  • MEDIUM
    Наборы шифров, в которых используются шифры из группы MEDIUM (например RC4, SEED)

  • +3DES
    Порядок OpenSSL по умолчанию для HIGH проблематичен, потому что он ставит 3DES выше, чем AES128. Это неправильно, поскольку 3DES менее безопасен, чем AES128, и работает гораздо медленнее. Включение +3DES меняет этот порядок, размещая 3DES после всех других шифров групп HIGH и MEDIUM.

  • !aNULL
    Выключает наборы анонимных шифров, не требующие аутентификации. Такие наборы уязвимы для атак через незаконного посредника и поэтому не должны использоваться.

Доступные наборы шифров и их свойства зависят от версии OpenSSL. Чтобы увидеть фактическую информацию о них для текущей установленной версии OpenSSL, выполните команду openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'. Обратите внимание, что этот список фильтруется во время выполнения, в зависимости от типа ключа сервера.

ssl_prefer_server_ciphers (boolean)

Определяет, следует ли отдавать предпочтение шифрам SSL-сервера, а не клиента. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — on (включен).

Обычно лучше использовать шифры сервера, так как в его конфигурации менее вероятны ошибки.

ssl_ecdh_curve (string)

Задает имя кривой для использования при обмене ключами ECDH. Эту кривую должны поддерживать все подключающиеся клиенты. Это необязательно должна быть та же кривая, с которой был получен ключ эллиптической кривой сервера. Этот параметр можно задать только в файле qhb.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, в основном для поддержки старых версий библиотеки OpenSSL. Возможно, имеет смысл установить более высокое значение, если все применяемые у вас программные компоненты могут поддерживать более новые версии протокола.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_max_protocol_version (enum)

Задает максимальную версию протокола SSL/TLS, которую можно использовать. Допустимые значения такие же, как у параметра ssl_min_protocol_version, плюс пустая строка, означающая, что допускается любая версия протокола. По умолчанию разрешена любая версия. Установка максимальной версии протокола полезна прежде всего для тестирования или в случаях, когда у некоторых компонентов возникают проблемы при работе с более новым протоколом.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_dh_params_file (string)

Задает имя файла, содержащего параметры алгоритма Диффи-Хеллмана, используемые для так называемого эфемерного семейства DH-шифров SSL. По умолчанию этот параметр пуст, то есть используются параметры DH, скомпилированные по умолчанию. Применение нестандартных параметров DH повышает защиту, если злоумышленнику удается взломать хорошо известные скомпилированные параметры DH. Собственный файл с параметрами DH можно создать с помощью команды openssl dhparam -out dhparams.pem 2048.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_passphrase_command (string)

Задает внешнюю команду, которая будет вызываться, когда потребуется получить парольную фразу для расшифровки SSL-файла, например закрытого ключа. По умолчанию этот параметр пуст, то есть используется встроенный механизм запроса.

Эта команда должна вывести парольную фразу на устройство стандартного вывода и завершиться с кодом 0. В значении параметра %p заменяется строкой приглашения. (Напишите %%, чтобы вывести литерал %). Обратите внимание, что строка приглашения, вероятно, будет содержать пробелы, поэтому потребуется заключить ее в кавычки. Если в конце имеется один перевод строки, он будет удален при выводе.

На самом деле команда не обязана запрашивать у пользователя парольную фразу. Она может прочитать ее из файла, получить из системной связки ключей или другими подобными способами. Ответственность за надлежащую безопасность выбранного механизма несет пользователь.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

ssl_passphrase_command_supports_reload (boolean)

Этот параметр определяет, будет ли заданная параметром ssl_passphrase_command команда запроса пароля также вызываться при перезагрузке конфигурации, если для файла ключа нужна парольная фраза. Если этот параметр выключен (по умолчанию), то ssl_passphrase_command будет игнорироваться при перезагрузке, и конфигурация SSL не будет перезагружаться, если требуется парольная фраза. Этот параметр подходит для команды, которой для ввода пароля требуется терминал TTY, который может быть недоступен во время работы сервера. Включение этого параметра может быть целесообразно, если, например, пароль считывается из файла.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.