↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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

20.3. 连接和认证 #

20.3.1. 连接设置 #

listen_addresses (string) #

指定服务器用于监听来自客户端应用程序的连接的 TCP/IP 地址。该值采用逗号分隔的主机名和/或数字 IP 地址的形式。特殊条目* 对应于所有可用的 IP 接口。条目 0.0.0.0 允许监听所有 IPv4 地址,::允许监听所有 IPv6 地址。如果列表为空,则服务器不会在任何 IP 接口上监听,此时只能使用 Unix 域套接字进行连接。如果列表不为空,则服务器将在至少一个 TCP/IP 地址上可以监听时启动。对于任何无法打开的 TCP/IP 地址,将发出警告。默认值为 localhost,仅允许进行本地 TCP/IP“回环”连接。

在客户端认证(第 21 章)允许对谁可以访问服务器进行细粒度控制的同时,listen_addresses 控制哪些接口接受连接尝试,这可以帮助防止在不安全的网络接口上重复恶意连接请求。此参数只能在服务器启动时设置。

port (integer) #

服务器监听的 TCP 端口,默认是 5432。请注意,服务器监听的所有 IP 地址都使用同一个端口号。此参数只能在服务器启动时设置。

max_connections (integer) #

决定数据库服务器允许的最大并发连接数。默认值通常是 100 个连接,但如果内核设置不支持(在 initdb 期间确定),则可能更少。这个参数只能在服务器启动时设置。

当运行一个备库时,你必须设置这个参数等于或大于主库上的参数。否则,备库上将不允许查询。

superuser_reserved_connections (integer) #

决定为 PostgreSQL 超级用户连接保留多少个连接“槽”。同时活跃的连接数最多始终只能达到 max_connections。当活跃并发连接数至少达到 max_connections 减去 superuser_reserved_connections 时,新连接将只接受超级用户,并且不再接受新的复制连接。

默认值是 3 个连接。该值必须小于 max_connections。这个参数只能在服务器启动时设置。

unix_socket_directories (string) #

指定服务器用于监听来自客户端应用的连接的 Unix 域套接字目录。通过列出用逗号分隔的多个目录可以建立多个套接字。项之间的空白被忽略,如果你需要在名字中包括空白或逗号,在目录名周围放上双引号。一个空值指定在任何 Unix 域套接字上都不监听,在这种情况中只能使用 TCP/IP 套接字来连接到服务器。

以 @ 开头的值表示应在抽象命名空间中创建 Unix 域套接字(目前仅在 Linux 上支持)。在这种情况下,此值不指定一个“目录”,而是一个前缀,从中计算实际套接字名称的方式与文件系统命名空间相同。虽然抽象套接字名称前缀可以自由选择(因为它不是文件系统位置),但惯例上仍然使用类似文件系统的值,例如 @/tmp。

默认值通常是 /tmp,但可以在构建时更改。在 Windows 上,默认值为空,这意味着默认不会创建 Unix 域套接字。这个参数只能在服务器启动时设置。

除了套接字文件本身(名为.s.PGSQL.nnnn,其中 nnnn 是服务器的端口号),一个名为.s.PGSQL.nnnn.lock 的普通文件会在每一个 unix_socket_directories 目录中被创建。任何一个都不应该被手工移除。对于抽象命名空间,没有锁文件被建立。

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 域套接字而言,只有写权限起作用,因此设置或撤销读权限和执行权限没有意义。)

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

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

此参数对完全忽略套接字权限的系统无效,尤其是 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 连接丢失,可能还需要调整操作系统的 TCP keepalive 设置,或 PostgreSQL 的 tcp_keepalives_idle、tcp_keepalives_interval 和 tcp_keepalives_count 设置。

20.3.2. 认证 #

authentication_timeout (integer) #

允许完成客户端认证的最长时间。如果一个客户端没有在这段时间里完成认证协议,服务器将关闭连接。这样就避免了出问题的客户端无限制地占有一个连接。如果指定值时没有单位,则以秒为单位。默认值是 1 分钟(1m)。这个参数只能在服务器命令行上或者在 postgresql.conf 文件中设置。

password_encryption (enum) #

当在 CREATE ROLE 或 ALTER ROLE 中指定密码时,该参数决定用于加密密码的算法。可能的值有 scram-sha-256,即使用 SCRAM-SHA-256 加密密码,以及 md5,即将密码存储为 MD5 hash。默认值为 scram-sha-256。

请注意,较旧的客户端可能缺少对 SCRAM 认证机制的支持,因此无法使用以 SCRAM-SHA-256 加密的密码。详情参见第 21.5 节。

krb_server_keyfile (string) #

设置服务器的 Kerberos 密钥文件的位置。默认为 FILE:/usr/local/pgsql/etc/krb5.keytab(其中目录部分是在构建时由 sysconfdir 指定的;可用 pg_config --sysconfdir 来确定该目录)。如果这个参数被设为空字符串,它将被忽略,并使用随系统而异的默认值。这个参数只能在 postgresql.conf 文件中或者服务器命令行上设置。详情请参考第 21.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 一起使用。

注意

此特性旨在作为找到完整解决方案之前的临时措施。届时将移除此选项。

20.3.3. SSL #

关于 SSL 的设置,参见第 19.9 节。虽然对 SSL 协议的支持已被弃用,但由于历史原因,用于控制 TLS 协议传输加密的配置参数仍以 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 包中的 ciphers 手册页。只有使用 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 9.4 之前的版本没有此设置,始终采用客户端的优先顺序。此设置主要用于与这些旧版本保持向后兼容。采用服务器的优先顺序通常更好,因为服务器更可能得到适当配置。

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) #

指定包含 Diffie-Hellman 参数的文件名,这些参数用于所谓临时 DH 系列的 SSL 密码套件。默认值为空,此时使用编译时内置的默认 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。

在 Windows 上运行时,必须将此参数设为 on,因为该平台的进程模型不同,每个连接都会执行配置重载。

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

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.