18.3. 连接和认证

18.3.1. 连接设置

listen_addresses (string)

指定服务器在哪些 TCP/IP 地址上监听客户端连接。值的形式是一个逗号分隔的主机名和/或数字 IP 地址列表。特殊项*对应所有可用 IP 接口。项0.0.0.0允许监听所有 IPv4 地址并且::允许监听所有 IPv6 地址。如果列表为空,服务器将根本不会监听任何 IP 接口,在这种情况中只能使用 Unix 域套接字来连接它。默认值是localhost,它只允许建立本地 TCP/IP "环回"连接。虽然客户端认证(Chapter 19)允许细粒度地控制谁能访问服务器,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 域套接字,只有写权限有麻烦,因此没有对读取和执行权限的设置和收回)。

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

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

Windows 下没有 Unix 域套接字,因此这个参数与 Windows 无关。

bonjour (boolean)

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

bonjour_name (string)

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

tcp_keepalives_idle (integer)

指定在另一个空闲连接上发送一个 keepalive 报文之前的秒数。 0 值表示使用默认值。这个参数只有在支持TCP_KEEPIDLETCP_KEEPALIVE符号的系统或 Windows 上才可以使用。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,这个参数被忽略并且总是读作零。

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

tcp_keepalives_interval (integer)

指定在另一个空闲连接上发送 keepalive 之前的秒数。0 值表示使用系统默认值。这个参数只有在支持TCP_KEEPINTVL符号的系统或 Windows 上才可以使用。在其他系统上,必须为零。在通过 Unix域套接字连接的会话中,这个参数被忽略并总被读作零。

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

tcp_keepalives_count (integer)

指定在另一个空闲连接上发送 keepalive 报文之前的秒数。0 值表示使用系统默认值。这个参数只有在支持TCP_KEEPCNT符号的系统上才可以使用。在其他系统上,必须为零。在通过 Unix 域套接字连接的会话中,这个参数被忽略并总被读作零。

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

18.3.2. 安全和认证

authentication_timeout (integer)

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

ssl (boolean)

启用SSL连接。请在使用这个参数之前阅读Section 17.9。默认是off。 这个选项只能在服务器启动时设置。SSL通信只能和 TCP/IP 连接一起使用。

ssl_ca_file (string)

指定包含 SSL 服务器证书颁发机构(CA)的文件名。默认值为空,表示不载入 CA 文件,并且不执行客户端证书验证(在之前的 PostgreSQL 发布中,这个文件的名字被硬编码成root.crt)。相对路径是相对于数据目录。这个参数只能在服务器启动时设置。

ssl_cert_file (string)

指定包含 SSL 服务器证书的文件名。默认值是server.crt。相对路径是相对于数据目录的。这个参数只能在服务器启动时设置。

ssl_crl_file (string)

指定包含 SSL 服务器证书撤销列表(CRL)的文件名。默认值为空,意味着不载入 CRL 文件(在之前的 PostgreSQL 发布中,这个文件的名称被硬编码为root.crl)。相对路径是相对于数据目录。这个参数只能在服务器启动时设置。

ssl_key_file (string)

指定包含 SSL 服务器私钥的文件名。默认值为server.key。 相对路径是相对于数据目录。这个参数只能在服务器启动时设置。

ssl_renegotiation_limit (integer)

指定在会话密钥被重新协调之前有多少数据可流过一个SSL加密连接。 重新协调可以减低攻击者利用大量流量进行密码分析攻击的机会,但同样会造成较大的性能损失。 发送和接受的总流量将被用于进行检查该限制。如果这个参数被设置为 0,则禁用重新协调。默认是512MB

Note: 在使用 SSL 重新协调时,2009 年 11 月之前的 SSL 库是不安全的,因为 SSL 协议中存在弱点。 由于修复这个漏洞很麻烦,因此一些厂商提供的 SSL 库无法做重新协调。如果任何这种库被用于客户端或服务器,SSL 协调应该被禁用。

ssl_ciphers (string)

指定一个SSL密码列表,用于安全连接。可在openssl手册页中查看支持的密码列表。

password_encryption (boolean)

当在CREATE USERALTER ROLE中指定了一个密码,而没有写ENCRYPTEDUNENCRYPTED时,这个参数决定是否密码会被加密。默认值是on(加密密码)。

krb_server_keyfile (string)

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

krb_srvname (string)

设置 Kerberos 服务名。详见Section 19.3.5。这个参数只能在 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一起使用。

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