19.3. 连接和认证

19.3.1. 连接设置
19.3.2. 安全和认证

19.3.1. 连接设置

listen_addresses (string)

指定服务器在哪些 TCP/IP 地址上监听客户端连接。值的形式是一个逗号分隔的主机名和/或数字 IP 地址列表。特殊项*对应所有可用 IP 接口。项0.0.0.0允许监听所有 IPv4 地址并且::允许监听所有 IPv6 地址。如果列表为空,服务器将根本不会监听任何 IP 接口,在这种情况中只能使用 Unix 域套接字来连接它。默认值是localhost,它只允许建立本地 TCP/IP 环回连接。虽然客户端认证(第 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的值。 这个参数只能在服务器启动时设置。

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 域套接字,只有写权限有麻烦,因此没有对读取和执行权限的设置和收回)。

这个访问控制机制与第 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 域套接字连接的会话中,这个参数被忽略并且总是读作零。

注意

在 Windows 上,值若为 0,系统会将该参数设置为 2 小时,因为 Windows 不支持读取系统默认值。

tcp_keepalives_interval (integer)

指定在多少秒之后重发一个还没有被客户端告知已收到的 TCP keepalive 消息。0 值表示使用系统默认值。这个参数只有在支持TCP_KEEPINTVL或等效套接字选项的系统或 Windows 上才可以使用。在其他系统上,必须为零。在通过 Unix域套接字连接的会话中,这个参数被忽略并总被读作零。

注意

在 Windows 上,值若为 0,系统会将该参数设置为 1 秒,因为 Windows 不支持读取系统默认值。

tcp_keepalives_count (integer)

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

注意

Windows 不支持该参数,且必须为零。

19.3.2. 安全和认证

authentication_timeout (integer)

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

ssl (boolean)

启用SSL连接。请在使用这个参数之前阅读第 18.9 节。这个选项只能在postgresql.conf文件或服务器命令行上设置。默认是off

ssl_ca_file (string)

指定包含 SSL 服务器证书颁发机构(CA)的文件名。 相对路径是相对于数据目录。该参数只能在postgresql.conf 文件或服务器命令行上设置。默认值为空,表示不载入 CA 文件, 并且不执行客户端证书验证。

在之前的 PostgreSQL 发布中,这个文件的名字被硬编码成 root.crt

ssl_cert_file (string)

指定包含 SSL 服务器证书的文件名。相对路径是相对于数据目录的。 这个参数只能在postgresql.conf文件或服务器命令行上设置。 默认值是server.crt

ssl_crl_file (string)

指定包含 SSL 服务器证书撤销列表(CRL)的文件名。 相对路径是相对于数据目录。这个参数只能在postgresql.conf 文件中或服务器命令行上设置。默认值为空,意味着不载入 CRL 文件。

在之前的 PostgreSQL 发布中,这个文件的名称被硬编码为root.crl。 相对路径是相对于数据目录。这个参数只能在服务器启动时设置。

ssl_key_file (string)

指定包含 SSL 服务器私钥的文件名。 相对路径是相对于数据目录。这个参数只能在postgresql.conf 文件中或服务器命令行上设置。默认值为server.key

ssl_ciphers (string)

指定一个SSL密码列表,用于安全连接。 这个设置的语法和所支持的值列表可以 参见OpenSSL包中的 ciphers手册页。 这个参数只能在postgresql.conf 文件中或服务器命令行上设置。默认值是 HIGH:MEDIUM:+3DES:!aNULL。默认值通常是合理的选择, 除非你有特别的安全性需求。

默认值的解释:

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中可用。

password_encryption (enum)

当在CREATE USERALTER ROLE 中指定了一个密码时,这个参数决定加密密码所使用的算法。默认值是md5, 它将密码存储为MD5哈希(也接受on作为md5的别名)。 将该参数设置为scram-sha-256将使用SCRAM-SHA-256加密密码。

请注意,较老的客户端可能缺少对SCRAM认证机制的支持, 因此不适用于使用SCRAM-SHA-256加密的密码。有关更多详细信息, 请参阅第 20.3.2 节

ssl_dh_params_file (string)

指定包含用于所谓的短暂DH系列SSL密码的Diffie-Hellman参数的文件的名称。 缺省值为空,在这种情况下,使用默认编译的DH参数。 如果攻击者设法破解众所周知的内编译DH参数,使用自定义DH参数可以减少暴露。 可以使用命令openssl dhparam -out dhparams.pem 2048 创建您自己的DH参数文件。

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

krb_server_keyfile (string)

设置 Kerberos 服务器密钥文件的位置。详见第 20.3.3 节。这个参数只能在 postgresql.conf文件中或服务器命令行上进行设置。

krb_caseins_users (boolean)

设置 Kerberos 和 GSSAPI 用户名是否应区分大小写。默认是off(区分大小写)。这个参数只能在 postgresql.conf文件中或服务器命令行上进行设置。

db_user_namespace (boolean)

允许针对每个数据库的用户名。默认是关闭的。这个参数只能在 postgresql.conf文件中或服务器命令行上进行设置。

如果打开这个参数,你应该以username@dbname的方式创建用户。 当一个username被连接着的客户端传递时,@和数据库名被增加到用户名中并且那个数据库相关的用户名会被服务器查找。注意,当你在 SQL 环境里创建包含@的用户名时, 你需要用引号包围用户名。

打开这个参数之后,你还是能够创建普通的全局用户。只要在客户端指定用户名时附加一个@,例如joe@。 在服务器查找这个用户名之前,这个@会被剥除。

db_user_namespace导致客户端和服务器的用户名表示变得不同。 认证检查总是使用服务器用户名来完成,因此认证方法必须为服务器的用户名配置,而不是客户端的用户名。因为在客户端和服务器上md5都使用用户名作为盐粒,md5不能和db_user_namespace一起使用。

注意

这个特性只是一种临时方法,直到找到一个完全的解决方案。那个时候, 这个选项将被删除。