配置客户端认证

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

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


    • 通过对pg_hba.conf文件条目增加参数,可以用一台LDAP服务器以及可选的加密连接来控制对Greenplum数据库的访问。
    • 使用Kerberos认证
      可以用一台Kerberos认证服务器控制对Greenplum数据库的访问。

    • 可以配置Linux客户端应用来连接一个配置为用Kerberos认证的Greenplum数据库系统。
    • 为Windows客户端配置Kerberos
      可以配置微软的Windows客户端应用来连接一个配置为用Kerberos认证的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文件的一般格式是一组记录,每行一个。空行和任何注释字符#之后的文本会被忽略。第一个匹配行会被用来认证。在第一个匹配之后,后续的记录不会被考虑。如果客户端不能用第一个匹配记录中指定的方法认证,该连接会被拒绝。一个记录由多个被空格或者制表符分隔的域组成。如果域值被加上引号,域可以包含空格。记录不能跨越多行。每一个远程客户端访问记录具有如下的格式:

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

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

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

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

    编辑pg_hba.conf

    1. 在一个文本编辑器中打开文件$MASTER_DATA_DIRECTORY/pg_hba.conf。
    2. 对每一类想要允许的连接在该文件中增加一行。该文件中的记录会被顺序读取,因此记录的顺序是有意义的。典型的顺序是,越早出现的记录将具有越严格的连接匹配参数和越弱的认证方法,而越晚出现的记录将具有越宽松的匹配参数和越强的认证方法。例如:

      1. # allow the gpadmin user local access to all databases
      2. # using ident authentication
      3. host all gpadmin 127.0.0.1/32 ident
      4. host all gpadmin ::1/128 ident
      5. # allow the 'dba' role access to any database from any
      6. # host with IP address 192.168.x.x and use md5 encrypted
      7. # passwords to authenticate the user
      8. # password in the line below
      9. host all dba 192.168.0.0/32 md5
      10. # allow all roles access to any database from any
      11. # host and use ldap to authenticate the user. Greenplum role
      12. # names must match the LDAP common name.
      13. host all all 192.168.0.0/32 ldap ldapserver=usldap1
      14. ldapport=1389 ldapprefix="cn="
      15. ldapsuffix=",ou=People,dc=company,dc=com"
    3. 保存并关闭该文件。

      注意: 注意也可以通过按管理对象特权中所述设置对象特权来控制数据库访问。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)中:

      • 在所有Segment实例的SEGMENT_DATA_DIRECTORY/postgresql.conf中:

        1. max_connections=500
        2. 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。

        1. $ gpconfig -c max_connections -v 1000 -m 200

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

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

        1. $ gpconfig -c max_prepared_transactions -v 200

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

      4. 停止并且重启Greenplum数据库系统。

        1. $ 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命令:

      1. # openssl req -new -text -out server.req

      输入提示所要求的信息。一定要输入本地主机名作为Common Name。私钥保护密码可以留空。

      该程序将会生成一个被密码保护的密钥,并且不接受短于四个字符的密码。

      要把这个证书用于Greenplum数据库,用下列命令移除该密码:

      1. # openssl rsa -in privkey.pem -out server.key
      2. # rm privkey.pem

      在提示解锁现有密钥时输入旧的密码。

      然后,输入下列命令把该证书转变成一个自签名证书并且把该密钥和证书复制到该服务器会查找它们的位置上。

      最后,用下列命令更改该密钥上的权限。如果权限不如这样严格,服务器将会拒绝该文件。