使用Kerberos认证

可以用一台Kerberos认证服务器控制对Greenplum数据库的访问。

Greenplum数据库支持带Kerberos认证的通用安全服务应用程序接口(GSSAPI)。GSSAPI为支持它的系统提供了自动认证(单点登录)。在Greenplum数据库的配置文件pg_hba.conf中指定要求使用Kerberos认证的Greenplum数据库用户(角色)。当一个角色尝试登录到Greenplum数据库时,如果Kerberos认证不可用,则登录失败。

Kerberos提供一种安全的、加密的认证服务。它不加密客户端和数据库之间交换的数据并且不提供授权服务。为了加密网络上交换的数据,必须使用SSL连接。要管理对Greenplum数据库及其对象(如方案和表)的访问的授权,需要使用pg_hba.conf文件中的设置和给予数据库中Greenplum数据库用户和角色的特权。有关管理授权的信息请见管理角色和特权

更多有关Kerberos的信息请见http://web.mit.edu/kerberos/.

在Greenplum数据库中使用Kerberos的必要条件

将Kerberos用于Greenplum数据库需要下列事项:

  • 使用krb5-server库的Kerberos密钥分发中心(KDC)
  • Kerberos的版本5的krb5-libs以及安装在Greenplum数据库的Master主机上的krb5-workstation包
  • 带有Kerberos支持的Greenplum数据库版本
  • Kerberos服务器和Greenplum数据库的Master主机上的系统时间必须同步(在两种服务器上安装Linux的ntp包)
  • Kerberos服务器和Greenplum数据库的Master之间的网络连接
  • 在Red Hat Enterprise Linux 6.x上使用Kerberos认证的JDBC要求Java 1.7.0_17或者其后的版本

对Greenplum数据库启用Kerberos认证

完成下列任务就可以设置Greenplum数据库的Kerberos认证:

  1. 验证系统满足将Kerberos用于Greenplum数据库的先决条件。见在Greenplum数据库中使用Kerberos的必要条件
  2. 设置或者确定一台用于认证的Kerberos密钥分发中心(KDC)服务器。见安装和配置一台Kerberos KDC服务器
  3. 在KDC服务器上的一个Kerberos数据库中,设置一个Kerberos realm和该服务器上的principal。对于Greenplum数据库,一个principal就是一个使用Kerberos认证的Greenplum数据库角色。在Kerberos数据库中,一个realm把作为Greenplum数据库角色的Kerberos principal组织在一起。
  4. 为Greenplum数据库创建Kerberos keytab文件。要访问Greenplum数据库,创建一个只有Kerberos和Greenplum数据库知道的服务密钥。在Kerberos服务器上,该服务密钥被存储在Kerberos数据库中。

    在Greenplum数据库的Master上,该服务密钥被存储在密钥表中,就是被称为keytab的文件。服务密钥通常被存储在keytab文件/etc/krb5.keytab中。这个服务密钥等效于该服务的口令,并且必须保持安全。打算对该服务只读的数据被使用这个密钥加密。

  5. 在Greenplum数据库的Master上安装Kerberos客户端包和keytab文件。

  6. 为使用该keytab文件的Greenplum数据库Master节点上的gpadmin创建一个Kerberos ticket。这个ticket含有对Greenplum数据库授予访问的Kerberos认证证书。

使用Greenplum数据库上配置好的Kerberos认证,可以对PSQL和JDBC使用Kerberos。

还可以为运行在一个微软Windows系统上的客户端配置外部认证。

上级主题: 配置客户端认证

安装和配置一台Kerberos KDC服务器

在一台Red Hat Enterprise Linux主机上设置一台Kerberos密钥分发中心(KDC)服务器用于Greenplum数据库的步骤。

