On this page
19.3. 连接和身份验证
19 .3.1. 连接设定
-
- 指定服务器用于侦听来自 Client 端应用程序的连接的 TCP/IP 地址。该值采用主机名和/或数字 IP 地址的逗号分隔列表的形式。特殊条目
*
对应于所有可用的 IP 接口。条目0.0.0.0
允许侦听所有 IPv4 地址,而::
允许侦听所有 IPv6 地址。如果列表为空,则服务器根本不监听任何 IP 接口,在这种情况下,只能使用 Unix 域套接字连接。默认值为 localhost,它仅允许构建本地 TCP/IP“环回”连接。尽管 Client 端身份验证(Chapter 20)可以对谁可以访问服务器进行细粒度控制,但是listen_addresses
控制哪些接口可以接受连接尝试,这可以帮助防止在不安全的网络接口上重复出现恶意连接请求。该参数只能在服务器启动时设置。
- 指定服务器用于侦听来自 Client 端应用程序的连接的 TCP/IP 地址。该值采用主机名和/或数字 IP 地址的逗号分隔列表的形式。特殊条目
-
- 服务器监听的 TCP 端口;默认为 5432.请注意,服务器侦听的所有 IP 地址都使用相同的端口号。该参数只能在服务器启动时设置。
-
- 确定与数据库服务器的最大并发连接数。默认值通常为 100 个连接,但是如果您的内核设置不支持该连接,则该值可能会更少(由 initdb 确定)。该参数只能在服务器启动时设置。
运行备用服务器时,必须将此参数设置为与主服务器上相同或更高的值。否则,备用服务器将不允许查询。
superuser_reserved_connections
(integer
)- 确定为 PostgreSQL 超级用户保留用于连接的连接“插槽”的数量。最多max_connections个连接可以同时处于活动状态。只要活动的并发连接数至少为
max_connections
减去superuser_reserved_connections
,新连接就只会被超级用户接受,而新的复制连接将不被接受。
- 确定为 PostgreSQL 超级用户保留用于连接的连接“插槽”的数量。最多max_connections个连接可以同时处于活动状态。只要活动的并发连接数至少为
默认值为三个连接。该值必须小于max_connections
的值。该参数只能在服务器启动时设置。
unix_socket_directories
(string
)- 指定服务器要在其上侦听来自 Client 端应用程序的连接的 Unix 域套接字的目录。可以通过列出用逗号分隔的多个目录来创建多个套接字。条目之间的空格将被忽略;如果您需要在名称中包含空格或逗号,请在目录名称两边加上双引号。空值表示不侦听任何 Unix 域套接字,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。默认值通常为
/tmp
,但可以在构建时更改。该参数只能在服务器启动时设置。
- 指定服务器要在其上侦听来自 Client 端应用程序的连接的 Unix 域套接字的目录。可以通过列出用逗号分隔的多个目录来创建多个套接字。条目之间的空格将被忽略;如果您需要在名称中包含空格或逗号,请在目录名称两边加上双引号。空值表示不侦听任何 Unix 域套接字,在这种情况下,只能使用 TCP/IP 套接字连接到服务器。默认值通常为
除了名为.s.PGSQL.nnnn
的套接字文件本身(其中* nnnn
*是服务器的端口号)之外,还将在每个unix_socket_directories
目录中创建一个名为.s.PGSQL.nnnn.lock
的普通文件。都不应该手动删除这两个文件。
在没有 Unix 域套接字的 Windows 上,此参数无关。
unix_socket_group
(string
)- 设置 Unix 域套接字的所属组。 (套接字的拥有者始终是启动服务器的用户.)与参数
unix_socket_permissions
结合使用,可以将其用作 Unix 域连接的附加访问控制机制。默认情况下,这是空字符串,它使用服务器用户的默认组。该参数只能在服务器启动时设置。
- 设置 Unix 域套接字的所属组。 (套接字的拥有者始终是启动服务器的用户.)与参数
在没有 Unix 域套接字的 Windows 上,此参数无关。
unix_socket_permissions
(integer
)- 设置 Unix 域套接字的访问权限。 Unix 域套接字使用通常的 Unix 文件系统权限集。参数值应该是数字模式,以
chmod
和umask
系统调用接受的格式指定。 (要使用常规的八进制格式,数字必须以0
(零)开头。)
- 设置 Unix 域套接字的访问权限。 Unix 域套接字使用通常的 Unix 文件系统权限集。参数值应该是数字模式,以
默认权限为0777
,这意味着任何人都可以连接。合理的替代方法是0770
(仅用于用户和组,另请参见unix_socket_group
)和0700
(仅用于用户)。 (请注意,对于 Unix 域套接字,仅写权限很重要,因此设置或撤消读或执行权限毫无意义.)
此访问控制机制独立于Chapter 20中描述的机制。
该参数只能在服务器启动时设置。
此参数与完全忽略套接字许可权的系统(尤其是 Solaris 10 或更高版本的 Solaris)无关。在那里,通过将unix_socket_directories
指向搜索权限仅限于所需受众的目录,可以达到类似的效果。在没有 Unix 域套接字的 Windows 上,该参数也无关紧要。
-
- 通过 Bonjour 启用广告服务器的存在。默认为关闭。该参数只能在服务器启动时设置。
-
- 指定 Bonjour 服务名称。如果将此参数设置为空字符串
''
(默认值),则使用计算机名称。如果服务器不是在 Bonjour 支持下编译的,则忽略此参数。该参数只能在服务器启动时设置。
- 指定 Bonjour 服务名称。如果将此参数设置为空字符串
tcp_keepalives_idle
(integer
)- 指定不活动的秒数,在此之后,TCP 应该向 Client 端发送保持活动消息。值 0 使用系统默认值。仅在支持
TCP_KEEPIDLE
或等效套接字选项的系统以及 Windows 上才支持此参数。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。
- 指定不活动的秒数,在此之后,TCP 应该向 Client 端发送保持活动消息。值 0 使用系统默认值。仅在支持
Note
在 Windows 上,值 0 将将此参数设置为 2 小时,因为 Windows 没有提供读取系统默认值的方法。
tcp_keepalives_interval
(integer
)- 指定秒数,在此秒数之后,Client 端未确认的 TCP keepalive 消息应重新传输。值 0 使用系统默认值。仅在支持
TCP_KEEPINTVL
或等效套接字选项的系统以及 Windows 上才支持此参数。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。
- 指定秒数,在此秒数之后,Client 端未确认的 TCP keepalive 消息应重新传输。值 0 使用系统默认值。仅在支持
Note
在 Windows 上,值 0 将将此参数设置为 1 秒,因为 Windows 没有提供读取系统默认值的方法。
tcp_keepalives_count
(integer
)- 指定在服务器与 Client 端的连接被视为无效之前可以丢失的 TCP keepalive 数量。值 0 使用系统默认值。仅在支持
TCP_KEEPCNT
或等效套接字选项的系统上支持此参数。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略,并且始终读取为零。
- 指定在服务器与 Client 端的连接被视为无效之前可以丢失的 TCP keepalive 数量。值 0 使用系统默认值。仅在支持
Note
Windows 不支持此参数,并且必须为零。
19 .3.2. 安全与认证
authentication_timeout
(integer
)- 完成 Client 端身份验证的最长时间,以秒为单位。如果准 Client 在这段时间内没有完成身份验证协议,则服务器将关闭连接。这样可以防止挂起的 Client 端无限期占用连接。默认值为一分钟(
1m
)。只能在postgresql.conf
文件或服务器命令行中设置此参数。
- 完成 Client 端身份验证的最长时间,以秒为单位。如果准 Client 在这段时间内没有完成身份验证协议,则服务器将关闭连接。这样可以防止挂起的 Client 端无限期占用连接。默认值为一分钟(
-
- 启用 SSL 连接。使用前请先阅读Section 18.9。只能在
postgresql.conf
文件或服务器命令行中设置此参数。默认值为off
。
- 启用 SSL 连接。使用前请先阅读Section 18.9。只能在
-
- 指定包含 SSL 服务器证书颁发机构(CA)的文件的名称。相对路径是相对于数据目录的。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为空,表示未加载 CA 文件,并且不执行 Client 端证书验证。
- 指定包含 SSL 服务器证书颁发机构(CA)的文件的名称。相对路径是相对于数据目录的。此参数只能在
在先前的 PostgreSQL 版本中,此文件的名称硬编码为root.crt
。
-
- 指定包含 SSL 服务器证书的文件的名称。相对路径是相对于数据目录的。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为server.crt
。
- 指定包含 SSL 服务器证书的文件的名称。相对路径是相对于数据目录的。此参数只能在
-
- 指定包含 SSL 服务器证书吊销列表(CRL)的文件的名称。相对路径是相对于数据目录的。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认为空,表示未加载任何 CRL 文件。
- 指定包含 SSL 服务器证书吊销列表(CRL)的文件的名称。相对路径是相对于数据目录的。此参数只能在
在先前的 PostgreSQL 版本中,此文件的名称硬编码为root.crl
。
-
- 指定包含 SSL 服务器私钥的文件的名称。相对路径是相对于数据目录的。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为server.key
。
- 指定包含 SSL 服务器私钥的文件的名称。相对路径是相对于数据目录的。此参数只能在
-
- 指定允许在安全连接上使用的 SSL 密码套件的列表。有关此设置的语法和支持的值的列表,请参见 OpenSSL 软件包中的密码手册页。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为HIGH:MEDIUM:+3DES:!aNULL
。除非您有特定的安全要求,否则默认值通常是一个合理的选择。
- 指定允许在安全连接上使用的 SSL 密码套件的列表。有关此设置的语法和支持的值的列表,请参见 OpenSSL 软件包中的密码手册页。此参数只能在
默认值的说明:
HIGH
使用
HIGH
组密码的密码套件(例如 AES,Camellia,3DES)MEDIUM
- 使用
MEDIUM
组密码的密码套件(例如 RC4,SEED)
- 使用
+3DES
HIGH
的 OpenSSL 默认 Sequences 有问题,因为它的 Sequences 比 AES128 高 3DES。这是错误的,因为 3DES 提供的安全性低于 AES128,并且速度也慢得多。+3DES
对所有其他HIGH
和MEDIUM
密码重新排序。
!aNULL
- 禁用不进行身份验证的匿名密码套件。这样的密码套件容易受到中间人攻击,因此不应使用。
可用的密码套件详细信息将在 OpenSSL 版本中有所不同。使用命令openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'
查看当前安装的 OpenSSL 版本的实际详细信息。请注意,此列表在运行时根据服务器密钥类型进行过滤。
ssl_prefer_server_ciphers
(boolean
)- 指定是否使用服务器的 SSL 密码首选项而不是 Client 端的 SSL 密码首选项。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为true
。
- 指定是否使用服务器的 SSL 密码首选项而不是 Client 端的 SSL 密码首选项。此参数只能在
较早的 PostgreSQL 版本没有此设置,并且始终使用 Client 端的首选项。此设置主要是为了与这些版本向后兼容。通常,使用服务器的首选项会更好,因为更可能是正确配置了服务器。
ssl_ecdh_curve
(string
)- 指定在 ECDH 密钥交换中使用的曲线的名称。所有连接的 Client 端都需要支持它。它不必与服务器的“椭圆曲线”键使用的曲线相同。此参数只能在
postgresql.conf
文件或服务器命令行中设置。默认值为prime256v1
。
- 指定在 ECDH 密钥交换中使用的曲线的名称。所有连接的 Client 端都需要支持它。它不必与服务器的“椭圆曲线”键使用的曲线相同。此参数只能在
最常见曲线的 OpenSSL 名称为:prime256v1
(NIST P-256),secp384r1
(NIST P-384),secp521r1
(NIST P-521)。可用曲线的完整列表可以使用命令openssl ecparam -list_curves
来显示。但是,并非所有这些功能都可以在 TLS 中使用。
password_encryption
(enum
)- 在CREATE ROLE或ALTER ROLE中指定密码后,此参数确定用于加密密码的算法。默认值为
md5
,它将密码存储为 MD5 哈希(也接受on
作为md5
的别名)。将此参数设置为scram-sha-256
将使用 SCRAM-SHA-256 加密密码。
- 在CREATE ROLE或ALTER ROLE中指定密码后,此参数确定用于加密密码的算法。默认值为
请注意,较旧的 Client 端可能缺乏对 SCRAM 身份验证机制的支持,因此不适用于使用 SCRAM-SHA-256 加密的密码。有关更多详细信息,请参见Section 20.3.2。
ssl_dh_params_file
(string
)- 指定包含用于 Diffie-Hellman 参数的文件的名称,这些参数用于所谓的短暂 DH 系列 SSL 密码。默认值为空,在这种情况下,将使用已编译的默认 DH 参数。如果攻击者设法破解众所周知的内置 DH 参数,则使用自定义 DH 参数可以减少暴露。您可以使用命令
openssl dhparam -out dhparams.pem 2048
创建自己的 DH 参数文件。
- 指定包含用于 Diffie-Hellman 参数的文件的名称,这些参数用于所谓的短暂 DH 系列 SSL 密码。默认值为空,在这种情况下,将使用已编译的默认 DH 参数。如果攻击者设法破解众所周知的内置 DH 参数,则使用自定义 DH 参数可以减少暴露。您可以使用命令
此参数只能在postgresql.conf
文件或服务器命令行中设置。
-
- 设置 Kerberos 服务器密钥文件的位置。有关详情,请参见Section 20.3.3。只能在
postgresql.conf
文件或服务器命令行中设置此参数。
- 设置 Kerberos 服务器密钥文件的位置。有关详情,请参见Section 20.3.3。只能在
-
- 设置是否应不区分大小写地对待 GSSAPI 用户名。默认值为
off
(区分大小写)。只能在postgresql.conf
文件或服务器命令行中设置此参数。
- 设置是否应不区分大小写地对待 GSSAPI 用户名。默认值为
-
- 此参数启用每个数据库的用户名。默认情况下它是关闭的。此参数只能在
postgresql.conf
文件或服务器命令行中设置。
- 此参数启用每个数据库的用户名。默认情况下它是关闭的。此参数只能在
如果启用,则应将用户创建为* username@dbname
。当连接的 Client 端传递 username
*时,@
和数据库名称将附加到用户名上,并且服务器将查找该特定于数据库的用户名。请注意,在 SQL 环境中创建名称包含@
的用户时,将需要用引号引起来。
启用此参数后,您仍然可以创建普通的全局用户。在 Client 端中指定用户名时,只需添加@
即可,例如joe@
。在服务器查找用户名之前,@
将被删除。
db_user_namespace
导致 Client 端和服务器的用户名表示形式不同。身份验证检查始终使用服务器的用户名进行,因此必须为服务器的用户名(而不是 Client 端的用户名)配置身份验证方法。由于md5
在 Client 端和服务器上都使用用户名作为盐,因此md5
不能与db_user_namespace
一起使用。
Note
在找到完整的解决方案之前,此功能仅用作临时措施。届时,该选项将被删除。