选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

19.3. 连接和认证 #

19.3.1. 连接设置 #

listen_addresses (string) #

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

在客户端认证(Chapter 20)允许对谁可以访问服务器进行细粒度控制的同时,listen_addresses 控制哪些接口接受连接尝试,这可以帮助防止在不安全的网络接口上重复恶意连接请求。此参数只能在服务器启动时设置。

port (integer) #

服务器监听的 TCP 端口;默认是 5432 。请注意服务器会同一个端口号监听所有的 IP 地址。这个参数只能在服务器启动时设置。

max_connections (integer) #

决定数据库服务器允许的最大并发连接数。默认值通常是 100 个连接,但如果内核设置不支持 (在 initdb 期间确定),则可能更少。这个参数只能在服务器启动时设置。

当运行一个备库时,你必须设置这个参数等于或大于主库上的参数。 否则,备库上将不允许查询。

superuser_reserved_connections (integer) #

决定为 PostgreSQL 超级用户连接保留多少个连接。 同时活跃的连接数最多始终只能达到 max_connections。 当活跃并发连接数至少达到 max_connections 减去 superuser_reserved_connections 时,新连接将只接受超级用户, 并且不再接受新的复制连接。

默认值是 3 个连接。该值必须小于 max_connections 减去 max_wal_senders。 这个参数只能在服务器启动时设置。

unix_socket_directories (string) #

指定服务器用于监听来自客户端应用的连接的 Unix 域套接字目录。通过列出用逗号分隔的多个目录可以建立多个套接字。 项之间的空白被忽略,如果你需要在名字中包括空白或逗号,在目录名周围放上双引号。 一个空值指定在任何 Unix 域套接字上都不监听,在这种情况中只能使用 TCP/IP 套接字来连接到服务器。 默认值通常是 /tmp,但可以在构建时更改。 这个参数只能在服务器启动时设置。

除了套接字文件本身(名为.s.PGSQL.nnnn,其中nnnn是服务器的端口号),一个名为.s.PGSQL.nnnn.lock的普通文件会在每一个unix_socket_directories目录中被创建。 任何一个都不应该被手工移除。

Windows 没有 Unix 域套接字,因此此参数在 Windows 上没有意义。

unix_socket_group (string) #

设置 Unix 域套接字的所属组(套接字的所属用户总是启动服务器的用户)。可以与选项unix_socket_permissions一起用于对 Unix域连接进行访问控制。默认是一个空字符串,表示服务器用户的默认组。这个参数只能在服务器启动时设置。

Windows 没有 Unix 域套接字,因此此参数在 Windows 上没有意义。

unix_socket_permissions (integer) #

设置 Unix 域套接字的访问权限。Unix 域套接字使用普通的 Unix 文件系统权限集。这个参数值应该是数字的形式,也就是系统调用chmodumask接受的 形式(如果使用自定义的八进制格式,数字必须以一个0(零)开头)。

默认的权限是0777,意思是任何人都可以连接。合理的候选是0770(只有用户和同组的人可以访问, 又见unix_socket_group)和0700(只有用户自己可以访问)(请注意,对于 Unix 域套接字,只有写权限有麻烦,因此没有对读取和执行权限的设置和收回)。

这个访问控制机制与Chapter 20中的用户认证没有关系。

这个参数只能在服务器启动时设置。

这个参数与完全忽略套接字权限的系统无关,尤其是自版本10以上的Solaris。 在那些系统上,可以通过把unix_socket_directories指向一个把搜索权限 限制给指定用户的目录来实现相似的效果。 Windows 没有 Unix 域套接字,因此此参数在 Windows 上也没有意义。

bonjour (boolean) #

通过Bonjour广告服务器的存在。默认值是关闭。 这个参数只能在服务器启动时设置。

bonjour_name (string) #

指定Bonjour服务名称。空字符串''(默认值)表示使用计算机名。 如果编译时没有打开Bonjour支持那么将忽略这个参数。这个参数只能在服务器启动时设置。

tcp_keepalives_idle (integer) #

指定在没有活动多少秒之后,TCP 应向客户端发送 keepalive 消息。值 0 表示使用系统默认值。 此参数仅在支持TCP_KEEPIDLE或等效套接字选项的系统以及 Windows 上可用;在其他系统上,它必须为零。 在通过 Unix 域套接字连接的会话中,此参数会被忽略,并始终读作零。

Note

在 Windows 上,值 0 会将此参数设置为 2 小时,因为 Windows 不提供读取系统默认值的方法。

