18.3. 连接和认证

18.3.1. 连接设置

listen_addresses (string)

声明服务器监听客户端连接的TCP/IP地址。值是一个逗号分隔的主机名和/或数字IP地址。 特殊项*对应所有可用IP接口。 0.0.0.0允许监听所有IPV4地址,并且::允许监听所有IPV6地址。 如果这个列表是空的,那么服务器不会监听任何IP接口, 这种情况下,只有Unix域套接字可以用于连接数据库。 缺省值localhost只允许进行本地"回环"连接。 客户端认证(第 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域套接字(S)的目录, 并且服务器监听来自客户端应用程序的连接。 多个套接字可以通过列出多个用逗号分隔的目录创建。 忽略条目之间的空白; 如果你需要包含空格或逗号的名字,增加带有双引号的目录名。 空值指定不监听任何Unix域的套接字, 在这种情况下,只有TCP/IP套接字可以用于连接到服务器。 默认值通常是/tmp,但可以在编译的时候改变。 这个参数只能在服务器启动的。

除套接字文件本身外,它被命名为 .s.PGSQL.nnnn,其中 nnnn是服务器的端口号,普通文件 命名的.s.PGSQL.nnnn.lock 将在每个unix_socket_directories目录中创建。 永远都不应该手动删除这两个文件。

这个参数在Windows上是无关紧要的,它不具有Unix域套接字。

unix_socket_group (string)

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

这个参数在Windows上是无关紧要的,它不具有Unix域套接字。

unix_socket_permissions (integer)

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

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

这个访问控制机制与第 19 章里描述的用户认证毫无关系。

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

这个参数与系统无关,尤其是到了Solaris 10,完全忽略套接字权限。这里, 可以通过将unix_socket_directories指向一个将搜索权限限制为所需用户的路径来达到相似效果。 这个参数在Windows上也是无关紧要的,因为它不具有Unix域套接字。

bonjour (boolean)

通过Bonjour启动广播服务器的存在。缺省是关闭的。 这个值只能在服务器启动的时候设置。

bonjour_name (string)

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

tcp_keepalives_idle (integer)

声明TCP应该发送保持活跃信息到客户端后不活跃的秒数。 零使用系统默认值。该参数仅在支持 TCP_KEEPIDLE或者TCP_KEEPALIVE符号以及 Windows的系统上出现;在其它系统中,它必须是零。 在通过Unix域套接字连接的会话中,这个参数被忽略,并且总是读为零。

注意: 在Windows中,0值将这个参数设置为2小时, 因为Windows不提供读取系统默认值的方法。

tcp_keepalives_interval (integer)

声明TCP保持活跃信息不被客户端承认,应该被转发的秒数。 零使用系统默认值。 在那些支持TCP_KEEPINTVL符号以及Windows的系统上支持这些参数。 在其他系统上,这个参数必须为零。 在通过Unix域套接字连接的会话中,这个参数被忽略,并且总是读为零。

注意: 在Windows中,0值将这个参数设置为1秒, 因为Windows不提供读取系统默认值的方法。

tcp_keepalives_count (integer)

声明服务器到客户端的连接被认为关闭之前,TCP保持活跃信号可以丢失的数量。 零使用系统默认值。 在那些支持TCP_KEEPCNT的系统上支持这些参数。 在其他系统上,这个参数必须为零。 在通过Unix域套接字连接的会话中,这个选项被忽略,并且总是读为零。

注意: 在Windows上不支持这个参数,并且总是为零。

18.3.2. 安全和认证

authentication_timeout (integer)

完成客户端认证的最长时间,以秒计。如果一个客户端没有在这段时间里完成认证协议, 服务器将中断连接。这样就避免了出问题的客户端无限制地占据连接资源。缺省是60秒(1m)。 这个选项只能在命令行上或者在postgresql.conf里设置。

ssl (boolean)

启用SSL连接。请在使用这个选项之前阅读第 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

注意: 当使用SSL时再商议时候,2009年11月之前的SSL库是不安全的,由于SSL协议的一个漏洞。 作为这个漏洞修复,一些厂商出货的SSL库不能重新谈判。 如果在客户端或服务器上使用任何库,应禁用SSL重新协商。

ssl_ciphers (string)

指定一列允许在安全连接上使用的SSL密码组。参阅OpenSSL 报中的ciphers手册页获取这个设置的语法, 和一系列支持的值。缺省值是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 (bool)

声明是否使用服务器的SSL预设密码,而不是客户端的。缺省是true。

较老的PostgreSQL版本没有这个设置,并且总是使用客户端的预设。 这个设置主要是为了向后兼容。通常使用服务器的预设更好一些, 因为服务器更有可能适当的配置了。

ssl_ecdh_curve (string)

声明在ECDH秘钥交换中要使用的curve的名字。 它需要所有连接客户端的支持。它不需要和服务器的Elliptic Curve秘钥相同。 缺省是prime256v1

大多数curve的OpenSSL名: prime256v1 (NIST P-256)、 secp384r1 (NIST P-384)、 secp521r1 (NIST P-521)。

使用命令openssl ecparam -list_curves 可以显示所有可用的curve的列表。并不是所有的curve都可以在 TLS中使用。

password_encryption (boolean)

CREATE USER或者ALTER ROLE里声明了一个口令, 而又没有写ENCRYPTED或者UNENCRYPTED的时候,这个选项决定口令是否要加密。 缺省是on(加密口令)。

krb_server_keyfile (string)

设置Kerberos服务器键字文件的位置。参阅第 19.3.3 节获取细节。 这个参数只能在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一起使用。

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