2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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 之后的 Solaris)上无关紧要。在那里,可以通过将 unix_socket_directories 指向具有受限搜索权限的目录来实现类似效果。

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

bonjour (boolean) #

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

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. 密码认证

警告

MD5 加密密码的支持已弃用,将在 PostgreSQL 的未来版本中移除。有关迁移到其他密码类型的详细信息,请参阅第 20.5 节

scram_iterations (integer) #

使用 SCRAM-SHA-256 加密密码时执行的计算迭代次数。默认值为 4096。较高的迭代次数可提供额外的保护,防止存储密码遭受暴力破解攻击,但会使认证变慢。更改此值不会影响使用 SCRAM-SHA-256 加密的现有密码,因为迭代次数在加密时固定。为了利用更改后的值,必须设置新密码。

md5_password_warnings (boolean) #

控制当 CREATE ROLEALTER ROLE 语句设置 MD5 加密密码时,是否会生成有关 MD5 密码弃用的 WARNING。默认值为 on

krb_server_keyfile (string) #

设置服务器的 Kerberos 密钥文件位置。默认值为 FILE:/usr/local/pgsql/etc/krb5.keytab(其中目录部分是构建时指定的 sysconfdir;使用 pg_config --sysconfdir 来确定)。如果此参数设置为空字符串,则忽略它,并使用系统相关的默认值。此参数只能在 postgresql.conf 文件或服务器命令行中设置。有关更多信息,请参见 20.6. GSSAPI 认证

krb_caseins_users (boolean) #

设置 GSSAPI 用户名是否应被视为不区分大小写。默认值为 off(区分大小写)。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

gss_accept_delegation (boolean) #

设置是否应从客户端接受 GSSAPI 代理。默认值为 off,表示客户端的凭据将 被接受。将其更改为 on 将使服务器接受从客户端代理给它的凭据。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

oauth_validator_libraries (string) #

用于验证 OAuth 连接令牌的库。如果只提供一个验证器库,它将默认用于任何 OAuth 连接;否则,所有 oauth HBA 条目 都必须显式设置一个从该列表中选择的 validator。如果设置为(默认的)空字符串,OAuth 连接将被拒绝。此参数只能在 postgresql.conf 文件中设置。

验证器模块必须单独实现/获取;PostgreSQL 不提供任何默认实现。有关实现 OAuth 验证器的更多信息,请参见 第 50 章

19.3.4. SSL #

有关设置的信息,请参见 18.9. 使用 SSL 进行安全 TCP/IP 连接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_tls13_ciphers (string) #

指定允许使用TLS版本 1.3 的连接使用的密码套件列表。可以使用冒号分隔的列表指定多个密码套件。如果留空,将使用 OpenSSL 的默认密码套件集。

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

ssl_ciphers (string) #

指定允许使用 TLS 版本 1.2 及更低版本进行连接的SSL密码列表,对于 TLS 版本 1.3 连接,请参阅 ssl_tls13_ciphers。有关此设置的语法和支持值的列表,请参阅 OpenSSL 包中的 ciphers 手册页。默认值为 HIGH:MEDIUM:+3DES:!aNULL。除非您有特定的安全要求,否则默认值通常是一个合理的选择。

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

默认值的解释

HIGH #

使用 HIGH 组中的密码(例如 AES、Camellia、3DES)的密码套件。

MEDIUM #

使用 MEDIUM 组中的密码(例如 RC4、SEED)的密码套件。

+3DES #

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

!aNULL #

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

可用的密码套件详细信息将因 OpenSSL 版本而异。使用命令 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL' 查看当前安装的 OpenSSL 版本的实际详细信息。请注意,此列表将在运行时根据服务器密钥类型进行过滤。

ssl_prefer_server_ciphers (boolean) #

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

PostgreSQL 9.4 之前的版本没有此设置,并且始终使用客户端的首选项。使用服务器的首选项通常更好,因为服务器更有可能经过适当配置。

ssl_groups (string) #

指定在ECDH密钥交换中使用的曲线的名称。它需要被所有连接的客户端支持。可以使用冒号分隔的列表指定多条曲线。它不需要与服务器的椭圆曲线密钥使用的曲线相同。此参数只能在 postgresql.conf 文件或服务器命令行中设置。默认值为 X25519:prime256v1

OpenSSL 中最常见曲线的名称是:prime256v1 (NIST P-256)、secp384r1 (NIST P-384)、secp521r1 (NIST P-521)。可以使用命令 openssl ecparam -list_curves 显示可用组的不完整列表。并非所有这些组都可用于TLS,并且许多支持的组名称和别名已被省略。

PostgreSQL 18.0 之前的版本中,此设置名为 ssl_ecdh_curve,并且只接受单个值。

ssl_min_protocol_version (enum) #

设置要使用的最低 SSL/TLS 协议版本。当前有效值包括:TLSv1TLSv1.1TLSv1.2TLSv1.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) #

指定包含用于所谓的临时 DH 密码族的 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 进行提示的命令,因为在服务器运行时可能无法获得 TTY。将此参数设置为 on 可能适用于从文件获取密码等情况。

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

提交更正

如果您在文档中看到任何不正确的内容,与您使用特定功能的经验不符,或者需要进一步的解释,请使用 此表单 来报告文档问题。