listen_addresses (string)
#
指定数据库服务器用于监听来自客户端网络连接的 TCP/IP 物理 IP 地址。值以逗号分隔的主机名和/或数字 IP 地址列表形式呈现。特殊条目 * 对应所有可用网络接口。若列表为空,服务器将完全不监听任何 IP 接口,此时仅能通过本地 Unix 域套接字连接服务器。默认值为 localhost,仅允许本地回路 TCP 连接。该参数只能在服务器启动时设置。
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_connections 与 reserved_connections 之和时,系统将仅接受来自超级用户以及拥有 pg_use_reserved_connections 权限角色的新连接请求。如果可用连接槽位数小于或等于 superuser_reserved_connections,则仅接受超级用户的连接。
默认值为 0 个连接。该值必须小于 max_connections 减去 superuser_reserved_connections 的差值。该参数只能在服务器启动时设置。
superuser_reserved_connections
(integer)
#
决定为 PostgreSQL 超级用户预留的连接“槽位”数量。系统允许同时处于活跃状态的连接数最多为 max_connections。每当活跃并发连接数达到 max_connections 减去 superuser_reserved_connections 时,系统将仅接受超级用户的新连接请求。该参数预留的连接槽位旨在作为 reserved_connections 槽位耗尽后用于紧急故障排查的最终保障通道。
默认值为 3 个连接。该值必须小于 max_connections 减去 reserved_connections 的差值。该参数只能在服务器启动时设置。
unix_socket_directories (string)
#指定服务器用于监听来自客户端应用程序连接的 Unix 域套接字(Unix-domain socket)所在的物理目录。可以通过列出以逗号分隔的多个目录来创建多个套接字。目录条目之间的空白字符会被自动忽略;若目录名称本身包含空格或逗号,请用双引号将其括起来。若值为空,表示不监听任何 Unix 域套接字,此时仅能通过 TCP/IP 网络连接服务器。
以 @ 开头的值表示应在抽象命名空间中创建 Unix 域套接字(目前仅在 Linux 上受支持)。在这种情况下,该值指定的不是物理“目录”,而是按与文件系统命名空间相同规则计算实际套接字名称的前缀。尽管由于它不是文件系统物理路径因而可以任意命名,但通常惯例依然使用类似文件系统路径的形式(如 @/tmp)。
默认值通常为 /tmp,但在编译源码时可以更改。在 Windows 系统上默认值为空,即默认不创建 Unix 域套接字。该参数只能在服务器启动时设置。
除了名为 .s.PGSQL.(其中 nnnnnnnn 为服务器端口号)的套接字文件本身之外,系统还会在每个 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 域套接字,只有写权限才是连接判定标准,因此设置或撤销读权限、执行权限并无实际意义)。
该文件系统访问控制机制完全独立于 Chapter 20 中描述的身份认证机制。
该参数只能在服务器启动时设置。
在完全忽略套接字文件权限的操作系统(尤其是 Solaris 10 及更新版本)上,该参数无效。在这些系统上,可以通过将 unix_socket_directories 指向一个目录搜索权限受严格限制的专用物理目录来达成类似的安全控制效果。
抽象命名空间中的套接字不存在文件系统权限概念,因此在此情况下该设置同样会被忽略。
bonjour (boolean)
#允许通过 Bonjour 广播当前数据库服务器的局域网存在。默认值为关闭(off)。该参数只能在服务器启动时设置。
bonjour_name (string)
#
指定 Bonjour 广播服务名称。如果该参数设置为空字符串 ''(默认设置),则直接使用计算机的主机名。如果服务器在编译时未开启 Bonjour 支持,该参数将被忽略。该参数只能在服务器启动时设置。
tcp_keepalives_idle (integer)
#
指定在网络无活动状态持续多久后,操作系统应向客户端发送 TCP 保活(Keepalive)探测报文。若指定该值时不带单位,则按秒计算。值为 0(默认值)表示使用操作系统的系统默认配置。在 Windows 上,由于系统未提供读取系统默认值的接口,将值设置为 0 会将该参数设定为 2 小时。该参数仅在支持 TCP_KEEPIDLE 或等价套接字选项的系统以及 Windows 上受支持;在其他系统上该值必须为 0。在通过 Unix 域套接字建立的会话中,该参数被忽略且读取值始终为 0。
tcp_keepalives_interval (integer)
#
指定未收到客户端确认的 TCP 保活探测报文在重传前的等待间隔时间。若指定该值时不带单位,则按秒计算。值为 0(默认值)表示使用操作系统的系统默认配置。在 Windows 上,将其设置为 0 会设定为 1 秒。该参数仅在支持 TCP_KEEPINTVL 或等价套接字选项的系统以及 Windows 上受支持;在其他系统上必须为 0。在 Unix 域套接字会话中,该参数被忽略且读取值始终为 0。
tcp_keepalives_count (integer)
#
指定在认为服务器与客户端的网络连接已断开前,允许丢失的 TCP 保活探测报文次数。值为 0(默认值)表示使用操作系统的系统默认配置。该参数仅在支持 TCP_KEEPCNT 或等价套接字选项的系统上受支持(不包括 Windows);在其他系统上必须为 0。在 Unix 域套接字连接中,该参数被忽略且读取值始终为 0。
tcp_user_timeout (integer)
#
指定已传输的数据在允许保持未确认状态的最长时间,超时后 TCP 连接将被强制关闭。若指定该值时不带单位,则按毫秒计算。值为 0(默认值)表示采用操作系统默认配置。该参数仅在支持 TCP_USER_TIMEOUT 的系统上受支持(不包括 Windows);在其他系统上必须为 0。在 Unix 域套接字连接中,该参数被忽略且读取值始终为 0。
client_connection_check_interval (integer)
#设置在执行查询期间,定期检查客户端是否仍保持连接的轮询时间间隔。该检查通过轮询套接字状态实现;若操作系统内核报告底层连接已关闭,这能够让长时间运行的查询更快中止,从而避免资源浪费。
该选项依赖 Linux、macOS、illumos 以及 BSD 家族操作系统暴露的内核事件,目前在其他操作系统上不可用。
若指定该值时不带单位,则按毫秒计算。默认值为 0,表示禁用运行中连接探测。若禁用此项检查,服务器仅在下一次与套接字发生实际数据交互(等待、接收或发送数据)时才能察觉连接已丢失。
为了使操作系统内核在包括物理断网在内的所有网络异常场景中,均能在已知的时间窗口内可靠检测到丢失的 TCP 连接,可能还需要配合调优操作系统的 TCP 保活参数,或者配置 PostgreSQL 的 tcp_keepalives_idle、tcp_keepalives_interval 和 tcp_keepalives_count 参数。
authentication_timeout (integer)
#
允许完成客户端身份认证的最长时间。如果在该时间内拟连接的客户端仍未完成身份认证握手协议,服务器将直接关闭该连接。这可有效防止挂起的死连接无限期占用宝贵的连接槽位。若指定该值时不带单位,则按秒计算。默认值为 1 分钟(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 加密的密码进行连接。更多技术细节请参阅 Section 20.3.2。
对 MD5 加密密码的支持已被废弃,并将在未来的 PostgreSQL 版本中彻底移除。关于如何迁移至其他现代安全密码类型的指导,请参阅 Section 20.3.2。
scram_iterations (integer)
#
使用 SCRAM-SHA-256 加密密码时执行的哈希迭代计算轮数。默认值为 4096。更高的迭代轮数可针对存储密码的暴力破解攻击提供更强的安全防护,但会导致身份认证握手延迟增加。修改该参数值对已使用 SCRAM-SHA-256 加密的现有旧密码没有任何影响,因为迭代轮数在密码首次加密计算时便已固定。若要使用新的迭代轮数,必须重新设置新密码。
如果某个角色的密码在创建时所使用的迭代轮数与 postgresql.conf 或命令行中当前配置的 scram_iterations 不一致,未经身份验证的外部用户可能会通过观察连接尝试时服务器响应的细微时间差异来推断该角色的存在性。如果担忧这一侧信道风险,请确保所有角色密码在创建时均统一采用与当前配置一致的 scram_iterations 值。
md5_password_warnings (boolean)
#
控制当 CREATE ROLE 或 ALTER ROLE 语句设置 MD5 加密密码时,是否向客户端发出关于 MD5 密码已废弃的 WARNING 警告日志。默认值为 on。
krb_server_keyfile (string)
#
设置服务端 Kerberos 密钥文件(keytab)的物理路径。默认值为 FILE:/usr/local/pgsql/etc/krb5.keytab(其中目录部分对应编译时指定的 sysconfdir 路径;可通过 pg_config --sysconfdir 查看)。如果该参数设置为空字符串,该设置将被忽略并采用依赖于操作系统的系统默认路径。该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。更多信息请参阅 Section 20.3.3。
krb_caseins_users (boolean)
#
设置在处理 GSSAPI 用户名时是否忽略大小写。默认值为 off(严格区分大小写)。该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。
gss_accept_delegation (boolean)
#
设置是否接受来自客户端的 GSSAPI 凭据委托(Delegation)。默认值为 off,表示不接受客户端委托的凭据。将此值修改为 on 将允许服务器接受客户端委托给它的安全凭据。该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。
oauth_validator_libraries (string)
#
用于验证 OAuth 连接令牌(Token)的动态库列表。如果仅提供了一个验证器库,它将作为所有 OAuth 连接的默认验证器;否则,所有 oauth HBA 条目 都必须从此列表中显式指定一个具体的 validator。如果设置为空字符串(默认值),所有 OAuth 连接都将被拒绝。该参数只能在 postgresql.conf 文件中设置。
OAuth 验证器模块必须单独实现或获取;PostgreSQL 本身并不随附任何默认的验证器实现。有关如何开发实现自定义 OAuth 验证器的更多信息,请参阅 Chapter 50。
有关配置 SSL 的更多信息,请参阅 Section 18.9。出于历史原因,用于控制使用 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 进行哈希索引预处理。技术细节请参阅 OpenSSL 官方文档。
当使用此项设置时,指定目录中的 CRL 会在客户端建立连接时按需动态加载。向该目录中新增 CRL 文件后会立即可见生效。这与 ssl_crl_file 不同(后者仅在服务器启动或重新加载配置时读取文件)。这两个配置参数可以协同结合使用。
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 #
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 9.4 之前的版本没有该设置,始终采用客户端偏好。引入该配置主要是为了与旧版保持兼容。优先采用服务端偏好通常更佳,因为服务端往往能得到更专业、更安全的配置维护。
ssl_groups (string)
#
指定用于 TLS 密钥交换的命名组(椭圆曲线群)。它需要得到所有发起连接的客户端的支持。可以通过冒号分隔的列表指定多个群组。它不必与服务端证书所使用的密钥类型一致。该参数只能在 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 协议版本。目前合法取值为:TLSv1、TLSv1.1、TLSv1.2、TLSv1.3。旧版 OpenSSL 库可能不支持所有这些值;若选用了不受支持的协议设置,系统将抛出错误。早于 TLS 1.0 的旧协议(即 SSL 2.0 和 SSL 3.0)始终处于强制禁用状态。
默认值为 TLSv1.2,符合行业通行的安全最佳实践。
该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。
ssl_max_protocol_version (enum)
#设置允许使用的最高 SSL/TLS 协议版本。合法取值与 ssl_min_protocol_version 相同,此外还支持空字符串,表示允许任何受支持的协议版本(默认即允许任何版本)。设置最高协议版本主要用于测试目的,或者在某些客户端组件与新版协议存在兼容性缺陷时进行强制降级。
该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。
ssl_dh_params_file (string)
#
指定包含用于临时 Diffie-Hellman(EDH/DHE)系列 SSL 密码算法的 Diffie-Hellman 参数文件的文件名。默认值为空,此时使用编译内嵌的默认 DH 参数。使用自定义 DH 参数可以显著降低攻击者破解已知公开内嵌 DH 参数所带来的安全风险。可以使用命令 openssl dhparam -out dhparams.pem 2048 创建您自己的专用 DH 参数文件。
该参数只能在 postgresql.conf 文件中或在服务器命令行中设置。
ssl_passphrase_command (string)
#设置当需要获取用于解密 SSL 证书私钥等文件的密码口令时调用的外部命令。默认情况下该参数为空,表示使用内置的终端交互式提示输入机制。
该外部命令必须将解密口令打印输出到标准输出(stdout)并以退出码 0 正常退出。在参数值中,%p 会被替换为提示字符串(若要表示字面量百分号请书写为 %%)。请注意提示字符串通常包含空格,因此请务必进行充分的引号转义。输出末尾的单个换行符会被自动剥除。
该命令实际上不必在交互式终端向人工提示输入密码。它可以从安全文件中读取口令,或从操作系统的密钥链(Keychain/KMS)设施中获取。确保所选安全获取机制具有足够的保密性由管理员自行负责。
这个参数只能在 postgresql.conf
文件中或服务器命令行上设置。
ssl_passphrase_command_supports_reload (boolean)
#
该参数决定在重新加载配置文件期间,如果密钥文件需要密码,是否同样调用由 ssl_passphrase_command 设置的密码获取命令。如果该参数为 off(默认值),则在配置重载期间将忽略 ssl_passphrase_command,若私钥需要密码则不会重新加载 SSL 配置。这种默认策略适用于需要 TTY 交互终端的命令(因为在后台服务运行期间可能没有终端可用)。如果密码是从本地文件或密钥管理器自动获取的,则将此参数设置为 on 是适宜的。
在 Windows 平台上运行时该参数必须设置为 on,因为该平台独特的进程架构模型会导致所有新连接都执行一次配置重载。
这个参数只能在 postgresql.conf
文件中或服务器命令行上设置。