配置客户端认证

配置客户端认证

这一主题解释如何为Greenplum数据库配置客户端连接和认证。

当一个Greenplum数据库系统第一次被初始化时,该系统包含一个预定义的superuser角色。这个角色具有和初始化该Greenplum数据库系统的操作系统用户相同的名称。这个角色被称作gpadmin。默认情况下,该系统被配置为只允许来自gpadmin角色的到该数据库的本地连接。要允许任何其他角色连接或者允许来自远程主机的连接,需要配置Greenplum数据库来允许这类连接。

注意: PgBouncer连接池被与Greenplum数据库捆绑在一起。PgBouncer可以被配置来对通过连接池客户端连接到Greenplum数据库的用户做LDAP或者活动目录认证。详见使用PgBouncer连接池

允许到Greenplum数据库的连接

客户端访问和认证受到标准的PostgreSQL的基于主机的认证文件(pg_hba.conf)的控制。在Greenplum数据库中,Master实例的pg_hba.conf文件控制对Greenplum数据库系统的客户端访问及认证。Greenplum数据库的Segment也有pg_hba.conf文件,它们被配置来只允许来自Master主机的客户端连接并且永不接受客户端连接。不要在Segment上更改pg_hba.conf文件。

更多信息请见PostgreSQL文档中的pg_hba.conf文件

pg_hba.conf文件的一般格式是一组记录,每行一个。空行和任何注释字符#之后的文本会被忽略。第一个匹配行会被用来认证。在第一个匹配之后,后续的记录不会被考虑。如果客户端不能用第一个匹配记录中指定的方法认证,该连接会被拒绝。一个记录由多个被空格或者制表符分隔的域组成。如果域值被加上引号,域可以包含空格。记录不能跨越多行。每一个远程客户端访问记录具有如下的格式:

host   database   role   CIDR-address   authentication-method

每一个UNIX-域套接字记录具有如下的格式:

local   database   role   authentication-method

下面的表格描述了每个域的含义。

表 1. pg_hba.conf的域
描述
local 匹配尝试使用UNIX-域套接字的连接。如果没有这种类型的记录,则UNIX-域套接字连接不被允许。
host 匹配尝试使用TCP/IP的连接。除非用合适的listen_addresses服务器配置参数值启动,就不能进行远程TCP/IP连接。
hostssl 匹配尝试使用TCP/IP建立的连接,但只有用SSL加密建立该连接时才允许。必须通过设置ssl配置参数在服务器启动时启用SSL
hostnossl 匹配在不使用SSL的TCP/IP上建立的连接尝试。
database 指定这一记录匹配的数据库名。值all指定它匹配所有数据库。可以提供多个数据库名,用逗号分隔它们。在文件名前面放一个@,可以指定一个含有数据库名的单独的文件。
role 指定这一记录匹配的数据库角色名。值all指定它匹配所有角色。如果指定的角色是一个组并且希望该组中的所有成员都被包括在内,在该角色名前面放一个+。可以提供多个角色名,用逗号分隔它们。在文件名前面放一个@,可以指定一个含有角色名的单独的文件。
CIDR-address 指定这一记录匹配的客户端机器的IP地址范围。它包含一个标准点分十进制表示的IP地址和一个CIDR掩码长度。IP地址只能用数字指定,不能写成域或者主机名。掩码长度指示客户端IP地址必须匹配的高位位数。给定IP地址中,在这些位的右边必须是零。IP地址、/和CIDR掩码长度之间不能有任何空格。

典型的CIDR地址例子是:192.0.2.89/32是一个单一主机,192.0.2.0/24是一个小网络,10.6.0.0/16是一个大网络。要指定一个单一主机,对IPv4使用一个CIDR掩码32,对IPv6使用128。在一个网络地址中,不要省略拖尾的零。

IP-address

IP-mask

这些域可以被用作CIDR地址记号的一种替代。实际的掩码在一个单独的列中指定,而不是指定掩码长度。例如,255.255.255.255表示CIDR掩码长度32。这些域只适用于host、hostssl和hostnossl记录。
authentication-method 指定连接时使用的认证方法。Greenplum支持PostgreSQL 9.0支持的认证方法

编辑pg_hba.conf文件

这个例子展示了如何编辑Master的pg_hba.conf文件来允许所有主机上的远程客户端使用加密口令认证访问所有数据库。

注意: 对于一个更加安全的系统,考虑从Master的pg_hba.conf中移除所有使用trust认证的连接。信任认证意味着该角色不需要任何认证就可以被授予访问,因此会绕过所有的安保。如果系统有一个ident服务可用,将trust项替换为ident认证。

编辑pg_hba.conf

  1. 在一个文本编辑器中打开文件$MASTER_DATA_DIRECTORY/pg_hba.conf
  2. 对每一类想要允许的连接在该文件中增加一行。该文件中的记录会被顺序读取,因此记录的顺序是有意义的。典型的顺序是,越早出现的记录将具有越严格的连接匹配参数和越弱的认证方法,而越晚出现的记录将具有越宽松的匹配参数和越强的认证方法。例如:
    # allow the gpadmin user local access to all databases 
    # using ident authentication
    local   all   gpadmin   ident         sameuser
    host    all   gpadmin   127.0.0.1/32  ident
    host    all   gpadmin   ::1/128       ident
    # allow the 'dba' role access to any database from any 
    # host with IP address 192.168.x.x and use md5 encrypted 
    # passwords to authenticate the user
    # Note that to use SHA-256 encryption, replace md5 with 
    # password in the line below
    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
注意: 注意也可以通过按管理对象特权中所述设置对象特权来控制数据库访问。pg_hba.conf文件只控制谁能发起一个数据库会话以及如何认证那些连接。

限制并发连接

Greenplum数据库以每个连接为基础分配资源,因此推荐设置所允许的最大连接数。

要限制Greenplum数据库系统的活动并发会话的数量,可以配置max_connections服务器配置参数。这是一个local参数,意味着必须在Master、后备Master和每个Segment实例(主要和镜像)的postgresql.conf文件中设置它。Segment上的max_connections值应该是Master上的5-10倍。

在设置max_connections时,还必须设置依赖参数max_prepared_transactions。这个值必须至少和Master上的max_connections值一样大,而在Segment实例上应该被设置为和Master上一样的值。

例如:

  • $MASTER_DATA_DIRECTORY/postgresql.conf(包括后备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
    

    Segment上的值必须大于Master上的值。在Segment上的max_connections值应该是Master上的5-10倍。

  3. 设置max_prepared_transactions参数的值。这个gpconfig命令设置在Master和所有Segment上设置该值为200。
    $ gpconfig -c max_prepared_transactions -v 200 
    

    max_prepared_transactions的值必须大于或者等于Master上的max_connections

  4. 停止并且重启Greenplum数据库系统。
    $ gpstop -r
    
  5. 用户可以使用gpconfig -s选项检查Master和Segment上的参数值。这个gpconfig命令会显示max_connections参数的值。
    $ gpconfig -s max_connections 
    
注意:

调高这些参数的值可能会导致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数据库系统启动之前,这些文件必须被正确地设置好。

重要: 不要用一个密码保护该私钥。服务器不会提示要求一个密码用于私钥,如果需要一个这样的密码,数据库会启动失败并且给出一个错误。

可以用一个自签名的证书进行测试,但是生产中应该使用一个由数字证书认证机构(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文档