连接和认证
连接和认证¶
连接设置¶
listen_addresses
(string
)- 指定服务在哪些 TCP/IP 地址上监听客户端连接。值的形式是一个逗号分隔的主机名和/或数字 IP 地址列表。特殊项
*
对应所有可用IP 接口。项0.0.0.0
允许监听所有 IPv4 地址并且::
允许监听所有 IPv6地址。如果列表为空,服务将根本不会监听任何 IP接口,在这种情况中只能使用 Unix域套接字来连接它。默认值是localhost,它只允许建立本地TCP/IP“环回”连接。虽然客户端认证(客户端认证)允许细粒度地控制谁能访问服务,listen_addresses
控制哪些接口接受连接尝试,这能帮助在不安全网络接口上阻止重复的恶意连接请求。该参数只能在服务启动时设置。 port
(integer
)- 服务监听的 TCP 端口;默认是 5432 。请注意服务会同一个端口号监听所有的 IP 地址。该参数只能在服务启动时设置。
max_connections
(integer
)-
决定数据库的最大并发连接数。默认值通常是 100个连接,但是如果内核设置不支持(initdb时决定),可能会比这个数少。该参数只能在服务启动时设置。
当运行一个后备服务时,你必须设置该参数等于或大于主服务上的参数。否则,后备服务上可能无法允许查询。
superuser_reserved_connections
(integer
)-
决定为SeaboxSQL超级用户连接而保留的连接“槽”数。同时活跃的并发连接最多max_connections个。任何时候,活跃的并发连接数最多为
max_connections
减去superuser_reserved_connections
,新连接就只能由超级用户发起了,并且不会有新的复制连接被接受。默认值是 3。这个值必须小于
max_connections
减去max_wal_senders的值。该参数只能在服务、启动时设置。 unix_socket_directories
(string
)-
指定服务用于监听来自客户端应用的连接的 Unix域套接字目录。通过列出用逗号分隔的多个目录可以建立多个套接字。项之间的空白被忽略,如果你需要在名字中包括空白或逗号,在目录名周围放上双引号。一个空值指定在任何Unix 域套接字上都不监听,在这种情况中只能使用 TCP/IP套接字来连接到服务。默认值通常是
/tmp
,但是在编译时可以被改变。该参数只能在服务启动时设置。除了套接字文件本身(名为
.s.SDSQL.nnnn
,其中nnnn
是服务的端口号),一个名为.s.SDSQL.nnnn
.lock的普通文件会在每一个unix_socket_directories
目录中被创建。任何一个都不应该被手工移除。 unix_socket_group
(string
)- 设置 Unix域套接字的所属组(套接字的所属用户总是启动服务的用户)。可以与选项unix_socket_permissions`一起用于对Unix域连接进行访问控制。默认是一个空字符串,表示服务用户的默认组。该参数只能在服务启动时设置。
unix_socket_permissions
(integer
)-
设置 Unix 域套接字的访问权限。Unix 域套接字使用普通的 Unix文件系统权限集。该参数值应该是数字的形式,也就是系统调用
chmod
和umask
接受的形式(如果使用自定义的八进制格式,数字必须以一个0
(零)开头)。默认的权限是
0777
,意思是任何人都可以连接。合理的候选是0770
(只有用户和同组的人可以访问,又见unix_socket_group
)和0700
(只有用户自己可以访问)(请注意,对于 Unix域套接字,只有写权限有麻烦,因此没有对读取和执行权限的设置和收回)。这个访问控制机制与客户端认证中的用户认证没有关系。
该参数只能在服务启动时设置。
该参数与完全忽略套接字权限的系统无关,可以通过把
unix_socket_directories
指向一个把搜索权限限制给指定用户的目录来实现相似的效果。 bonjour
(boolean
)-
通过Bonjour广告服务的存在。默认值是关闭。该参数只能在服务启动时设置。
bonjour_name
(string
)- 指定Bonjour服务名称。空字符串
''
(默认值)表示使用计算机名。如果编译时没有打开Bonjour支持那么将忽略该参数。该参数只能在服务启动时设置。 tcp_keepalives_idle
(integer
)- 指定不活动多少秒之后通过 TCP 向客户端发送一个 keepalive 消息。 0值表示使用默认值。该参数只有在支持
TCP_KEEPIDLE
或等效套接字选项的系统。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,该参数被忽略并且总是读作零。 tcp_keepalives_interval
(integer
)-
指定在多少秒之后重发一个还没有被客户端告知已收到的 TCP keepalive 消息。0值表示使用系统默认值。该参数只有在支持
TCP_KEEPINTVL
或等效套接字选项的系统才可以使用。在其他系统上,必须为零。在通过 Unix域套接字连接的会话中,该参数被忽略并总被读作零。tcp_keepalives_count
(integer
)指定与客户端的服务连接被认为死掉之前允许丢失的 TCP keepalive 数量。0值表示使用系统默认值。该参数只有在支持
TCP_KEEPCNT
或等效套接字选项的系统上才可以使用。在其他系统上,必须为零。在通过Unix 域套接字连接的会话中,该参数被忽略并总被读作零。
安全和认证¶
authentication_timeout
(integer
)- 完成客户端认证的最长时间,以秒计。如果一个客户端没有在这段时间里完成认证协议,服务将关闭连接。这样就避免了出问题的客户端无限制地占有一个连接。默认值是1分钟(
1m
)。该参数只能在服务命令行上或者在seaboxsql.conf
文件中设置。 password_encryption
(enum
)-
当在CREATE ROLE或者ALTER ROLE中指定了口令时,该参数决定用于加密该口令的算法。默认值是
md5
,它会将口令存为一个MD5哈希(on
也会被接受,它是md5
的别名)。将该参数设置为scram-sha-256
将使用SCRAM-SHA-256来加密口令。注意老的客户端可能缺少对SCRAM认证机制的支持,因此无法使用用SCRAM-SHA-256加密的口令。详情请参考口令认证。
krb_server_keyfile
(string
)- 设置Kerberos服务密钥文件的位置。详情请参考GSSAPI 认证。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。 krb_caseins_users
(boolean
)- 设置是否应该以大小写不敏感的方式对待GSSAPI用户名。默认值是
off
(大小写敏感)。该参数只能在seaboxsql.conf
文件中或者服务命令行上设置。 db_user_namespace
(boolean
)-
该参数启用针对每个数据库的用户名。该参数默认是关掉的。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。如果该参数为打开,应该把用户创建成
username@dbname
的形式。当一个连接客户端传来username
时,@
和数据库名会被追加到用户名并且服务会查找这个与数据库相关的用户名。注意在SQL环境中用含有@
的名称创建用户时,需要把用户名放在引号内。在该参数被启用时,仍然可以创建平常的全局用户。而在客户端中指定这种用户时只需要简单地追加
@
,例如joe@
。在服务查找该用户名之前,@
会被剥离掉。db_user_namespace
会导致客户端和服务的用户名表达形式不同。认证检查总是会以服务的用户名表达形式来完成,因此认证方法必须针对服务用户名而不是客户端用户名来配置。由于md5
方法在客户端和服务两端都使用用户名作为salt,md5
不能与db_user_namespace
同时使用。注意
这种特性的目的是在找到完整的解决方案之前提供一种临时的措施。在找到完整解决方案时,这个选项将被去除。
SSL¶
有关设置SSL的更多信息请参考用 SSL 进行安全的 TCP/IP 连接。
ssl
(boolean
)- 启用SSL连接。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值是off
。 ssl_ca_file
(string
)- 指定包含 SSL服务证书颁发机构(CA)的文件名。相对路径是相对于数据目录的。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值为空,表示没有载入CA文件,并且客户端证书验证没有被执行。 ssl_cert_file
(string
)- 指定包含 SSL服务证书的文件名。相对路径是相对于数据目录的。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值是server.crt
。 ssl_crl_file
(string
)- 指定包含 SSL服务证书撤销列表(CRL)的文件名。其中的相对路径是相对于数据目录的。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值是空,表示没有载入CRL文件。 ssl_key_file
(string
)- 指定包含 SSL服务私钥的文件名。相对路径是相对于数据目录。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值是server.key
。 ssl_ciphers
(string
)-
指定一个SSL密码列表,用于安全连接。这个设置的语法和所支持的值列表可以参见OpenSSL包中的ciphers手册页。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值是HIGH:MEDIUM:+3DES:!aNULL
。默认值通常是一种合理的选择,除非用户有特定的安全性需求。默认值的解释:
HIGH
- 使用来自
HIGH
组的密码的密码组(例如 AES, Camellia, 3DES) MEDIUM
- 使用来自
MEDIUM
组的密码的密码组(例如 RC4, SEED) +3DES
- OpenSSL 对
HIGH
的默认排序是有问题的,因为它认为 3DES 比 AES128 更高。这是错误的,因为 3DES提供的安全性比 AES128 低,并且它也更加慢。+3DES
把它重新排序在所有其他HIGH
和MEDIUM
密码之后。 !aNULL
- 禁用不做认证的匿名密码组。这类密码组容易收到中间人攻击,因此不应被使用。
可用的密码组细节可能会随着 OpenSSL 版本变化。可使用命令
openssl ciphers -v 'HIGH:MEDIUM:+3DES:!aNULL'
来查看当前安装的OpenSSL版本的实际细节。注意这个列表是根据服务密钥类型在运行时过滤过的。 ssl_prefer_server_ciphers
(boolean
)- 指定是否使用服务的 SSL密码首选项,而不是用客户端的。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。默认值是true
。 ssl_ecdh_curve
(string
)-
指定用在ECDH密钥交换中的曲线名称。它需要被所有连接的客户端支持。它不需要与服务椭圆曲线密钥使用的曲线相同。该参数只能在
seaboxsql.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参数文件。该参数只能在
seaboxsql.conf
文件中或服务命令行上进行设置。 ssl_passphrase_command
(string
)-
设置当需要一个密码(例如一个私钥)来解密SSL文件时会调用的一个外部命令。默认情况下,该参数为空,表示使用内建的提示机制。
该命令必须将密码打印到标准输出并且以代码0退出。在该参数值中,
%p
被替换为一个提示字符串(要得到文字%
,应该写成%%
)。注意该提示字符串将可能含有空格,因此要确保加上适当的引号。如果输出的末尾有单一的新行,它会被剥离掉。该命令实际上并不一定要提示用户输入一个密码。它可以从文件中读取密码、从钥匙链得到密码等等。确保选中的机制足够安全是用户的责任。
该参数只能在
seaboxsql.conf
文件中或服务命令行上进行设置。 ssl_passphrase_command_supports_reload
(boolean
)-
该参数决定在配置重载期间如果一个密钥文件需要口令时,是否也调用
ssl_passphrase_command
设置的密码命令。如果该参数为假(默认),那么在重载期间将忽略ssl_passphrase_command
,如果在此期间需要密码则SSL配置将不会被重载。对于要求一个TTY(当服务正在运行时可能是不可用的)来进行提示的命令,这种设置是合适的。例如,如果密码是从一个文件中得到的,将该参数设置为真可能是合适的。该参数只能在
seaboxsql.conf
文件中或者服务命令行上设置。