tcp_keepalives_interval (integer) #

指定未被客户端确认收到的 TCP keepalive 消息在多少秒后应被重传。值 0 表示使用系统默认值。 此参数仅在支持TCP_KEEPINTVL或等效套接字选项的系统以及 Windows 上可用;在其他系统上,它必须为零。 在通过 Unix 域套接字连接的会话中,此参数会被忽略,并始终读作零。

Note

在 Windows 上,值 0 会将此参数设置为 1 秒,因为 Windows 不提供读取系统默认值的方法。

tcp_keepalives_count (integer) #

指定在服务器与客户端之间的连接被视为中断之前,可以丢失多少个 TCP keepalive 消息。 值 0 表示使用系统默认值。 这个参数只有在支持 TCP_KEEPCNT 或等效套接字选项的系统上才可用 ;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中, 这个参数会被忽略,并始终读作零。

Note

Windows 不支持此参数,它必须为零。

19.3.2. 认证 #

authentication_timeout (integer) #

允许完成客户端认证的最长时间,以秒为单位。如果一个客户端没有在这段时间里完成认证协议,服务器将关闭连接。 这样就避免了出问题的客户端无限制地占有一个连接。 默认值是 1分钟(1m)。这个参数只能在服务器命令行上或者在postgresql.conf文件中设置。

password_encryption (enum) #

CREATE ROLEALTER ROLE 中指定密码时,此参数决定用于加密密码的算法。 默认值为 md5,它将密码存储为 MD5 哈希(也接受 on,作为 md5 的别名)。 将此参数设置为 scram-sha-256 将使用 SCRAM-SHA-256 加密密码。

注意,较旧的客户端可能不支持 SCRAM 认证机制,因此无法使用以 SCRAM-SHA-256 加密的密码。 详情参见Section 20.5

krb_server_keyfile (string) #

设置服务器的Kerberos密钥文件的位置。详情请参考Section 20.6。 这个参数只能在postgresql.conf文件中或者服务器命令行上设置。

krb_caseins_users (boolean) #

设置是否应该以大小写不敏感的方式对待GSSAPI用户名。默认值是off(大小写敏感)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。

db_user_namespace (boolean) #

此参数启用各数据库独立的用户名。默认关闭。 此参数只能在postgresql.conf文件中或在服务器命令行上设置。

如果启用此参数,你应以username@dbname的形式创建用户。 连接的客户端传入username时,会在用户名后附加@和数据库名, 然后由服务器查找此数据库专属的用户名。请注意,在 SQL 环境中创建名称包含@的用户时,需要用引号括起用户名。

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

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

Note

此特性旨在作为找到完整解决方案之前的临时措施。届时将移除此选项。

19.3.3. SSL #

查看Section 18.9以获取有关设置SSL的更多信息。

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_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文件中或者服务器命令行上设置。

默认值的解释:

HIGH

使用HIGH组中密码(例如 AES、Camellia、3DES)的密码套件。

MEDIUM

使用MEDIUM组中密码(例如 RC4、SEED)的密码套件。

+3DES

OpenSSL对HIGH的默认排序有问题, 因为它将 3DES 排在 AES128 之前。这是不正确的,因为 3DES 的安全性低于 AES128, 并且速度也慢得多。+3DES会把它重新排序到其他所有 HIGHMEDIUM密码之后。

!aNULL

禁用不进行认证的匿名密码套件。这类密码套件容易遭受中间人攻击,因此不应使用。

可用的密码组细节可能会随着OpenSSL 版本变化。 可使用命令 openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'来查看当前安装的OpenSSL版本的实际细节。 注意这个列表是根据服务器密钥类型在运行时过滤过的。

ssl_prefer_server_ciphers (boolean) #

指定是否使用服务器的 SSL 密码首选项,而不是用客户端的。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。 默认值是 true

老的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_dh_params_file (string) #

指定含有用于SSL密码的所谓临时DH家族的Diffie-Hellman参数的文件名。默认值为空,这种情况下将使用内置的默认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设置的密码命令。 如果这个参数为false(默认),那么在重载期间将忽略ssl_passphrase_command,如果在此期间需要密码则SSL配置将不会被重载。 对于要求一个TTY(当服务器正在运行时可能是不可用的)来进行提示的命令,这种设置是合适的。 例如,如果密码是从一个文件中得到的,将这个参数设置为true可能是合适的。

这个参数只能在postgresql.conf文件中或通过服务器命令行进行设置。