Postgresql 中文操作指南

20.3. Connections and Authentication #

20.3.1. Connection Settings #

  • listen_addresses (string) #

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

    • 虽然客户端认证 ( Chapter 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_connectionsreserved_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 上,默认值为 null,这意味着默认情况下不创建 Unix 域套接字。此参数只能在服务器启动时设置。

    • 除命名为 .s.PGSQL._nnnn_ 的套接字文件外(其中 nnnn 是服务器的端口号),将在每个 unix_socket_directories 目录中创建一个名为 .s.PGSQL._nnnn .lock_ 的普通文件。切勿手动删除这两个文件。对于抽象命名空间中的套接字,不会创建锁定文件。

  • unix_socket_group (string) #

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

    • 此参数在 Windows 上不受支持。将忽略任何设置。此外,抽象命名空间中的套接字没有文件所有者,因此在这种情况下也将忽略此设置。

  • unix_socket_permissions (integer) #

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

    • 默认权限是 0777,这意味着每个人都可以连接。合理的替代方案是 0770(仅用户和组,另请参见 unix_socket_group)和 0700(仅用户)。(请注意,对于 Unix 域套接字,只有写权限才有意义,因此设置或撤销读取或执行权限毫无意义。)

    • 此访问控制机制独立于 Chapter 21 中描述的那个机制。

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

    • 此参数在完全忽略套接字权限的系统上无关紧要,特别是 Solaris 10 中的 Solaris。在那里,可以通过使 unix_socket_directories 指向搜索权限仅限于所需受众的目录来获得类似的效果。

    • 抽象命名空间中的套接字没有文件权限,因此在这种情况下也将忽略此设置。

  • bonjour (boolean) #

    • 允许通过 Bonjour 宣传服务器的存在。默认为关闭。此参数只能在服务器启动时设置。

  • bonjour_name (string) #

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

20.3.2. TCP Settings #

  • 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 保活设置,或 PostgreSQL 的 tcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_count 设置。

20.3.3. Authentication #

  • authentication_timeout (integer) #

    • 允许完成客户机身份验证的最大时间量。如果一个可能的客户机在这个时间内没有完成身份验证协议,服务器就会关闭连接。这可以防止挂起的客户机无限期地占用连接。如果未指定单位,那么该值被视为秒。默认值为一分钟 (1m)。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

  • password_encryption (enum) #

    • 当密码在 CREATE ROLEALTER ROLE 中指定时,此参数确定用于对密码加密的算法。可能的值为 scram-sha-256 ,它将使用 SCRAM-SHA-256 加密密码,以及 md5 ,它将密码存储为 MD5 哈希。默认值为 scram-sha-256

    • 请注意,较旧的客户端可能不支持 SCRAM 认证机制,因此无法使用 SCRAM-SHA-256 加密的密码。有关详细信息,请参见 Section 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 文件或服务器命令行中设置。有关详细信息,请参见 Section 21.6

  • krb_caseins_users (boolean) #

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

  • gss_accept_delegation (boolean) #

    • 设置是否接受来自客户机的 GSSAPI 委托。默认值为 off,这意味着来自客户机的凭证将 not 被接受。将其更改为 on,将使服务器接受客户机委托给它的凭证。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

  • db_user_namespace (boolean) #

    • 此参数启用按数据库划分的用户名。它默认关闭。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

    • 如果已开启此项,则应像 username@dbname 一样创建用户。当连接的客户机传递 username 时,@ 和数据库名称会被附加到用户名中,并且服务器会查找该数据库特定的用户名。请注意,当在 SQL 环境中使用包含 @ 的名称创建用户时,需要对用户名进行引用。

    • 启用此参数后,您仍然可以创建普通的全局用户。在客户机中指定用户名时,只需附加 @,例如 joe@。服务器在查找用户名之前会清除 @

    • db_user_namespace 使客户端和服务器的用户名表示形式不同。始终使用服务器的用户名执行认证检查,因此必须针对服务器的用户名(而不是客户端的用户名)配置认证方法。由于 md5 在客户端和服务器上都将用户名用作盐,因此 md5 无法与 db_user_namespace 一起使用。

Note

此功能旨在作为一项临时措施,直到找到完整的解决方案。届时,将删除此选项。

20.3.4. SSL #

有关设置 SSL 的详细信息,请参见 Section 19.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 rehashc_rehash 准备目录。有关详细信息,请参见其文档。

    • 使用此设置时,将按需在连接时加载指定目录中的 CRL。可将新的 CRL 添加到目录,并立即使用它们。这与 ssl_crl_file 不同, 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 文件或服务器命令行中设置。

    • 默认值的说明:

    • 可用的密码套件详细信息因 OpenSSL 版本而异。使用命令 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL' 查看当前已安装的 OpenSSL 版本的实际详细信息。请注意,此列表将在运行时基于服务器密钥类型进行筛选。

  • ssl_prefer_server_ciphers (boolean) #

    • 指定是使用服务器的 SSL 密码偏好还是客户端的 SSL 密码偏好。此参数只能在 postgresql.conf 文件或服务器命令行中设置。默认值为 on

    • 旧版本的 PostgreSQL 没有此设置,且总是使用客户端的偏好。此设置主要用于与那些版本向后兼容。通常,使用服务器的偏好更好,因为它更有可能使服务器得到适当的配置。

  • 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 协议版本。目前有效的值有:TLSv1TLSv1.1TLSv1.2TLSv1.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) #

    • 指定包含用于所谓的临时 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 设置的密码命令是否会在需要密钥文件密码时在配置重新加载期间也被调用。如果此参数为关闭(默认值),则 ssl_passphrase_command 将在重新加载期间被忽略,并且如果需要密码,则不会重新加载 SSL 配置。此设置适用于需要一个可用于提示的 TTY 的命令,而服务器运行时可能无法使用该命令。例如,如果密码是从文件中获得的,则可以将此参数设置为开启。

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

  • HIGH #

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

  • MEDIUM #

    • 使用来自 MEDIUM 组(例如 RC4、SEED)密码的密码套件

  • +3DES #

    • OpenSSL 对 HIGH 的默认顺序有问题,因为它将 3DES 排在 AES128 之前。这是错误的,因为 3DES 提供的安全级别低于 AES128,而且速度也要慢得多。+3DES 将其重新排序,放在其他所有 HIGHMEDIUM 密码之后。

  • !aNULL #

    • 禁用不执行身份验证的匿名密码套件。此类密码套件容易受到 MITM 攻击,因此不应使用。