19.3. 连接和认证 #
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.,其中nnnnnnnn是服务器的端口号),一个名为.s.PGSQL.的普通文件会在每一个nnnn.lockunix_socket_directories目录中被创建。任何一个都不应该被手工移除。Windows 没有 Unix 域套接字,因此此参数在 Windows 上没有意义。
unix_socket_group(string) #设置 Unix 域套接字的所属组(套接字的所属用户总是启动服务器的用户)。可以与选项
unix_socket_permissions一起用于对 Unix 域连接进行访问控制。默认是一个空字符串,表示服务器用户的默认组。这个参数只能在服务器启动时设置。Windows 没有 Unix 域套接字,因此此参数在 Windows 上没有意义。
unix_socket_permissions(integer) #设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。参数值应是以
chmod和umask系统调用所接受格式指定的数字权限模式。(要使用惯用的八进制格式,数字必须以0(零)开头。)默认权限是
0777,表示任何人都可以连接。合理的其他取值包括0770(仅属主和所属组,另见unix_socket_group)和0700(仅属主)。(注意,对 Unix 域套接字而言,只有写权限起作用,因此设置或撤销读权限和执行权限没有意义。)此访问控制机制独立于第 20 章中描述的机制。
此参数只能在服务器启动时设置。
此参数对完全忽略套接字权限的系统无效,尤其是 Solaris(截至 Solaris 10)。在这些系统上,可以将
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 连接使用的 SSL 密码套件列表。该设置的语法及支持的值列表,可参见 OpenSSL 包中的 ciphers 手册页。此设置只影响使用 TLS 1.2 及更低版本的连接。目前没有控制 TLS 1.3 连接所用密码套件的设置。默认值是
HIGH:MEDIUM:+3DES:!aNULL。除非你有特定的安全需求,否则该默认值通常是合理的选择。这个参数只能在
postgresql.conf文件中或者服务器命令行上设置。默认值的解释:
HIGH使用
HIGH组中密码算法(例如 AES、Camellia、3DES)的密码套件。MEDIUM使用
MEDIUM组中密码算法(例如 RC4、SEED)的密码套件。+3DESOpenSSL 对
HIGH的默认排序有问题,因为它将 3DES 排在 AES128 之前。这是不正确的,因为 3DES 的安全性低于 AES128,并且速度也慢得多。+3DES会把它重新排序到其他所有HIGH和MEDIUM密码套件之后。!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 ROLE 或 ALTER ROLE 中指定密码时,此参数决定用于加密密码的算法。默认值为
md5,它将密码存储为 MD5 hash(也接受on,作为md5的别名)。将此参数设置为scram-sha-256将使用 SCRAM-SHA-256 加密密码。注意,较旧的客户端可能不支持 SCRAM 认证机制,因此无法使用以 SCRAM-SHA-256 加密的密码。详情参见第 20.3.2 节。
ssl_dh_params_file(string) #指定包含 Diffie-Hellman 参数的文件名,这些参数用于所谓临时 DH 系列的 SSL 密码套件。默认值为空,此时使用编译时内置的默认 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) #设置是否应该以大小写不敏感的方式对待 GSSAPI 用户名。默认值是
off(大小写敏感)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。db_user_namespace(boolean) #此参数启用各数据库独立的用户名。默认关闭。此参数只能在
postgresql.conf文件中或在服务器命令行上设置。如果启用此参数,你应以
username@dbname的形式创建用户。连接的客户端传入username时,会在用户名后附加@和数据库名,然后由服务器查找此数据库专属的用户名。请注意,在 SQL 环境中创建名称包含@的用户时,需要用引号括起用户名。启用此参数后,仍然可以创建普通的全局用户。只需在客户端指定用户名时附加
@,例如joe@。服务器查找用户名之前会去掉@。db_user_namespace会使客户端和服务器的用户名表示形式不同。认证检查始终使用服务器端的用户名,因此认证方法必须针对服务器端的用户名配置,而不是客户端的用户名。由于md5在客户端和服务器上都使用用户名作为盐值,md5不能与db_user_namespace一起使用。注意
此特性旨在作为找到完整解决方案之前的临时措施。届时将移除此选项。