支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:开发版
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1

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 期间确定的那样),则可能更少。此参数只能在服务器启动时设置。

PostgreSQL 基于 max_connections 的值直接调整某些资源的大小。增加其值会导致分配更多这些资源,包括共享内存。

当运行备用服务器时,必须将此参数设置为与主服务器相同或更高的值。否则,备用服务器中将不允许查询。

reserved_connections (integer) #

确定为具有 pg_use_reserved_connections 角色的权限的角色保留的连接插槽的数量。当空闲连接插槽的数量大于 superuser_reserved_connections 但小于或等于 superuser_reserved_connectionsreserved_connections 之和时,新连接将仅接受超级用户和具有 pg_use_reserved_connections 权限的角色的连接。如果可用连接插槽少于或等于 superuser_reserved_connections,则新连接将仅接受超级用户的连接。

默认值为零个连接。该值必须小于 max_connections 减去 superuser_reserved_connections。此参数只能在服务器启动时设置。

superuser_reserved_connections (integer) #

确定为 PostgreSQL 超级用户的连接保留的连接插槽的数量。最多可以同时激活 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 的普通文件。这两个文件都不应手动删除。对于抽象命名空间中的套接字,不会创建锁文件。

unix_socket_group (string) #

设置 Unix 域套接字的所有者组。(套接字的所有者用户始终是启动服务器的用户。)与参数 unix_socket_permissions 结合使用,这可以用作 Unix 域连接的附加访问控制机制。默认情况下,这是空字符串,它使用服务器用户的默认组。此参数只能在服务器启动时设置。

此参数在 Windows 上不受支持。任何设置都将被忽略。此外,抽象命名空间中的套接字没有文件所有者,因此在这种情况下,此设置也会被忽略。

unix_socket_permissions (integer) #

设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。参数值应为以 chmodumask 系统调用接受的格式指定的数字模式。(要使用常用的八进制格式,该数字必须以 0(零)开头。)

默认权限为 0777,表示任何人都可以连接。合理的替代方案是 0770(仅限用户和组,另请参见 unix_socket_group)和 0700(仅限用户)。(请注意,对于 Unix 域套接字,只有写入权限才重要,因此设置或撤销读取或执行权限没有意义。)

此访问控制机制独立于第 20 章中描述的机制。

此参数只能在服务器启动时设置。

此参数在某些系统上无关紧要,尤其是 Solaris 10 及更高版本,它们会完全忽略套接字权限。在那里,可以通过将 unix_socket_directories 指向搜索权限限制为所需受众的目录来实现类似的效果。

抽象命名空间中的套接字没有文件权限,因此在这种情况下,此设置也会被忽略。

bonjour (boolean) #

启用通过 Bonjour 广播服务器的存在。默认值为关闭。此参数只能在服务器启动时设置。

bonjour_name (string) #

指定 Bonjour 服务名称。如果此参数设置为空字符串 ''(默认值),则使用计算机名称。如果服务器在编译时未启用 Bonjour 支持,则忽略此参数。此参数只能在服务器启动时设置。

19.3.2. TCP 设置 #

tcp_keepalives_idle (integer) #

指定在没有网络活动的情况下,操作系统应向客户端发送 TCP keepalive 消息的时间量。如果此值在指定时没有单位,则默认为秒。值为 0(默认值)时,选择操作系统的默认值。在 Windows 上,将值设置为 0 会将此参数设置为 2 小时,因为 Windows 没有提供读取系统默认值的方法。此参数仅在支持 TCP_KEEPIDLE 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

tcp_keepalives_interval (integer) #

指定在未收到客户端确认的 TCP keepalive 消息应该被重新传输的时间量。如果此值在指定时没有单位,则默认为秒。值为 0(默认值)时,选择操作系统的默认值。在 Windows 上,将值设置为 0 会将此参数设置为 1 秒,因为 Windows 没有提供读取系统默认值的方法。此参数仅在支持 TCP_KEEPINTVL 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

tcp_keepalives_count (integer) #

指定在服务器与客户端的连接被视为断开之前,可以丢失的 TCP keepalive 消息的数量。值为 0(默认值)时,选择操作系统的默认值。此参数仅在支持 TCP_KEEPCNT 或等效套接字选项的系统(不包括 Windows)上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

tcp_user_timeout (integer) #

指定已传输的数据在 TCP 连接被强制关闭之前可能保持未确认状态的时间量。如果此值在指定时没有单位,则默认为毫秒。值为 0(默认值)时,选择操作系统的默认值。此参数仅在支持 TCP_USER_TIMEOUT 的系统(不包括 Windows)上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

client_connection_check_interval (integer) #

设置在运行查询时,可选检查客户端是否仍然连接的时间间隔。该检查通过轮询套接字执行,如果内核报告连接已关闭,则允许较长时间运行的查询更快地中止。

此选项依赖于 Linux、macOS、illumos 和 BSD 系列操作系统公开的内核事件,目前在其他系统上不可用。

如果指定的值没有单位,则默认为毫秒。默认值为 0,这会禁用连接检查。如果没有连接检查,则服务器仅在下次与套接字交互时(当它等待、接收或发送数据时)才会检测到连接丢失。

对于内核本身来说,为了在所有场景(包括网络故障)中可靠地并在已知的时间范围内检测到丢失的 TCP 连接,可能还需要调整操作系统的 TCP keepalive 设置,或 PostgreSQLtcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count 设置。

