## 20.3.连接和身份验证 [20.3.1. 连接设置](runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SETTINGS) [20.3.2. 认证](runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-AUTHENTICATION) [20.3.3. SSL](runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SSL) ### 20.3.1.连接设置 `听一下你的地址`(`一串`)[](<>) 指定服务器将在其上侦听来自客户端应用程序的连接的TCP/IP地址。该值采用以逗号分隔的主机名和/或数字IP地址列表的形式。特别条目`*`对应于所有可用的IP接口。条目`0.0.0.0`允许侦听所有IPv4地址和`::`允许侦听所有IPv6地址。如果列表为空,则服务器根本不会监听任何IP接口,在这种情况下,只能使用Unix域套接字连接到它。默认值是localhost,它只允许进行本地TCP/IP“环回”连接。而客户端身份验证([第21章](client-authentication.html))允许对谁可以访问服务器进行细粒度控制,`听一下你的地址`控制哪些接口接受连接尝试,这有助于防止在不安全的网络接口上重复恶意连接请求。此参数只能在服务器启动时设置。 `港口城市`(`整数`)[](<>) 服务器监听的TCP端口;默认为5432。请注意,服务器侦听的所有IP地址都使用相同的端口号。此参数只能在服务器启动时设置。 `max_连接`(`整数`)[](<>) 确定与数据库服务器的最大并发连接数。默认值通常为 100 个连接,但如果您的内核设置不支持它可能会更少(在 initdb 期间确定)。此参数只能在服务器启动时设置。 运行备用服务器时,您必须将此参数设置为与主服务器上相同或更高的值。否则,备用服务器中将不允许查询。 `超级用户保留连接`(`整数`)[](<>) 确定为 PostgreSQL 超级用户的连接保留的连接“槽”的数量。最多[最大限度\_连接](runtime-config-connection.html#GUC-MAX-CONNECTIONS)连接可以同时处于活动状态。每当活动并发连接数至少为`最大连接数`减`超级用户保留连接`, 新连接将只接受超级用户,不会接受新的复制连接。 默认值为三个连接。该值必须小于`最大连接数`.此参数只能在服务器启动时设置。 `unix_socket_directories`(`细绳`)[](<>) 指定服务器要侦听来自客户端应用程序的连接的 Unix 域套接字的目录。可以通过列出以逗号分隔的多个目录来创建多个套接字。条目之间的空格被忽略;如果您需要在名称中包含空格或逗号,请用双引号将目录名称括起来。空值指定不侦听任何 Unix 域套接字,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。 开头的值`@`指定应在抽象命名空间中创建一个 Unix 域套接字(目前在 Linux 和 Windows 上支持)。在这种情况下,这个值不指定一个“目录”,而是一个前缀,实际套接字名称的计算方式与文件系统命名空间相同。虽然抽象套接字名称前缀可以自由选择,因为它不是文件系统位置,但约定仍然使用类似文件系统的值,例如`@/tmp`. 默认值通常是`/tmp`,但可以在构建时更改。在 Windows 上,默认值为空,这意味着默认情况下不创建 Unix 域套接字。此参数只能在服务器启动时设置。 除了套接字文件本身,它被命名为`.s.PGSQL.*`呸呸呸`*`在哪里*`呸呸呸`*是服务器的端口号,一个普通的文件名为`.s.PGSQL.*`呸呸呸`*。锁`将在每个`unix_socket_directories`目录。这两个文件都不应该被手动删除。对于抽象命名空间中的套接字,不会创建锁定文件。 `unix_socket_group`(`细绳`)[](<>) 设置 Unix 域套接字的所属组。(套接字的拥有用户始终是启动服务器的用户。)结合参数`unix_socket_permissions`这可以用作 Unix 域连接的附加访问控制机制。默认情况下,这是空字符串,它使用服务器用户的默认组。此参数只能在服务器启动时设置。 Windows 不支持此参数。任何设置都将被忽略。此外,抽象命名空间中的套接字没有文件所有者,因此在这种情况下也会忽略此设置。 `unix_socket_permissions`(`整数`)[](<>) 设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。参数值应为以`修改`和`掩码`系统调用。(要使用惯用的八进制格式,数字必须以`0`(零)。) 默认权限是`0777`,意味着任何人都可以连接。合理的选择是`0770`(仅限用户和组,另请参阅`unix_socket_group`) 和`0700`(仅限用户)。(请注意,对于 Unix 域套接字,只有写入权限很重要,因此设置或撤销读取或执行权限是没有意义的。) 这种访问控制机制独立于在[第 21 章](client-authentication.html). 此参数只能在服务器启动时设置。 此参数与完全忽略套接字权限的系统(尤其是 Solaris 10 及更高版本的 Solaris)无关。在那里,可以通过指向来实现类似的效果`unix_socket_directories`到具有仅限于所需受众的搜索权限的目录。 抽象命名空间中的套接字没有文件权限,因此在这种情况下也会忽略此设置。 `你好`(`布尔值`)[](<>) 启用通过 Bonjour 宣传服务器的存在。默认为关闭。此参数只能在服务器启动时设置。 `bonjour_name`(`细绳`)[](<>) 指定 Bonjour 服务名称。如果此参数设置为空字符串,则使用计算机名称`''`(这是默认设置)。如果服务器未在 Bonjour 支持下编译,则忽略此参数。此参数只能在服务器启动时设置。 `tcp_keepalives_idle`(`整数`)[](<>) 指定没有网络活动的时间量,在此之后操作系统应向客户端发送 TCP keepalive 消息。如果指定此值没有单位,则以秒为单位。值 0(默认值)选择操作系统的默认值。此参数仅在支持的系统上受支持`TCP_KEEPIDLE`或等效的套接字选项,在 Windows 上;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数被忽略并始终读取为零。 ### 笔记 在 Windows 上,将值设置为 0 会将此参数设置为 2 小时,因为 Windows 不提供读取系统默认值的方法。 `tcp_keepalives_interval`(`整数`)[](<>) 指定客户端未确认的 TCP keepalive 消息应在多长时间后重新传输。如果指定此值没有单位,则以秒为单位。值 0(默认值)选择操作系统的默认值。此参数仅在支持的系统上受支持`TCP_KEEPINTVL`或等效的套接字选项,在 Windows 上;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数被忽略并始终读取为零。 ### 笔记 在 Windows 上,将值设置为 0 会将此参数设置为 1 秒,因为 Windows 不提供读取系统默认值的方法。 `tcp_keepalives_count`(`整数`)[](<>) 指定在服务器与客户端的连接被视为死之前可能丢失的 TCP keepalive 消息的数量。值 0(默认值)选择操作系统的默认值。此参数仅在支持的系统上受支持`TCP_KEEPCNT`或等效的插座选项;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数被忽略并始终读取为零。 ### 笔记 Windows 不支持此参数,必须为零。 `tcp_user_timeout`(`整数`)[](<>) 指定在强制关闭 TCP 连接之前,传输的数据可能保持未确认的时间量。如果指定此值没有单位,则以毫秒为单位。值 0(默认值)选择操作系统的默认值。此参数仅在支持的系统上受支持`TCP_USER_TIMEOUT`;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数被忽略并始终读取为零。 ### 笔记 Windows 不支持此参数,必须为零。 `client_connection_check_interval`(`整数`)[](<>) 设置在运行查询时可选检查客户端仍然连接的时间间隔。检查是通过轮询套接字来执行的,如果内核报告连接已关闭,则可以更快地中止长时间运行的查询。 此选项目前仅在支持非标准的系统上可用`轮询`扩展至`轮询`系统调用,包括 Linux。 如果指定的值没有单位,则以毫秒为单位。默认值为`0`,禁用连接检查。在没有连接检查的情况下,服务器只会在下一次与套接字交互时,在等待、接收或发送数据时检测到连接丢失。 为了让内核本身在包括网络故障在内的所有场景中可靠地检测丢失的 TCP 连接,可能还需要调整操作系统的 TCP keepalive 设置,或者[tcp\_保活\_idle](runtime-config-connection.html#GUC-TCP-KEEPALIVES-IDLE),[tcp_keepalives_interval](runtime-config-connection.html#GUC-TCP-KEEPALIVES-INTERVAL)and[tcp_keepalives_count](runtime-config-connection.html#GUC-TCP-KEEPALIVES-COUNT)settings of PostgreSQL. ### 20.3.2. Authentication `authentication_timeout`(`integer`)[](<>) [](<>) [](<>) Maximum amount of time allowed to complete client authentication. If a would-be client has not completed the authentication protocol in this much time, the server closes the connection. This prevents hung clients from occupying a connection indefinitely. If this value is specified without units, it is taken as seconds. The default is one minute (`1m`). This parameter can only be set in the`postgresql.conf`file or on the server command line. `password_encryption`(`enum`)[](<>) 指定密码时[创建角色](sql-createrole.html)要么[改变角色](sql-alterrole.html),此参数确定用于加密密码的算法。可能的值为`scram-sha-256`,它将使用 SCRAM-SHA-256 加密密码,并且`md5`,它将密码存储为 MD5 哈希值。默认是`scram-sha-256`. 请注意,旧客户端可能缺乏对 SCRAM 身份验证机制的支持,因此无法使用使用 SCRAM-SHA-256 加密的密码。看[第 21.5 节](auth-password.html)更多细节。 `krb_server_keyfile`(`细绳`)[](<>) 设置服务器的 Kerberos 密钥文件的位置。默认是`文件:/usr/local/pgsql/etc/krb5.keytab`(其中目录部分是指定为`系统配置目录`在构建时;采用`pg_config --sysconfdir`来确定)。如果此参数设置为空字符串,则忽略它并使用与系统相关的默认值。该参数只能在`postgresql.conf`文件或在服务器命令行上。看[第 21.6 节](gssapi-auth.html)了解更多信息。 `krb_caseins_users`(`布尔值`)[](<>) 设置 GSSAPI 用户名是否应不区分大小写。默认是`离开`(区分大小写)。该参数只能在`postgresql.conf`文件或在服务器命令行上。 `db_user_namespace`(`布尔值`)[](<>) 此参数启用每个数据库的用户名。默认情况下它是关闭的。该参数只能在`postgresql.conf`文件或在服务器命令行上。 如果打开,您应该将用户创建为*`用户名@dbname`*.什么时候*`用户名`*由连接的客户端传递,`@`并且数据库名称被附加到用户名,并且该数据库特定的用户名由服务器查找。请注意,当您创建名称包含的用户时`@`在 SQL 环境中,您需要引用用户名。 启用此参数后,您仍然可以创建普通的全局用户。只需附加`@`在客户端中指定用户名时,例如,`乔@`. The`@`will be stripped off before the user name is looked up by the server. `db_user_namespace`causes the client's and server's user name representation to differ. Authentication checks are always done with the server's user name so authentication methods must be configured for the server's user name, not the client's. Because`md5`uses the user name as salt on both the client and server,`md5`cannot be used with`db_user_namespace`. ### Note This feature is intended as a temporary measure until a complete solution is found. At that time, this option will be removed. ### 20.3.3. SSL See[Section 19.9](ssl-tcp.html)for more information about setting up SSL. `ssl`(`boolean`)[](<>) Enables SSL connections. This parameter can only be set in the`postgresql.conf`file or on the server command line. The default is`off`. `ssl_ca_file`(`string`)[](<>) 指定包含 SSL 服务器证书颁发机构 (CA) 的文件的名称。相对路径是相对于数据目录的。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认为空,表示不加载 CA 文件,不进行客户端证书验证。 `ssl_cert_file`(`细绳`)[](<>) 指定包含 SSL 服务器证书的文件的名称。相对路径是相对于数据目录的。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认是`服务器.crt`. `ssl_crl_file`(`细绳`)[](<>) 指定包含 SSL 客户端证书吊销列表 (CRL) 的文件的名称。相对路径是相对于数据目录的。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认为空,表示不加载 CRL 文件(除非[ssl_crl\_目录](runtime-config-connection.html#GUC-SSL-CRL-DIR)已设置)。 `ssl_crl_dir`(`细绳`)[](<>) 指定包含 SSL 客户端证书吊销列表 (CRL) 的目录的名称。相对路径是相对于数据目录的。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认为空,表示不使用 CRL(除非[ssl_crl\_文件](runtime-config-connection.html#GUC-SSL-CRL-FILE)已设置)。 需要使用 OpenSSL 命令准备目录`openssl 重新散列`要么`c_rehash`.有关详细信息,请参阅其文档。 使用此设置时,指定目录中的 CRL 在连接时按需加载。新的 CRL 可以添加到目录中并立即使用。这不像[ssl_crl\_文件](runtime-config-connection.html#GUC-SSL-CRL-FILE),这会导致在服务器启动时或重新加载配置时加载文件中的 CRL。两种设置可以一起使用。 `ssl_key_file`(`细绳`)[](<>) 指定包含 SSL 服务器私钥的文件的名称。相对路径是相对于数据目录的。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认是`服务器密钥`. `ssl_ciphers`(`细绳`)[](<>) 指定允许 SSL 连接使用的 SSL 密码套件列表。有关此设置的语法和受支持值的列表,请参阅 OpenSSL 包中的密码手册页。只有使用 TLS 1.2 及更低版本的连接会受到影响。当前没有控制 TLS 1.3 版连接使用的密码选择的设置。默认值为`高:中:+3DES:!aNULL`.除非您有特定的安全要求,否则默认值通常是一个合理的选择。 该参数只能在`postgresql.conf`文件或在服务器命令行上。 默认值说明: `高的` 使用来自的密码的密码套件`高的`组(例如,AES、Camellia、3DES) `中等的` 使用来自的密码的密码套件`中等的`组(例如,RC4、SEED) `+3DES` OpenSSL 的默认顺序`高的`是有问题的,因为它对 3DES 的要求高于 AES128。这是错误的,因为 3DES 提供的安全性低于 AES128,而且速度也慢得多。`+3DES`在所有其他之后重新排序`高的`和`中等的`密码。 `!aNULL` 禁用不进行身份验证的匿名密码套件。此类密码套件易受 MITM 攻击,因此不应使用。 可用的密码套件详细信息因 OpenSSL 版本而异。使用命令`openssl 密码 -v 'HIGH:MEDIUM:+3DES:!aNULL'`查看当前安装的 OpenSSL 版本的实际详细信息。请注意,此列表在运行时根据服务器密钥类型进行过滤。 `ssl_prefer_server_ciphers`(`布尔值`)[](<>) 指定是否使用服务器的 SSL 密码首选项,而不是客户端的。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认是`在`. 较旧的 PostgreSQL 版本没有此设置,并且始终使用客户端的首选项。此设置主要是为了向后兼容这些版本。使用服务器的首选项通常会更好,因为服务器配置得当的可能性更大。 `ssl_ecdh_curve`(`细绳`)[](<>) 指定要在 ECDH 密钥交换中使用的曲线的名称。它需要得到所有连接的客户端的支持。它不需要与服务器的 Elliptic Curve 键使用的曲线相同。该参数只能在`postgresql.conf`文件或在服务器命令行上。默认是`素数256v1`. 最常见曲线的 OpenSSL 名称是:`素数256v1`(NIST P-256),`secp384r1`(NIST P-384),`secp521r1`(NIST P-521)。可用曲线的完整列表可以使用命令显示`openssl ecparam -list_curves`.不过,并非所有这些都可以在 TLS 中使用。 `ssl_min_protocol_version`(`枚举`)[](<>) 设置要使用的最低 SSL/TLS 协议版本。当前有效值为:`TLSv1`,`TLSv1.1`,`TLSv1.2`,`TLSv1.3`.旧版本的 OpenSSL 库不支持所有值;如果选择了不受支持的设置,则会引发错误。TLS 1.0 之前的协议版本,即 SSL 版本 2 和 3,始终处于禁用状态。 默认是`TLSv1.2`,在撰写本文时满足行业最佳实践。 该参数只能在`postgresql.conf`文件或在服务器命令行上。 `ssl_max_protocol_version`(`枚举`)[](<>) Sets the maximum SSL/TLS protocol version to use. Valid values are as for[ssl_min_protocol_version](runtime-config-connection.html#GUC-SSL-MIN-PROTOCOL-VERSION), with addition of an empty string, which allows any protocol version. The default is to allow any version. Setting the maximum protocol version is mainly useful for testing or if some component has issues working with a newer protocol. This parameter can only be set in the`postgresql.conf`file or on the server command line. `ssl_dh_params_file`(`string`)[](<>) Specifies the name of the file containing Diffie-Hellman parameters used for so-called ephemeral DH family of SSL ciphers. The default is empty, in which case compiled-in default DH parameters used. Using custom DH parameters reduces the exposure if an attacker manages to crack the well-known compiled-in DH parameters. You can create your own DH parameters file with the command`openssl dhparam -out dhparams.pem 2048`. This parameter can only be set in the`postgresql.conf`file or on the server command line. `ssl_passphrase_command`(`string`)[](<>) Sets an external command to be invoked when a passphrase for decrypting an SSL file such as a private key needs to be obtained. By default, this parameter is empty, which means the built-in prompting mechanism is used. The command must print the passphrase to the standard output and exit with code 0. In the parameter value,`%p`替换为提示字符串。(写`%%`对于文字`%`.) 请注意,提示字符串可能包含空格,因此请务必充分引用。如果存在,则从输出末尾删除单个换行符。 该命令实际上不必提示用户输入密码。它可以从文件中读取它,从钥匙串工具中获取它,或类似的。用户有责任确保选择的机制足够安全。 该参数只能在`postgresql.conf`文件或在服务器命令行上。 `ssl_passphrase_command_supports_reload`(`布尔值`)[](<>) 该参数决定密码命令是否由`ssl_passphrase_command`如果密钥文件需要密码短语,也将在配置重新加载期间调用。如果此参数关闭(默认),则`ssl_passphrase_command`在重新加载期间将被忽略,如果需要密码短语,则不会重新加载 SSL 配置。该设置适用于需要 TTY 进行提示的命令,该命令在服务器运行时可能不可用。例如,如果密码是从文件中获取的,则将此参数设置为 on 可能是合适的。 该参数只能在`postgresql.conf`文件或在服务器命令行上。