在一台Red Hat Enterprise Linux主机上按照下面的步骤安装和配置一台Kerberos密钥分发中心(KDC)服务器。

  1. 安装Kerberos服务器包:

    1. sudo yum install krb5-libs krb5-server krb5-workstation
  2. 编辑/etc/krb5.conf配置文件。下面的例子展示了一台带有一个默认KRB.GREENPLUM.COM realm的Kerberos服务器。

    1. [logging]
    2. default = FILE:/var/log/krb5libs.log
    3. kdc = FILE:/var/log/krb5kdc.log
    4. admin_server = FILE:/var/log/kadmind.log
    5. [libdefaults]
    6. default_realm = KRB.GREENPLUM.COM
    7. dns_lookup_realm = false
    8. dns_lookup_kdc = false
    9. ticket_lifetime = 24h
    10. renew_lifetime = 7d
    11. forwardable = true
    12. default_tgs_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    13. default_tkt_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    14. permitted_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    15. [realms]
    16. KRB.GREENPLUM.COM = {
    17. kdc = kerberos-gpdb:88
    18. admin_server = kerberos-gpdb:749
    19. default_domain = kerberos-gpdb
    20. }
    21. [domain_realm]
    22. .kerberos-gpdb = KRB.GREENPLUM.COM
    23. kerberos-gpdb = KRB.GREENPLUM.COM
    24. [appdefaults]
    25. pam = {
    26. debug = false
    27. ticket_lifetime = 36000
    28. renew_lifetime = 36000
    29. forwardable = true
    30. krb4_convert = false
    31. }

    The keys in the [realms]小节中的kdc和admin_server键指定运行Kerberos服务器的主机(kerberos-gpdb)和端口。可以用IP来代替主机名。

    如果Kerberos服务器还管理者其他realm的认证,需要把KRB.GREENPLUM.COM realm添加在kdc.conf文件中的[realms]和[domain_realm]小节中。有关kdc.conf文件的信息请见Kerberos文档

  3. 要创建一个Kerberos KDC数据库,运行kdb5_util。

    1. kdb5_util create -s

    kdb5_util的create选项创建数据库来为这个KDC服务器所管理的Kerberos realm存储密钥。-s选项创建一个存储文件。如果没有这个存储文件,每次KDC服务器启动都会要求口令。

  4. 用kadmin.local工具向该KDC数据库增加一个管理用户。因为其本身并不依赖于Kerberos认证,kadmin.local工具允许用户对本地的Kerberos服务器增加一个初始的管理用户。要对KDC数据库增加一个作为管理用户的用户gpadmin:

    1. kadmin.local -q "addprinc gpadmin/admin"

    大部分用户不需要对Kerberos服务器的管理访问。它们可以使用kadmin来管理它们自己的principal(例如,更改它们自己的密码)。有关kadmin的信息请见Kerberos文档

  5. 如果需要,编辑/var/kerberos/krb5kdc/kadm5.acl文件对gpadmin授予适当的权限。

  6. 启动Kerberos守护进程:

    1. /sbin/service krb5kdc start
    2. /sbin/service kadmin start
  7. 在重启时自动启动Kerberos:

    1. /sbin/chkconfig krb5kdc on
    2. /sbin/chkconfig kadmin on

在KDC数据库中创建Greenplum数据库角色

为Greenplum数据库增加principal到Kerberos realm。

在交互模式中启动kadmin.local,然后增加两个principal到Greenplum数据库的Realm。

  1. 在交互模式中启动kadmin.local:

    1. kadmin.local
  2. 增加principal:

    1. kadmin.local: addprinc gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
    2. kadmin.local: addprinc postgres/master.test.com@KRB.EXAMPLE.COM

    adprinc名会为每个principal提示要求密码。第一个addprinc创建了一个Greenplum数据库用户作为principal,gpadmin/kerberos-gpdb。第二个addprinc命令在Greenplum数据库的Master主机上创建postgres进程作为该Kerberos KDC中的一个principal。在对Greenplum数据库使用Kerberos认证时,这个principal是必需的。

  3. 用kadmin.local创建一个Kerberos keytab文件。下面的例子在当前目录中创建一个keytab文件gpdb-kerberos.keytab,其中有两个principal的认证信息。

    1. kadmin.local: xst -k gpdb-kerberos.keytab
    2. gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
    3. postgres/master.test.com@KRB.EXAMPLE.COM

    用户将把这个文件复制到Greenplum数据库的Master主机。

  4. 用quit命令退出kadmin.local交互模式:

    kadmin.local: quit

安装和配置Kerberos客户端

在Greenplum数据库的Master主机上安装Kerberos客户端的步骤。

在Greenplum数据库的Master上安装Kerberos客户端并且配置该Kerberos客户端。

  1. 在Greenplum数据库的Master上安装Kerberos包。

    1. sudo yum install krb5-libs krb5-workstation
  2. 确保/etc/krb5.conf文件和Kerberos服务器上的相同。

  3. 把Kerberos服务器上生成的gpdb-kerberos.keytab文件复制到Greenplum数据库的Master主机上。
  4. 用Kerberos的工具kdestroy移除任何已有的ticket。作为root运行该工具。

    1. sudo kdestroy
  5. 使用Kerberos工具kinit为gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM请求一个ticket来使用Greenplum数据库的Master上的keytab文件。 -t选项指定Greenplum数据库的Master上的keytab文件。

    1. # kinit -k -t gpdb-kerberos.keytab gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
  6. 使用Kerberos工具klist来显示Greenplum数据库的Master上Kerberos ticket缓存的内容。下面是一个例子:

    1. # klist
    2. Ticket cache: FILE:/tmp/krb5cc_108061
    3. Default principal: gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
    4. Valid starting Expires Service principal
    5. 03/28/13 14:50:26 03/29/13 14:50:26 krbtgt/KRB.GREENPLUM.COM @KRB.EXAMPLE.COM
    6. renew until 03/28/13 14:50:26

