配置客户端认证
配置客户端认证¶
本主题讲解如何为SeaboxMPP数据库配置客户端访问和身份验证。
当首次初始化SeaboxMPP数据库系统时,系统包含一个预定义的超级用户角色。此角色与初始化SeaboxMPP的操作系统用户具有相同的名称,此角色被称为seabox
。默认情况下,系统被配置为仅允许从本地使用seabox
角色连接到数据库。如果要允许其他角色或远程主机访问连接,则必须配置SeaboxMPP数据库以允许此类访问。本节介绍如何为SeaboxMPP数据库配置客户端访问和身份验证。
数据库认证机制¶
客户端访问和身份验证通过标准的SeaboxSQL基于主机的身份验证文件sd_hba.conf控制。
在SeaboxMPP数据库集群中,Coordinator实例的sd_hba.conf文件控制对SeaboxMPP数据库集群的客户端访问和身份验证。SeaboxMPP数据库集群的Executor实例中中也有sd_hba.conf文件,但这些文件已经配置为仅允许来自Coordinator主机的客户端连接。这些executor实例永远不会接受外部客户端连接,因此无需更它们的sd_hba.conf文件。
sd_hba.conf文件的一般格式是一组记录,每行一个。SeaboxMPP数据库忽略空行和#
注释后的内容。每行记录由许多由空格或制表符分隔的字段组成。字段值如果被引号括起来,可以包含空格。每个远程客户端访问记录都具有以下格式:
host database role address authentication-method
每个UNIX域套接字访问记录都采用以下格式:
local database role authentication-method
下表描述了每个字段的含义。
- local
- 匹配使用UNIX域套接字的连接尝试。如果没有此类记录,则不允许使用UNIX域套接字连接。
- host
- 匹配使用TCP/IP进行的连接尝试。除非服务器以适当的值启动,否则将无法进行远程TCP/IP连接的
- listen_addresses
- 服务器配置参数。
- hostssl
- 匹配使用TCP/IP进行的连接尝试,但仅限于使用SSL加密进行连接时。必须通过设置ssl服务器配置参数,在服务器启动时启用SSL。
- hostnossl
- 匹配使用TCP/IP进行的不使用SSL的连接尝试。
- name
- 指定此记录匹配的数据库名称。取值为all指定匹配所有数据库。 多个数据库名称可以通过用逗号分隔。在文件名前加上@符号,可以指定一个含有数据库名的单独的文件。
- role
- 指定该记录匹配的数据库角色名称。 取值为all指定匹配所有角色。如果指定角色是一个分组,在角色名前加+前缀, 可以匹配该组内所有成员。多个角色名称可以用逗号分隔。在文件名前加入@前缀,指定匹配文件内的 包含的所有角色名。
- address
-
指定该记录匹配的客户端机器地址。该字段包含IP地址、IP地址范围或主机名。
指定IP地址范围,使用标准数组标识范围的其实地址,紧跟着一个斜线(/),在跟上CIDR掩码长度。掩码长度表示必须匹配的客户端IP地址的高比特位。给定的IP地址中,右边的位应为零。在IP地址、斜线/和CIDR掩码长度三者之间不能有空格。
以这种方式指定的IPv4地址范围的典型示例是,172.20.143.89/32代表单个主机,172.20.143.0/24代表小型网络,10.6.0.0/16代表更大网络。 相应的IPv6地址范围典型案例是,::1/128代表单个主机(在这种情况下是IPv6环回地址),fe80::7a31:c1ff:0000:0000/96代表小型网络。 0.0.0.0/0代表全部IPv4地址,并且::0/0代表全部IPv6地址。要指定单个主机,对于IPv4使用32位掩码长度,对于IPv6使用128位掩码长度。在网络地址中,不要省略拖尾的0数字。
使用IPv4格式给出的记录只匹配IPv4连接,使用IPv6格式给出的记录只匹配IPv6连接,即使所表示的地址在IPv4-in-IPv6范围内。
注意:如果服务器C Lib不支持IPv6地址,建拒绝所有IPv6格式记录。
如果指定了主机名(不是IP地址或IP范围的地址被当做主机名),则将该名称与客户端IP地址的反向名称解析结果进行比较(如反向DNS查找)。主机名比较不区分大小写。如果存在匹配,如果存在匹配主机名,则对主机名执行转发名称解析(如转发DNS查找),已检查主机名解析的任何地址是否是否等于客户端IP地址。如果双向都匹配,则认为该记录匹配。
某些主机名数据库允许将IP地址与多个主机名关联,但解析IP地址是,操作系统只返回其中一个主机名。位于文件sd_hba.conf中的主机名必须是客户端IP地址,必须是客户端IP地址返回address-to-name解析结果,否则该行不会被视为匹配。
当指定在sd_hba.conf文件中的主机名,应该确保名称解析足够快。设置如nscd本地名称解析缓存是有效的。而且可以启用服务器设置参数log_hostname客户端主机名而不是日志中的IP地址。
- IP-address,IP-mask
- 该字段可以被用作CIDR地址记号的替代。 不是指定掩码长度,而是在单独的列中指定实际掩码。 例如,255.0.0.0表示IPv4的CIDR的掩码长度为8, 而255.255.255.255表示CIDR的掩码长度为32。
- authentication-method
- 指定建立连接时使用的认证方法。
重要:
针对更安全的系统,记得移除sd_hba.conf
文件中使用trust认证远程连接的配置记录。因trust认证授权能连接到服务器的任何用户,使用任何他们指定的任何角色访问数据库。
针对本地UNIX-socket连接,可以使用ident认证,安全的替代trust认证。
针对本地及远程TCP客户端,仍然可以使用ident认证,但是客户机主机必须运行ident服务,并且您必须信任该机器的完整性。
编辑sd_hba.conf文件¶
首先,设置sd_hba.conf
文件,需要具有seabox用户权限,并且没有其他SeaboxMPP数据库访问角色。需要编辑sd_hba.conf
以使用户能够访问数据库并保护seabox用户。可以考虑删除具有trust身份验证的记录,因为它们允许任何有服务器访问权限的人,使用其选择的任何角色建立连接。对于本地UNIX套接字连接,请使用ident身份验证,需要操作系统用户匹配特定角色。对于本地TCP和远程TCP链接,ident认证需要客户端主机运行ident服务。针对本地连接,如127.0.0.1/28
可以安装ident服务到coordinator主机上。
针对远程TCP连接,使用ident认证其安全性极低,因为需要您信任coordinator主机上ident服务的公正性。
此示例显示了如何编辑coordinator主机上的sd_hba.conf文件,通过加密密码认证,允许远程主机使用所有角色,访问所有数据库
编辑sd_hba.conf步骤如下:
-
使用文本编辑器,打开$MASTER_DATA_DIRECTORY/sd_hba.conf 文件。
-
针对每种允许的连接类型添加一行记录。文件中的记录按顺序读取,因此记录的顺序很重要。典型的,较早的记录将具有较严格的的连接匹配参数和较弱的身份验证方法,而较靠后记录将具有更宽松的匹配参数和更抢的身份验证方法。例如:
# 允许seabox用户本地访问所有数据库 # 使用ident认证 local all seabox ident sameuser host all seabox 127.0.0.1/32 ident host all seabox ::1/128 ident # 允许'dba'角色,通过192.168.x.xIP地址,使用md5加密密码,授权用户访问任意数据库。 # 注意使用SHA-256加密,替换如下行记录中md5密码。 host all dba 192.168.0.0/32 md5 # allow all roles access to any database from any # host and use ldap to authenticate the user. SeaboxMPP role # names must match the LDAP common name. host all all 192.168.0.0/32 ldap ldapserver=usldap1 ldapport=1389 ldapprefix="cn=" ldapsuffix=",ou=People,dc=company,dc=com"
-
保存并关闭文件。
-
重新加载sd_hba.conf配置文件以使更改生效:
$ seabox stop
注意: 可以设置对象特权来控制数据库访问,具体参考管理对象权限中所描述的内容。sd_hba.conf文件只是控制谁可以发起数据库回话以及如何认证这些链接。
限制并发连接¶
SeaboxMPP数据库以每个连接为基础分配资源,因此建议设置允许的最大连接数。
要限制SeaboxMPP数据库系统的活动并发会话数,可以配置max_connections
服务器配置参数。这是一个local参数,这意味着必须在coordinator节点、standby
coordinator节点、每个executor实例(包括primary和mirror)的seaboxsql.conf
文件中设置该参数。中主服务器,备用主服务器和每个段实例(主服务器和镜像服务器)的文件。建议在executor节点的max_connections
参数值是coordinator节点的5-10倍。
当设置max_connections
时,必须设置依赖参数max_prepared_transactions
。该值至少与coordinator节点上的max_connections
取值相等。executor实例节点也设置相同的值。
例如:
-
在
$MASTER_DATA_DIRECTORY/seaboxsql.conf
文件(包括standby coordinator节点)max_connections=100 max_prepared_transactions=100
-
在所有executor实例节点
SEGMENT_DATA_DIRECTORY/seaboxsql.conf
文件max_connections=500 max_prepared_transactions=100
以下步骤使用SeaboxMPP数据库工具 seabox config
设置参数值。
有关更多seabox config
的信息,可以参考SeaboxMPP数据库工具指南。
更改允许的连接数¶
-
以SeaboxMPP数据库管理员身份,登录SeaboxMPP数据库的coordinator节点主机,使用source命令加载
$SDHOME/seaboxmpp_path.sh
文件信息。 -
设置
max_connections
参数取值。此seabox config
命令将executor实例节点上的参数值设置为1000,将coordinator节点上的参数值设置为200。$ seabox config -c max_connections -v 1000 -C 200
该参数值segement节点上的必须大于coordinator节点上的。推荐executor节点的
max_connections
参数值是coordinator节点的5-10倍。 -
设置
max_prepared_transactions
参数取值。此seabox config
命令将coordinator节点和executor实例节点上的取值都这会为200.$ seabox config -c max_prepared_transactions -v 200
executor节点的
max_prepared_transactions
参数值必须大于等于coordinator节点的max_connections
参数值。 -
停止并重启SeaboxMPP数据库系统。
$ seabox stop
-
可以使用
seabox config
-s
选项,检查coordinator和executor节点的参数值。此seabox config
命令显示max_connections
参数的取值。$ seabox config -s max_connections
注意:
调高这些参数的取值,可能会导致SeaboxMPP数据库需要更多的共享内存。为了缓和这种影响,考虑调小其他内存相关的参数,如sc_cached_segworkers_threshold
参数。
加密客户端/服务器连接¶
为连接到SeaboxMPP数据库的客户端启用SSL,以加密客户端和数据库之间通过网络传递的数据。
SeaboxMPP数据库原生支持支持客户端和coordinator服务器之间的SSL连接。SSL连接可以防止第三方对数据包进行嗅探,还可以防止中间人攻击。 只要客户端连接通过不安全的链接就应该使用SSL,并且在使用客户端证书认证时必须使用SSL。
要启用SSL,需要在客户端和coordinator服务器系统上安装OpenSSL。通过在coordinator节点的seaboxsql.conf
文件,设置服务器配置参数ssl=on
,可以让SeaboxMPP数据库启动时启用SSL。当以SSL模式启动时,服务器将会在coordinator节点的数据目录中查找服务器私钥server.key文件和服务器证书server.crt文件。在开启SSL的SeaboxMPP数据库系统启动之前,确保这些文件已经正确地设置好。
重要: 请勿使用密码保护私钥。服务器不会提示输入私钥的密码,如果需要密码,则数据库会启动失败并显示错误。
可以使用自签名证书进行测试,但在生产中应使用由数字证书认证机构(CA)签名的证书,以便客户端可以验证服务器的身份。可以使用全球CA或本地CA。如果所有客户端在组织内部本地,则建议使用本地CA。
创建一个仅用于测试没有密码的自签名证书示例如下:
要为服务器快速创建自签名证书以进行测试,请使用如下OpenSSL命令:
# openssl req -new -text -out server.req
输入提示所要求的信息。请务必输入本地主机名作为Common Name。私钥保护密码可以留空。
该程序将生成一个受密码保护的密钥,并且不接受长度小于四个字符的密码。
要把这个证书用于SeaboxMPP数据库,用下列命令移除该密码:
# openssl rsa -in privkey.pem -out server.key
# rm privkey.pem
在提示解锁现有密钥时输入旧密码。
然后,输入以下命令将证书转换为自签名证书,并将密钥和证书复制到服务器,并保存到可以查找到它们的位置。
# openssl req -x509 -in server.req -text -key server.key -out server.crt
最后,使用以下命令更改密钥的权限。如果权限限制不这么严格,则服务器将拒绝该文件。
# chmod og-rwx server.key
有关如何创建服务器私钥和证书的更多详细信息,请参阅OpenSSL文档所示。