配置客户端认证
本主题讲解如何为Greenplum数据库配置客户端访问和身份验证。
当首次初始化Greenplum数据库系统时,系统包含一个预定义的超级用户角色。此角色与初始化Greenplum数据库系统的操作系统用户具有相同的名称。此角色被曾为gpadmin。默认情况下,系统被配置为仅允许从本地使用gpadmin角色连接到数据库。如果要允许其他角色访问或者允许来自远程主机的连接,则必须配置Greenplum数据库以允许此类访问。本节介绍如何为Greenplum数据库配置客户端访问和身份验证。
- 使用带TLS/SSL的LDAP认证
可以使用LDAP服务器控制对Greenplum数据库的访问。此外,通过对pg_hba.conf文件条目增加参数,可使用加密来保护访问连接。 - 使用Kerberos认证
您可以使用Kerberos认证服务器控制对Greenplum数据库的访问。 - 为Linux客户端进行Kerberos配置
您可以配置Linux client客户端应用来连接一个已配置Kerberos认证的Greenplum数据库系统。 - 为Windows客户端进行Kerberos配置
您可以配置微软的Windows客户端应用程序来连接一个已配置Kerberos认证的Greenplum数据库系统。
Parent topic: 管理Greenplum数据库访问
允许访问Greenplum数据库
客户端访问和身份验证通过标准的PostgreSQL基于主机的身份验证文件pg_hba.conf控制。有关此文件的详细信息,请参阅PostgreSQL文档中的关于pg_hba.conf文件。
在Greenplum数据库,主实例的pg_hba.conf文件控制对Greenplum数据库系统的客户端访问和身份验证。在Greenplum数据库分段中也有pg_hba.conf文件,但这些文件已经配置为仅允许来自主主机的客户端连接。这些段永远不会接受外部客户端连接,因此无需更改分段中的pg_hba.conf文件。
pg_hba.conf 文件的一般格式是一组记录,每行一个。Greenplum数据库忽略空行和#注释后的内容。每行记录由许多由空格或制表符分隔的字段组成。字段值如果被引号括起来,可以包含空格。每个远程客户端访问记录都具有以下格式:
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的连接尝试。 |
指定此记录匹配的数据库名称。取值为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范围内。 Note: 如果主机系统C库文件不支持IPv6地址,建拒绝所有IPv6格式记录。 如果指定了主机名(不是IP地址或IP范围的地址被当做主机名),则将该名称与客户端IP地址的反向名称解析结果进行比较(如反向DNS查找)。主机名比较不区分大小写。如果存在匹配,如果存在匹配主机名,则对主机名执行转发名称解析(如转发DNS查找),已检查主机名解析的任何地址是否是否等于客户端IP地址。如果双向都匹配,则认为该记录匹配。 某些主机名数据库允许将IP地址与多个主机名关联,但解析IP地址是,操作系统只返回其中一个主机名。位于文件pg_hba.conf中的主机名必须是客户端IP地址,必须是客户端IP地址返回address-to-name解析结果,否则该行不会被视为匹配。 当指定在pg_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 | 指定建立连接时使用的认证方法。 PostgreSQL 9.0支持的认证方法Greenplum均支持。 |
CAUTION:
针对更安全系统,记得移除pg_hba.conf文件中使用trust认证 远程连接的配置记录。因trust认证授权能连接到服务器的任何用户,使用任何他们指定的任何角色访问数据库。 针对本地UNIX-socket连接,可以使用ident认证,安全的替代trust认证。 针对本地及远程TCP客户端,仍然可以使用ident认证,但是客户机主机必须运行ident服务, 并且您必须信任该机器的完整性。
编辑pg_hba.conf文件
首先,设置pg_hba.conf文件,需要具有gpadmin用户权限,并且没有其他Greenplum数据库访问角色。需要编辑pg_hba.conf以使用户能够访问数据库并保护gpadmin用户。可以考虑删除具有trust身份验证的记录,因为它们允许任何有服务器访问权限的人,使用其选择的任何角色建立连接。对于本地UNIX套接字连接,请使用ident身份验证,需要操作系统用户匹配特定角色。对于本地TCP和远程TCP链接,ident认证需要客户端主机运行ident服务。针对本地连接,如127.0.0.1/28可以安装ident服务到master主机上。 针对远程TCP连接,使用ident认证其安全性极低,因为需要您信任master主机上ident服务的公正性。
此示例显示了如何编辑master主机上的pg_hba.conf文件,通过加密密码认证,允许远程主机使用所有角色,访问所有数据库
编辑pg_hba.conf
- 使用文本编辑器,打开$MASTER_DATA_DIRECTORY/pg_hba.conf 文件。
针对每种允许的连接类型添加一行记录。文件中的记录按顺序读取,因此记录的顺序很重要。典型的,较早的记录将具有较严格的的连接匹配参数和较弱的身份验证方法,而较靠后记录将具有更宽松的匹配参数和更抢的身份验证方法。例如:
# 允许gpadmin用户本地访问所有数据库
# 使用ident认证
local all gpadmin ident sameuser
host all gpadmin 127.0.0.1/32 ident
host all gpadmin ::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. Greenplum 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"
保存并关闭文件。
重新加载pg_hba.conf配置文件以使更改生效:
$ gpstop -u
Note: 可以设置对象特权来控制数据库访问,具体参考管理对象权限中所描述的内容。pg_hba.conf文件只是控制谁可以发起数据库回话以及如何认证这些链接。
限制并发连接
Greenplum数据库以每个连接为基础分配资源,因此建议设置允许的最大连接数。
要限制Greenplum数据库系统的活动并发会话数,可以配置max_connections服务器配置参数。这是一个local参数,这意味着必须在master节点、standby master节点、每个segment实例(包括primary和mirror)的postgresql.conf文件中设置该参数。中主服务器,备用主服务器和每个段实例(主服务器和镜像服务器)的文件。建议在segment节点的max_connections参数值是master节点的5-10倍。
当设置max_connections时,必须设置依赖参数max_prepared_transactions。该值至少与master节点上的max_connections取值相等。segment实例节点也设置相同的值。
例如:
在$MASTER_DATA_DIRECTORY/postgresql.conf文件(包括standby master节点)
max_connections=100
max_prepared_transactions=100
在所有segment实例节点SEGMENT_DATA_DIRECTORY/postgresql.conf文件
max_connections=500
max_prepared_transactions=100
以下步骤使用Greenplum数据库工具 gpconfig设置参数值。
有关更多gpconfig的信息,可以参考Greenplum数据库工具指南。
更改允许的连接数
- 以Greenplum数据库管理员身份,登录Greenplum数据库的master节点主机,使用source命令加载$GPHOME/greenplum_path.sh文件信息。
设置max_connections参数取值。此gpconfig命令将segment实例节点上的参数值设置为1000,将master节点上的参数值设置为200。
$ gpconfig -c max_connections -v 1000 -m 200
该参数值segement节点上的必须大于master节点上的。推荐segment节点的max_connections参数值是master节点的5-10倍。
设置max_prepared_transactions参数取值。此gpconfig命令将master节点和segment实例节点上的取值都这会为200.
$ gpconfig -c max_prepared_transactions -v 200
segment节点的max_prepared_transactions参数值必须大于等于master节点的max_connections参数值。
停止并重启Greenplum数据库系统。
$ gpstop -r
可以使用gpconfig -s选项,检查master和segment节点的参数值。此gpconfig命令显示max_connections参数的取值。
$ gpconfig -s max_connections
Note: 调高这些参数的取值,可能会导致Greenplum数据库需要更多的共享内存。为了缓和这种影响,考虑调小其他内存相关的参数,如gp_cached_segworkers_threshold参数。
加密客户端/服务器连接
为连接到Greenplum数据库的客户端启用SSL,以加密客户端和数据库之间通过网络传递的数据。
Greenplum数据库原生支持支持客户端和master服务器之间的SSL连接。SSL连接可以防止第三方对数据包进行嗅探,还可以防止中间人攻击。 只要客户端连接通过不安全的链接就应该使用SSL,并且在使用客户端证书认证时必须使用SSL。
要启用SSL,需要在客户端和master服务器系统上安装OpenSSL。通过在master节点的postgresql.conf文件,设置服务器配置参数ssl=on,可以让Greenplum数据库启动时启用SSL。当以SSL模式启动时,服务器将会在master节点的数据目录中查找服务器私钥server.key文件和服务器证书server.crt文件。在开启SSL的Greenplum数据库系统启动之前,确保这些文件已经正确地设置好。
Important: 请勿使用密码保护私钥。服务器不会提示输入私钥的密码,如果需要密码,则数据库会启动失败并显示错误。
可以使用自签名证书进行测试,但在生产中应使用由数字证书认证机构(CA)签名的证书,以便客户端可以验证服务器的身份。可以使用全球CA或本地CA。如果所有客户端在组织内部本地,则建议使用本地CA。
创建一个仅用于测试没有密码的自签名证书
要为服务器快速创建自签名证书以进行测试,请使用如下OpenSSL命令:
# openssl req -new -text -out server.req
输入提示所要求的信息。请务必输入本地主机名作为Common Name。私钥保护密码可以留空。
该程序将生成一个受密码保护的密钥,并且不接受长度小于四个字符的密码。
要把这个证书用于Greenplum数据库,用下列命令移除该密码:
# 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文档所示。