19.3. 连接和身份验证

19 .3.1. 连接设定

  • listen_addresses ( string )

    • 指定服务器用于侦听来自 Client 端应用程序的连接的 TCP/IP 地址。该值采用主机名和/或数字 IP 地址的逗号分隔列表的形式。特殊条目*对应于所有可用的 IP 接口。条目0.0.0.0允许侦听所有 IPv4 地址,而::允许侦听所有 IPv6 地址。如果列表为空,则服务器根本不监听任何 IP 接口,在这种情况下,只能使用 Unix 域套接字连接。默认值为 localhost,它仅允许构建本地 TCP/IP“环回”连接。Client 端身份验证(Chapter 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 )
    • 指定服务器要在其上侦听来自 Client 端应用程序的连接的 Unix 域套接字的目录。可以通过列出用逗号分隔的多个目录来创建多个套接字。条目之间的空格将被忽略;如果您需要在名称中包含空格或逗号,请在目录名称两边加上双引号。空值表示不侦听任何 Unix 域套接字,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。默认值通常为/tmp,但可以在构建时更改。该参数只能在服务器启动时设置。

除了名为.s.PGSQL.nnnn的套接字文件本身(其中* nnnn *是服务器的端口号)之外,还将在每个unix_socket_directories目录中创建一个名为.s.PGSQL.nnnn.lock的普通文件。都不应该手动删除这两个文件。

在没有 Unix 域套接字的 Windows 上,此参数无关。

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

在没有 Unix 域套接字的 Windows 上,此参数无关。

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

默认权限为0777,这意味着任何人都可以连接。合理的替代方法是0770(仅用于用户和组,另请参见unix_socket_group)和0700(仅用于用户)。 (请注意,对于 Unix 域套接字,仅写权限很重要,因此设置或撤消读或执行权限毫无意义.)

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

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

此参数与完全忽略套接字许可权的系统(尤其是 Solaris 10 或更高版本的 Solaris)无关。在那里,通过将unix_socket_directories指向搜索权限仅限于所需受众的目录,可以达到类似的效果。在没有 Unix 域套接字的 Windows 上,该参数也无关紧要。

  • bonjour ( boolean )

    • 通过 Bonjour 启用广告服务器的存在。默认为关闭。该参数只能在服务器启动时设置。
  • bonjour_name ( string )

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

    • 指定不活动的秒数,在此之后,TCP 应该向 Client 端发送保持活动消息。值 0 使用系统默认值。仅在支持TCP_KEEPIDLE或等效套接字选项的系统以及 Windows 上才支持此参数。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

Note

在 Windows 上,值 0 将将此参数设置为 2 小时,因为 Windows 没有提供读取系统默认值的方法。

  • tcp_keepalives_interval ( integer )
    • 指定秒数,在此秒数之后,Client 端未确认的 TCP keepalive 消息应重新传输。值 0 使用系统默认值。仅在支持TCP_KEEPINTVL或等效套接字选项的系统以及 Windows 上才支持此参数。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

Note

在 Windows 上,值 0 将将此参数设置为 1 秒,因为 Windows 没有提供读取系统默认值的方法。

  • tcp_keepalives_count ( integer )
    • 指定在服务器与 Client 端的连接被视为无效之前可以丢失的 TCP keepalive 数量。值 0 使用系统默认值。仅在支持TCP_KEEPCNT或等效套接字选项的系统上支持此参数。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。

Note

Windows 不支持此参数,并且必须为零。

19.3.2. Authentication

  • authentication_timeout ( integer )

    • 完成 Client 端身份验证的最长时间,以秒为单位。如果准 Client 在这段时间内没有完成身份验证协议,则服务器将关闭连接。这样可以防止挂起的 Client 端无限期占用连接。默认值为一分钟(1m)。只能在postgresql.conf文件或服务器命令行中设置此参数。
  • password_encryption ( enum )

    • CREATE ROLEALTER ROLE中指定密码后,此参数确定用于加密密码的算法。默认值为md5,它将密码存储为 MD5 哈希(也接受on作为md5的别名)。将此参数设置为scram-sha-256将使用 SCRAM-SHA-256 加密密码。

请注意,较旧的 Client 端可能缺乏对 SCRAM 身份验证机制的支持,因此不适用于使用 SCRAM-SHA-256 加密的密码。有关更多详细信息,请参见Section 20.5

  • krb_server_keyfile ( string )

    • 设置 Kerberos 服务器密钥文件的位置。有关详情,请参见Section 20.6。只能在postgresql.conf文件或服务器命令行中设置此参数。
  • krb_caseins_users ( boolean )

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

    • 此参数启用每个数据库的用户名。默认情况下它是关闭的。此参数只能在postgresql.conf文件或服务器命令行中设置。

