配置客户端认证

配置客户端认证

本主题讲解如何为Greenplum数据库配置客户端访问和身份验证。

当首次初始化Greenplum数据库系统时,系统包含一个预定义的超级用户角色。此角色与初始化Greenplum数据库系统的操作系统用户具有相同的名称。此角色被曾为gpadmin。默认情况下,系统被配置为仅允许从本地使用gpadmin角色连接到数据库。如果要允许其他角色访问或者允许来自远程主机的连接,则必须配置Greenplum数据库以允许此类访问。本节介绍如何为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

下表描述了每个字段的含义。

Table 1. pg_hba.conf文件
字段 描述
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

  1. 使用文本编辑器,打开$MASTER_DATA_DIRECTORY/pg_hba.conf 文件。
  2. 针对每种允许的连接类型添加一行记录。文件中的记录按顺序读取,因此记录的顺序很重要。典型的,较早的记录将具有较严格的的连接匹配参数和较弱的身份验证方法,而较靠后记录将具有更宽松的匹配参数和更抢的身份验证方法。例如:
    # 允许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"
  3. 保存并关闭文件。
  4. 重新加载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数据库工具指南

更改允许的连接数

  1. 以Greenplum数据库管理员身份,登录Greenplum数据库的master节点主机,使用source命令加载$GPHOME/greenplum_path.sh文件信息。
  2. 设置max_connections参数取值。此gpconfig命令将segment实例节点上的参数值设置为1000,将master节点上的参数值设置为200。
    $ gpconfig -c max_connections -v 1000 -m 200
    

    该参数值segement节点上的必须大于master节点上的。推荐segment节点的max_connections参数值是master节点的5-10倍。

  3. 设置max_prepared_transactions参数取值。此gpconfig命令将master节点和segment实例节点上的取值都这会为200.
    $ gpconfig -c max_prepared_transactions -v 200
    

    segment节点的max_prepared_transactions参数值必须大于等于master节点的max_connections参数值。

  4. 停止并重启Greenplum数据库系统。
    $ gpstop -r
    
  5. 可以使用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文档所示。