为PSQL设置带Kerberos的Greenplum数据库

配置一个Greenplum数据库以使用Kerberos。

在Greenplum数据库的Master上设置好Kerberos之后,可以配置Greenplum数据库来使用Kerberos。有关设置Greenplum数据库的Master的信息可见安装和配置Kerberos客户端

  1. 在数据库postgres中为被用作数据库管理员的Kerberos的principal创建一个Greenplum数据库管理员。下面的例子使用gpamin/kerberos-gpdb。

    1. psql postgres -c 'create role "gpadmin/kerberos-gpdb" login superuser;'

    在数据库postgres装创建的这个角色将在后面创建的任何新Greenplum数据库中都可用。

  2. 修改postgresql.conf以指定keytab文件的位置。例如,把下面这一行增加到中指定文件夹/home/gpadmin作为keytab文件gpdb-kerberos.keytab的位置。

    1. krb_server_keyfile = '/home/gpadmin/gpdb-kerberos.keytab'
  3. 修改Greenplum数据库文件pg_hba.conf以启用Kerberos支持。然后重启Greenplum数据库(gpstop -ar)。例如,在pg_hba.conf中增加下面的行会增加GSSAPI和Kerberos支持。krb_realm的值是用于对Greenplum数据库认证的Kerberos realm。

    1. host all all 0.0.0.0/0 gss include_realm=0 krb_realm=KRB.GREENPLUM.COM

    有关pg_hba.conf文件的信息请见Postgres文档中的pg_hba.conf文件

  4. 使用kinit创建一个ticket并且用klist显示Kerberos ticket缓存中的ticket。

  5. 作为一次测试,作为带有Kerberos证书gpadmin/kerberos-gpdb的gpadmin角色登入到数据库:

    1. psql -U "gpadmin/kerberos-gpdb" -h master.test postgres

    可以在pg_ident.conf文件中定义一个用户名映射并且在pg_hba.conf文件中指定该映射以简化登入Greenplum数据库的过程。例如,这个psql命令作为Kerberos principal adminuser/mdw.proddb登入到mdw.proddb上的默认Greenplum数据库:

    1. $ psql -U "adminuser/mdw.proddb" -h mdw.proddb

    如果默认用户是adminuser,可以配置pg_ident.conf文件和pg_hba.conf文件,这样adminuser可以在不指定-U选项的情况下作为Kerberos principaladminuser/mdw.proddb登入到数据库中:

    1. $ psql -h mdw.proddb

    下列用户名映射被定义在Greenplum数据库文件$MASTER_DATA_DIRECTORY/pg_ident.conf中:

    1. # MAPNAME SYSTEM-USERNAME GP-USERNAME
    2. mymap /^(.*)mdw\.proddb$ adminuser

    可以在pg_hba.conf文件中指定该映射为启用Kerberos支持的行的一部分:

    1. host all all 0.0.0.0/0 krb5 include_realm=0 krb_realm=proddb map=mymap

    更多有关指定用户名映射的信息,请见Postgres文档中的用户名映射

  6. 如果一个Kerberos principal不是一个Greenplum数据库用户,当该用户尝试登入到数据库中时,psql命令行会显示类似于下面的消息:

    1. psql: krb5_sendauth: Bad response

    该principal必须被作为一个Greenplum数据库用户添加。

为JDBC设置带Kerberos的Greenplum数据库

启用对Greenplum数据库的经Kerberos认证的JDBC访问。

可以配置Greenplum数据库来使用Kerberos运行用户定义的Java函数。

  1. 确保在Greenplum数据库的Master上安装和配置了Kerberos。见安装和配置Kerberos客户端
  2. 在文件夹/home/gpadmin中创建文件.java.login.config并且把下面的文本加到该文件中:

    1. pgjdbc {
    2. com.sun.security.auth.module.Krb5LoginModule required
    3. doNotPrompt=true
    4. useTicketCache=true
    5. debug=true
    6. client=true;
    7. };
  3. 创建一个使用Kerberos认证连接到Greenplum数据库的Java应用。下面的数据库连接URL的例子使用了一个PostgreSQL的JDBC驱动并且指定了用于Kerberos认证的参数:

    1. jdbc:postgresql://mdw:5432/mytest?kerberosServerName=postgres
    2. &jaasApplicationName=pgjdbc&user=gpadmin/kerberos-gpdb

    指定的参数名和值取决于Java应用如何执行Kerberos认证。

  4. 通过从Greenplum数据库运行一个Java应用的例子来测试Kerberos登录。