19.3.3. 身份验证 #

authentication_timeout (integer) #

完成客户端身份验证允许的最大时间量。如果潜在客户端在此时间段内未完成身份验证协议,则服务器将关闭连接。这可以防止挂起的客户端无限期地占用连接。如果此值在指定时没有单位,则默认为秒。默认值为一分钟 (1m)。此参数只能在 postgresql.conf 文件中或服务器命令行上设置。

password_encryption (enum) #

当在 CREATE ROLEALTER ROLE 中指定密码时,此参数确定用于加密密码的算法。可能的值为 scram-sha-256,它将使用 SCRAM-SHA-256 加密密码,以及 md5,它将密码存储为 MD5 哈希。默认值为 scram-sha-256

请注意,较旧的客户端可能缺少对 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 #

有关设置的更多信息,请参见第 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 rehashc_rehash 准备目录。有关详细信息,请参阅其文档。

使用此设置时,指定目录中的 CRL 会在连接时按需加载。新的 CRL 可以添加到目录中,并立即使用。这与 ssl_crl_file 不同,后者会导致文件中的 CRL 在服务器启动时或重新加载配置时加载。这两个设置可以一起使用。

ssl_key_file (string) #

指定包含 SSL 服务器私钥的文件名称。相对路径相对于数据目录。此参数只能在 postgresql.conf 文件中设置或在服务器命令行上设置。默认值为 server.key

ssl_ciphers (string) #

指定一个SSL密码套件列表,允许 SSL 连接使用。有关此设置的语法和支持值的列表,请参阅 OpenSSL 包中的 ciphers 手册页。只有使用 TLS 1.2 及更低版本的连接会受到影响。目前没有设置可以控制 TLS 1.3 连接使用的密码选择。默认值为 HIGH:MEDIUM:+3DES:!aNULL。除非您有特定的安全要求,否则默认值通常是一个合理的选择。

此参数只能在 postgresql.conf 文件中设置或在服务器命令行上设置。

默认值说明

HIGH #

使用来自 HIGH 组的密码的密码套件(例如,AES、Camellia、3DES)

MEDIUM #

使用来自 MEDIUM 组的密码的密码套件(例如,RC4、SEED)

+3DES #

OpenSSLHIGH 的默认顺序存在问题,因为它将 3DES 的排序高于 AES128。这是错误的,因为 3DES 提供的安全性低于 AES128,而且速度也慢得多。+3DES 会将其重新排序在所有其他 HIGHMEDIUM 密码之后。

!aNULL #

禁用不进行身份验证的匿名密码套件。此类密码套件容易受到中间人攻击,因此不应使用。

可用的密码套件详细信息在 OpenSSL 版本之间会有所不同。使用命令 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL' 查看当前安装的 OpenSSL 版本的实际详细信息。请注意,此列表在运行时根据服务器密钥类型进行筛选。

ssl_prefer_server_ciphers (boolean) #

指定是否使用服务器的 SSL 密码首选项,而不是客户端的。此参数只能在 postgresql.conf 文件中设置或在服务器命令行上设置。默认值为 on

9.4 之前的 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 协议版本。当前有效值为:TLSv1TLSv1.1TLSv1.2TLSv1.3OpenSSL 库的旧版本不支持所有值;如果选择不支持的设置,则会引发错误。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) #

指定包含用于所谓的临时 DH 系列 SSL 密码的 Diffie-Hellman 参数的文件名称。默认值为空,在这种情况下,使用编译到内部的默认 DH 参数。如果攻击者设法破解众所周知的编译到内部的 DH 参数,则使用自定义 DH 参数会减少暴露风险。您可以使用命令 openssl dhparam -out dhparams.pem 2048 创建自己的 DH 参数文件。

此参数只能在 postgresql.conf 文件中设置或在服务器命令行上设置。

ssl_passphrase_command (string) #

设置在需要获取用于解密 SSL 文件(如私钥)的密码时要调用的外部命令。默认情况下,此参数为空,这意味着使用内置的提示机制。

该命令必须将密码打印到标准输出并以代码 0 退出。在参数值中,%p 将替换为提示字符串。(为字面 % 写入 %%。)请注意,提示字符串可能包含空格,因此请务必充分引用。如果存在,则从输出末尾删除单个换行符。

该命令实际上不必提示用户输入密码。它可以从文件中读取,从密钥链工具获取或类似方式。用户有责任确保所选机制足够安全。

此参数只能在 postgresql.conf 文件中设置或在服务器命令行上设置。

ssl_passphrase_command_supports_reload (boolean) #

此参数确定如果密钥文件需要密码,是否也会在配置重新加载期间调用由 ssl_passphrase_command 设置的密码命令。如果此参数为 off(默认值),则在重新加载期间将忽略 ssl_passphrase_command,并且如果需要密码,则不会重新加载 SSL 配置。此设置适用于需要 TTY 进行提示的命令,该命令在服务器运行时可能不可用。如果密码是从文件获取的,例如,将此参数设置为 on 可能是合适的。

此参数只能在 postgresql.conf 文件中设置或在服务器命令行上设置。

提交更正

如果您发现文档中的任何内容不正确、与您对特定功能的体验不符或需要进一步澄清,请使用此表单报告文档问题。