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
может ограничить интерфейсы, через которые будут приниматься соединения, что бывает полезно для предотвращения злонамеренных попыток подключения через незащищённые сетевые интерфейсы. Этот параметр можно задать только при запуске сервера.port
(integer
)TCP-порт, открываемый сервером; по умолчанию, 5432. Заметьте, что этот порт используется для всех IP-адресов, через которые сервер принимает подключения. Этот параметр можно задать только при запуске сервера.
max_connections
(integer
)Определяет максимальное число одновременных подключений к серверу БД. По умолчанию обычно это 100 подключений, но это число может быть меньше, если ядро накладывает свои ограничения (это определяется в процессе initdb). Этот параметр можно задать только при запуске сервера.
Для ведомого сервера значение этого параметра должно быть больше или равно значению на ведущем. В противном случае на ведомом сервере не будут разрешены запросы.
superuser_reserved_connections
(integer
)Определяет количество «слотов» подключений, которые PostgreSQL будет резервировать для суперпользователей. При этом всего одновременно активными могут быть максимум max_connections подключений. Когда число активных одновременных подключений больше или равно
max_connections
минусsuperuser_reserved_connections
, принимаются только подключения суперпользователей, а все другие подключения, в том числе подключения для репликации, запрещаются.По умолчанию резервируются три соединения. Это значение должно быть меньше значения
max_connections
минус max_wal_senders. Задать этот параметр можно только при запуске сервера.unix_socket_directories
(string
)Задаёт каталог Unix-сокета, через который сервер будет принимать подключения клиентских приложений. Создать несколько сокетов можно, перечислив в этом значении несколько каталогов через запятую. Пробелы между элементами этого списка игнорируются; если в пути каталога содержатся пробелы, его нужно заключать в двойные кавычки. При пустом значении сервер не будет работать с Unix-сокетами, в этом случае к нему можно будет подключиться только по TCP/IP. Значение по умолчанию обычно
/tmp
, но его можно изменить во время сборки. Задать этот параметр можно только при запуске сервера.Помимо самого файла сокета, который называется
.s.PGSQL.
(гдеnnnn
nnnn
— номер порта сервера), в каждом каталогеunix_socket_directories
создаётся обычный файл.s.PGSQL.
. Ни в коем случае не удаляйте эти файлы вручную.nnnn
.lockЭтот параметр не действует в системе Windows, так как в ней нет Unix-сокетов.
unix_socket_group
(string
)Задаёт группу-владельца Unix-сокетов. (Пользователем-владельцем сокетов всегда будет пользователь, запускающий сервер.) В сочетании с
unix_socket_permissions
данный параметр можно использовать как дополнительный механизм управления доступом к Unix-сокетам. По умолчанию он содержит пустую строку, то есть группой-владельцем становится основная группа пользователя, запускающего сервер. Задать этот параметр можно только при запуске сервера.Этот параметр не действует в системе Windows, так как в ней нет Unix-сокетов.
unix_socket_permissions
(integer
)Задаёт права доступа к Unix-сокетам. Для Unix-сокетов применяется обычный набор разрешений Unix. Значение параметра ожидается в числовом виде, который принимают функции
chmod
иumask
. (Для применения обычного восьмеричного формата число должно начинаться с0
(нуля).)По умолчанию действуют разрешения
0777
, при которых подключаться к сокету могут все. Другие разумные варианты —0770
(доступ имеет только пользователь и группа, см. такжеunix_socket_group
) и0700
(только пользователь). (Заметьте, что для Unix-сокетов требуется только право на запись, так что добавлять или отзывать права на чтение/выполнение не имеет смысла.)Этот механизм управления доступом не зависит от описанного в Главе 20.
Этот параметр можно задать только при запуске сервера.
Данный параметр неприменим для некоторых систем, в частности, Solaris (а именно Solaris 10), которые полностью игнорируют разрешения для сокетов. В таких системах примерно тот же эффект можно получить, указав в параметре
unix_socket_directories
каталог, доступ к которому ограничен должным образом. Этот параметр также неприменим в Windows, где нет Unix-сокетов.bonjour
(boolean
)Включает объявления о существовании сервера посредством Bonjour. По умолчанию выключен. Задать этот параметр можно только при запуске сервера.
bonjour_name
(string
)Задаёт имя службы в среде Bonjour. Если значение этого параметра — пустая строка (
''
) (это значение по умолчанию), в качестве этого имени используется имя компьютера. Этот параметр игнорируется, если сервер был скомпилирован без поддержки Bonjour. Задать этот параметр можно только при запуске сервера.tcp_keepalives_idle
(integer
)Задаёт период неактивности (в секундах), после которого по TCP клиенту должен отправляться сигнал сохранения соединения. При значении 0 действует системный параметр. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPIDLE
или равнозначный, а также в Windows; в других системах он должен быть равен нулю. В сеансах, подключённых через Unix-сокеты, он игнорируется и всегда считается равным 0.Примечание
В Windows при нулевом значении этот период устанавливается равным 2 часам, так как Windows не позволяет прочитать системное значение по умолчанию.
tcp_keepalives_interval
(integer
)Задаёт интервал (в секундах), по истечении которого следует повторять сигнал сохранения соединения, если ответ от клиента не был получен. При значении 0 действует системная величина. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPINTVL
или равнозначный, а также в Windows; в других системах он должен быть равен нулю. В сеансах, подключённых через Unix-сокеты, он игнорируется и всегда считается равным 0.Примечание
В Windows при нулевом значении этот интервал устанавливается равным 1 секунде, так как Windows не позволяет прочитать системное значение по умолчанию.
tcp_keepalives_count
(integer
)Задаёт число TCP-сигналов сохранения соединения, которые могут быть потеряны до того, как соединение сервера с клиентом будет признано прерванным. При значении 0 действует системная величина. Этот параметр поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPCNT
или равнозначный; в других системах он должен быть равен нулю. В сеансах, подключённых через Unix-сокеты, он игнорируется и всегда считается равным 0.Примечание
В Windows данный параметр не поддерживается и должен быть равен нулю.
19.3.2. Аутентификация
authentication_timeout
(integer
)Максимальное время, за которое должна произойти аутентификация (в секундах). Если потенциальный клиент не сможет пройти проверку подлинности за это время, сервер закроет соединение. Благодаря этому зависшие при подключении клиенты не будут занимать соединения неограниченно долго. Значение этого параметра по умолчанию — одна минута (
1m
). Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.password_encryption
(enum
)Когда в CREATE ROLE или ALTER ROLE задаётся пароль, этот параметр определяет, каким алгоритмом его шифровать. Значение по умолчанию —
md5
(пароль сохраняется в виде хеша MD5), также в качестве псевдонимаmd5
принимается значениеon
. Значениеscram-sha-256
указывает, что пароль будет шифроваться алгоритмом SCRAM-SHA-256.Учтите, что старые клиенты могут не поддерживать механизм проверки подлинности SCRAM и поэтому не будут работать с паролями, зашифрованными алгоритмом SCRAM-SHA-256. За подробностями обратитесь к Разделу 20.5.
krb_server_keyfile
(string
)Задаёт размещение файла ключей для сервера Kerberos. За подробностями обратитесь к Разделу 20.6. Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.krb_caseins_users
(boolean
)Определяет, должны ли имена пользователей GSSAPI обрабатываться без учёта регистра. По умолчанию значение этого параметра —
off
(регистр учитывается). Задать этот параметр можно только вpostgresql.conf
или в командной строке при запуске сервера.db_user_namespace
(boolean
)Этот параметр позволяет относить имена пользователей к базам данных. По умолчанию он имеет значение off (выключен). Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.Если он включён, имена создаваемых пользователей должны иметь вид
имя_пользователя@база_данных
. Когда подключающийся клиент передаётимя_пользователя
, к этому имени добавляется@
с именем базы данных, и сервер идентифицирует пользователя по этому полному имени. Заметьте, что для создания пользователя с именем, содержащим@
, в среде SQL потребуется заключить это имя в кавычки.Когда этот параметр включён, он не мешает создавать и использовать обычных глобальных пользователей. Чтобы подключиться с таким именем пользователя, достаточно добавить к имени
@
, например так:joe@
. Получив такое имя, сервер отбросит@
, и будет идентифицировать пользователя по начальному имени.Параметр
db_user_namespace
порождает расхождение между именами пользователей на стороне сервера и клиента. Но проверки подлинности всегда выполняются с именем с точки зрения сервера, так что, настраивая аутентификацию, следует указывать серверное представление имени, а не клиентское. Так как метод аутентификацииmd5
подмешивает имя пользователя в качестве соли и на стороне сервера, и на стороне клиента, при включённом параметреdb_user_namespace
использоватьmd5
невозможно.Примечание
Эта возможность предлагается в качестве временной меры, пока не будет найдено полноценное решение. Тогда этот параметр будет ликвидирован.
19.3.3. SSL
Дополнительную информацию о настройке SSL можно получить в Разделе 18.9.
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_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
Отключает наборы анонимных шифров, не требующие проверки подлинности. Такие наборы уязвимы для атак с посредником, поэтому использовать их не следует.
Конкретные наборы шифров и их свойства очень различаются от версии к версии OpenSSL. Чтобы получить фактическую информацию о них для текущей установленной версии OpenSSL, выполните команду
openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'
. Учтите, что этот список фильтруется во время выполнения, в зависимости от типа ключа сервера.ssl_prefer_server_ciphers
(boolean
)Определяет, должны ли шифры SSL сервера предпочитаться клиентским. Этот параметр можно задать только в
postgresql.conf
или в командной строке при запуске сервера. Значение по умолчанию —true
.В старых версиях 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_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
команда, запрашивающая пароль, также вызываться при перезагрузке конфигурации, если для файла ключа требуется пароль. Когда этот параметр равен false (по умолчанию), командаssl_passphrase_command
будет игнорироваться при перезагрузке, и конфигурация SSL не будет обновляться, если требуется пароль. Это значение подходит для команды, требующей для ввода пароля наличия терминала TTY, который может быть недоступен в процессе работы сервера. Значение true для данного параметра может быть уместно, если, например, пароль считывается из файла.Задать этот параметр можно только в
postgresql.conf
или в командной строке при запуске сервера.