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 期间确定),则可能更少。此参数只能在服务器启动时设置。
在运行备用服务器时,必须将此参数设置为与主服务器相同或更高的值。否则,备用服务器中将不允许查询。
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 保留的槽用尽后作为紧急情况下的最终储备。默认值为三个连接。该值必须小于
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
.lockunix_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 10 中的 Solaris)无关。在这些系统中,可以通过将
unix_socket_directories
指向对所需受众限制了搜索权限的目录来实现类似的效果。抽象命名空间中的套接字没有文件权限,因此在这种情况下也会忽略此设置。
bonjour
(boolean
) #启用通过 Bonjour 来宣传服务器的存在。默认情况下处于关闭状态。此参数只能在服务器启动时设置。
bonjour_name
(string
) #指定 Bonjour 服务名称。如果此参数设置为一个空字符串
''
(这是默认值),则使用计算机名称。如果服务器未使用 Bonjour 支持进行编译,则忽略此参数。此参数只能在服务器启动时设置。
20.3.2. TCP 设置#
tcp_keepalives_idle
(integer
) #指定在没有网络活动的情况下操作系统应向客户端发送 TCP 保活消息之前的时间量。如果未指定单位,则此值将以秒为单位。值为 0(默认值)将选择操作系统的默认值。在 Windows 上,将值设置为 0 会将此参数设置为 2 小时,因为 Windows 不提供读取系统默认值的方法。此参数仅在支持
TCP_KEEPIDLE
或等效套接字选项的系统上受支持,以及在 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。tcp_keepalives_interval
(integer
) #指定在客户端未确认的 TCP 保活消息应重新发送之前的时间量。如果未指定单位,则此值将以秒为单位。值为 0(默认值)将选择操作系统的默认值。在 Windows 上,将值设置为 0 会将此参数设置为 1 秒,因为 Windows 不提供读取系统默认值的方法。此参数仅在支持
TCP_KEEPINTVL
或等效套接字选项的系统上受支持,以及在 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。tcp_keepalives_count
(integer
) #指定在服务器与客户端的连接被视为失效之前可以丢失的 TCP 保活消息数量。值为 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 保活设置,或 PostgreSQL 的 tcp_keepalives_idle、tcp_keepalives_interval 和 tcp_keepalives_count 设置。
20.3.3. 身份验证#
authentication_timeout
(integer
) #完成客户端身份验证允许的最大时间量。如果准客户端未在此时间内完成身份验证协议,服务器将关闭连接。这可防止挂起的客户端无限期占用连接。如果未指定单位,则此值将作为秒数。默认值为一分钟 (
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 加密的密码。有关更多详细信息,请参阅 第 21.5 节。
scram_iterations
(integer
) #使用 SCRAM-SHA-256 加密密码时要执行的计算迭代次数。默认值为
4096
。较高的迭代次数可为存储的密码提供额外的暴力破解保护,但会使身份验证变慢。更改此值不会对使用 SCRAM-SHA-256 加密的现有密码产生影响,因为迭代次数在加密时是固定的。为了使用更改后的值,必须设置新密码。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
文件或服务器命令行中设置。gss_accept_delegation
(boolean
) #设置是否应从客户端接受 GSSAPI 委派。默认值为
off
,表示 不会 接受来自客户端的凭据。将其更改为on
将使服务器接受从客户端委派给它的凭据。此参数只能在postgresql.conf
文件或服务器命令行中设置。db_user_namespace
(boolean
) #此参数启用按数据库划分的用户名。默认情况下为关闭。此参数只能在
postgresql.conf
文件或服务器命令行中设置。如果启用此选项,则应将用户创建为
username@dbname
。当连接客户端传递username
时,@
和数据库名称将附加到用户名,服务器将查找该特定于数据库的用户名。请注意,当您在 SQL 环境中创建包含@
的名称的用户时,您需要引用用户名。启用此参数后,您仍然可以创建普通全局用户。只需在客户端中指定用户名时附加
@
,例如,joe@
。@
将在服务器查找用户名之前被删除。db_user_namespace
导致客户端和服务器的用户名表示形式不同。身份验证检查始终使用服务器的用户名进行,因此必须为服务器的用户名(而不是客户端的用户名)配置身份验证方法。由于md5
在客户端和服务器上都使用用户名作为盐,因此db_user_namespace
无法与md5
一起使用。注意
此功能旨在作为临时措施,直到找到完整的解决方案。届时,此选项将被删除。
20.3.4. SSL#
有关设置SSL的详细信息,请参见第 19.9 节。用于控制使用TLS协议进行传输加密的配置参数被命名为ssl
,这是出于历史原因,即使对SSL协议的支持已被弃用。在此上下文中,SSL与TLS可以互换使用。
ssl
(boolean
) #启用 连接。此参数只能在
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 连接使用的 密码套件列表。有关此设置的语法和受支持值的列表,请参阅 OpenSSL 包中的 ciphers 手册页。仅影响使用 TLS 版本 1.2 及更低版本的连接。目前没有控制 TLS 版本 1.3 连接使用的密码选择器的设置。默认值为
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 版本没有此设置,并且始终使用客户端的首选项。此设置主要用于与这些版本的向后兼容性。使用服务器的首选项通常更好,因为它更有可能使服务器得到适当配置。
ssl_ecdh_curve
(string
) #指定在 密钥交换中使用的曲线的名称。它需要得到所有连接客户端的支持。它不必与服务器的椭圆曲线密钥使用的曲线相同。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为prime256v1
。OpenSSL 中最常见曲线的名称为:
prime256v1
(NIST P-256)、secp384r1
(NIST P-384)、secp521r1
(NIST P-521)。可以使用命令openssl ecparam -list_curves
显示可用曲线的完整列表。不过,并非所有曲线都可以在 中使用。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
) #指定包含迪菲-赫尔曼参数的文件的名称,这些参数用于所谓的 SSL 密码套件的临时 DH 系列。默认值为空,在这种情况下,将使用编译时内置的默认 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
设置的密码命令在配置重新加载时是否也会被调用,如果密钥文件需要密码。如果此参数关闭(默认),则ssl_passphrase_command
将在重新加载期间被忽略,并且如果需要密码,则不会重新加载 SSL 配置。此设置适合于需要 TTY 来提示的命令,在服务器运行时可能不可用。例如,如果从文件中获取密码,则将此参数设置为开启可能合适。此参数只能在
postgresql.conf
文件或服务器命令行中设置。