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_connections与reserved_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 保留的连接槽耗尽之后,用于紧急情况的最后储备。默认值是 3 个连接。该值必须小于
max_connections减去reserved_connections。这个参数只能在服务器启动时设置。unix_socket_directories(string) #指定服务器用于监听来自客户端应用的连接的 Unix 域套接字目录。通过列出用逗号分隔的多个目录可以建立多个套接字。项之间的空白被忽略,如果你需要在名字中包括空白或逗号,在目录名周围放上双引号。一个空值指定在任何 Unix 域套接字上都不监听,在这种情况中只能使用 TCP/IP 套接字来连接到服务器。
以
@开头的值表示应在抽象命名空间中创建 Unix 域套接字(目前仅在 Linux 上支持)。在这种情况下,此值不指定一个“目录”,而是一个前缀,从中计算实际套接字名称的方式与文件系统命名空间相同。虽然抽象套接字名称前缀可以自由选择(因为它不是文件系统位置),但惯例上仍然使用类似文件系统的值,例如@/tmp。默认值通常是
/tmp,但可以在构建时更改。在 Windows 上,默认值为空,这意味着默认不会创建 Unix 域套接字。这个参数只能在服务器启动时设置。除了套接字文件本身(名为
.s.PGSQL.,其中nnnnnnnn是服务器的端口号),一个名为.s.PGSQL.的普通文件会在每一个nnnn.lockunix_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 域套接字而言,只有写权限起作用,因此设置或撤销读权限和执行权限没有意义。)此访问控制机制独立于第 20 章中描述的机制。
此参数只能在服务器启动时设置。
此参数对完全忽略套接字权限的系统无效,尤其是 Solaris(截至 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 设置,或 PostgreSQL 的 tcp_keepalives_idle、tcp_keepalives_interval 和 tcp_keepalives_count 设置。
19.3.3. 认证 #
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 加密的密码。详情参见第 20.5 节。
警告
对 MD5 加密密码的支持已弃用,并将在 PostgreSQL 的未来版本中移除。迁移到其他密码类型的详细信息见第 20.5 节。
scram_iterations(integer) #使用 SCRAM-SHA-256 加密密码时执行的计算迭代次数。默认值为
4096。更高的迭代次数可以对存储密码遭受暴力破解攻击提供额外保护,但也会使认证变慢。更改此值不会影响现有的 SCRAM-SHA-256 加密密码,因为迭代次数在加密时就已经固定。要利用更改后的值,必须设置新密码。注意
如果某个角色密码创建时使用的迭代次数,与
postgresql.conf文件或服务器命令行上指定的scram_iterations值不同,未认证用户便可通过观察服务器对连接尝试的响应差异,辨别该角色是否存在。如果你担心这一点,请确保创建所有角色密码时,scram_iterations都被设为postgresql.conf文件或服务器命令行中指定的值。md5_password_warnings(boolean) #控制在
CREATE ROLE或ALTER 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 节。krb_caseins_users(boolean) #设置是否应该以大小写不敏感的方式对待 GSSAPI 用户名。默认值是
off(大小写敏感)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。gss_accept_delegation(boolean) #设置是否接受客户端的 GSSAPI 委派。默认值为
off,表示不会接受客户端的凭证。将其改为on会使服务器接受客户端委派给它的凭证。此参数只能在postgresql.conf文件中或服务器命令行上设置。oauth_validator_libraries(string) #用于验证 OAuth 连接令牌的库。如果只提供一个验证器库,它将默认用于任何 OAuth 连接;否则,所有
oauthHBA 条目都必须显式设置一个从该列表中选取的validator。如果设置为空字符串(默认值),OAuth 连接将被拒绝。此参数只能在postgresql.conf文件中设置。验证器模块必须单独实现或获取;PostgreSQL 不提供任何默认实现。关于实现 OAuth 验证器的更多信息,请参见第 50 章。
19.3.4. SSL #
关于 SSL 的设置,参见第 18.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_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文件中或者服务器命令行上设置。默认值的解释:
可用的密码套件细节可能会随着 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 和 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 文档反馈表单.