如果启用,则应将用户创建为* username@dbname 。当连接的 Client 端传递 username *时,@和数据库名称将附加到用户名上,并且服务器将查找该特定于数据库的用户名。请注意,在 SQL 环境中创建名称包含@的用户时,将需要用引号引起来。

启用此参数后,您仍然可以创建普通的全局用户。在 Client 端中指定用户名时,只需添加@即可,例如joe@。在服务器查找用户名之前,@将被删除。

db_user_namespace导致 Client 端和服务器的用户名表示形式不同。身份验证检查始终使用服务器的用户名进行,因此必须为服务器的用户名(而不是 Client 端的用户名)配置身份验证方法。由于md5在 Client 端和服务器上都使用用户名作为盐,因此md5不能与db_user_namespace一起使用。

Note

在找到完整的解决方案之前,此功能仅用作临时措施。届时,该选项将被删除。

19.3.3. SSL

有关设置 SSL 的更多信息,请参见Section 18.9

  • ssl ( boolean )

    • 启用 SSL 连接。此参数只能在postgresql.conf文件或服务器命令行中设置。默认值为off
  • ssl_ca_file ( string )

    • 指定包含 SSL 服务器证书颁发机构(CA)的文件的名称。相对路径是相对于数据目录的。此参数只能在postgresql.conf文件或服务器命令行中设置。默认值为空,表示未加载 CA 文件,并且不执行 Client 端证书验证。
  • ssl_cert_file ( string )

    • 指定包含 SSL 服务器证书的文件的名称。相对路径是相对于数据目录的。此参数只能在postgresql.conf文件或服务器命令行中设置。默认值为server.crt
  • ssl_crl_file ( string )

    • 指定包含 SSL 服务器证书吊销列表(CRL)的文件的名称。相对路径是相对于数据目录的。此参数只能在postgresql.conf文件或服务器命令行中设置。默认为空,表示未加载任何 CRL 文件。
  • ssl_key_file ( string )

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

    • 指定允许在安全连接上使用的 SSL 密码套件的列表。有关此设置的语法和支持的值的列表,请参见 OpenSSL 软件包中的密码手册页。此参数只能在postgresql.conf文件或服务器命令行中设置。默认值为HIGH:MEDIUM:+3DES:!aNULL。除非您有特定的安全要求,否则默认值通常是一个合理的选择。

默认值的说明:

  • HIGH

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

    • MEDIUM

      • 使用MEDIUM组密码的密码套件(例如 RC4,SEED)
    • +3DES

      • HIGH的 OpenSSL 默认 Sequences 有问题,因为它的 Sequences 比 AES128 高 3DES。这是错误的,因为 3DES 提供的安全性低于 AES128,并且速度也慢得多。 +3DES对所有其他HIGHMEDIUM密码重新排序。
    • !aNULL

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

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

  • ssl_prefer_server_ciphers ( boolean )
    • 指定是否使用服务器的 SSL 密码首选项而不是 Client 端的 SSL 密码首选项。此参数只能在postgresql.conf文件或服务器命令行中设置。默认值为true

较早的 PostgreSQL 版本没有此设置,并且始终使用 Client 端的首选项。此设置主要是为了与这些版本向后兼容。通常,使用服务器的首选项会更好,因为更可能是正确配置了服务器。

  • ssl_ecdh_curve ( string )
    • 指定在 ECDH 密钥交换中使用的曲线的名称。所有连接的 Client 端都需要支持它。它不必与服务器的“椭圆曲线”键使用的曲线相同。此参数只能在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 )
    • 指定包含用于 Diffie-Hellman 参数的文件的名称,这些参数用于所谓的短暂 DH 系列 SSL 密码。默认值为空,在这种情况下,将使用已编译的默认 DH 参数。如果攻击者设法破解众所周知的内置 DH 参数,则使用自定义 DH 参数可以减少暴露。您可以使用命令openssl dhparam -out dhparams.pem 2048创建自己的 DH 参数文件。

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

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

该命令必须将密码短语打印到标准输出,并以代码 0 退出。在参数值中,%p替换为提示字符串。 (将_写入 Literals%.)请注意,提示字符串可能包含空格,因此请确保正确引用。如果存在,将从输出的末尾除去一条换行符。

该命令实际上不必提示用户 Importing 密码。它可以从文件中读取它,也可以从钥匙串工具中获得它,或类似的东西。用户应确保所选的机制足够安全。

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

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

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