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

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

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 loopback подключения.

Хотя аутентификация клиента (Глава 20) позволяет точно контролировать, кто может получить доступ к серверу, listen_addresses управляет тем, какие интерфейсы принимают попытки подключения, что может помочь предотвратить повторяющиеся злонамеренные запросы на подключение на небезопасных сетевых интерфейсах. Этот параметр можно установить только при запуске сервера.

port (integer)

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

max_connections (integer)

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

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

reserved_connections (integer)

Определяет количество слотов подключения, которые зарезервированы для подключений ролями с привилегиями роли pg_used_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)

Определяет количество слотов подключений, зарезервированных для подключений суперпользователей Tantor SE. Максимальное количество одновременно активных подключений может быть не больше max_connections. Когда количество активных одновременных подключений достигает значения max_connections минус superuser_reserved_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. Ни один из файлов не должен удаляться вручную. Для сокетов в абстрактном пространстве имен не создается файл блокировки.

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. Этот параметр может быть установлен только при запуске сервера.

tcp_keepalives_idle (integer)

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

Примечание

На Windows установка значения 0 установит этот параметр на 2 часа, так как Windows не предоставляет способа чтения системного значения по умолчанию.

tcp_keepalives_interval (integer)

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

Примечание

На Windows установка значения 0 установит этот параметр на 1 секунду, поскольку Windows не предоставляет способа чтения системного значения по умолчанию.

tcp_keepalives_count (integer)

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

Примечание

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

tcp_user_timeout (integer)

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

Примечание

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

client_connection_check_interval (integer)

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

Этот параметр основан на ядерных событиях, предоставляемых Linux, macOS, illumos и семейством операционных систем BSD, и в настоящее время не доступен на других системах.

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

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

libpq_compression (string)

Этот параметр управляет доступными методами сжатия трафика между клиентом и сервером. Он позволяет отклонять запросы на сжатие, даже если сервер поддерживает эту функцию (например, из-за соображений безопасности или потребления процессорного времени). По умолчанию установлено значение on, что означает, что разрешены все поддерживаемые методы сжатия. Для более точного контроля можно указать список разрешенных методов сжатия. Например, чтобы разрешить только методы lz4 и zlib, установите значение параметра в lz4,zlib. Также можно указать максимальный уровень сжатия для каждого метода, например, установив значение параметра в lz4:1,zlib:2, максимальный уровень сжатия для метода lz4 будет установлен на 1, а для метода zlib - на 2. Если клиент запрашивает сжатие с более высоким уровнем сжатия, то будет установлен максимально допустимый уровень. По умолчанию (и рекомендуется) максимальный уровень сжатия для каждого алгоритма равен 1.

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

authentication_timeout (integer)

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

password_encryption (enum)

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

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

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 или в командной строке сервера.

db_user_namespace (boolean)

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

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

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

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

Примечание

Эта функция предназначена как временное решение до тех пор, пока не будет найдено полное решение. В то время этот параметр будет удален.

19.3.3. SSL

См. Раздел 18.9 для получения дополнительной информации о настройке SSL. Параметры конфигурации для управления шифрованием передачи с использованием протоколов TLS называются ssl по историческим причинам, несмотря на то, что поддержка протокола SSL устарела. В данном контексте термины SSL и TLS используются взаимозаменяемо.

ssl (boolean)

Включает SSL-соединения. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. По умолчанию установлено значение off.

ssl_ca_file (string)

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

ssl_cert_file (string)

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

ssl_crl_file (string)

Указывает имя файла, содержащего список отзыва клиентского сертификата SSL (CRL). Относительные пути относятся к каталогу данных. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. По умолчанию он пуст, что означает, что файл CRL не загружается (если не установлен ssl_crl_dir).

ssl_crl_dir (string)

Указывает имя каталога, содержащего список отзыва клиентского сертификата SSL (CRL). Относительные пути относятся к каталогу данных. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. По умолчанию он пуст, что означает, что CRL не используются (если не установлен параметр ssl_crl_file).

Для подготовки каталога необходимо выполнить команду OpenSSL openssl rehash или c_rehash. Подробности см. в его документации.

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

ssl_key_file (string)

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

ssl_ciphers (string)

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

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

Пояснения по значениям по умолчанию:

HIGH

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

MEDIUM

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

+3DES

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

!aNULL

Отключает анонимные шифровальные наборы, которые не выполняют аутентификацию. Такие шифровальные наборы уязвимы к атакам MITM (атаки типа "человек посередине") и, следовательно, не должны использоваться.

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

ssl_prefer_server_ciphers (boolean)

Определяет, следует ли использовать предпочтения шифрования SSL сервера, а не клиента. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. По умолчанию установлено значение on.

Старые версии PostgreSQL не имеют этой настройки и всегда используют предпочтения клиента. Эта настройка в основном предназначена для обратной совместимости с этими версиями. Использование предпочтений сервера обычно лучше, потому что более вероятно, что сервер настроен правильно.

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 версии 2 и 3, всегда отключены.

По умолчанию используется TLSv1.2, что соответствует лучшим практикам в отрасли на момент написания данного документа.

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

ssl_max_protocol_version (enum)

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

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

ssl_dh_params_file (string)

Указывает имя файла, содержащего параметры Диффи-Хеллмана, используемые для так называемого эфемерного семейства шифров 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 для запроса, что может быть недоступно, когда сервер работает. Установка этого параметра в значение on может быть целесообразной, если пароль получается из файла, например.

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.