使用Kerberos认证

使用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服务器包:
    sudo yum install krb5-libs krb5-server krb5-workstation
  2. 编辑/etc/krb5.conf配置文件。下面的例子展示了一台带有一个默认KRB.GREENPLUM.COM realm的Kerberos服务器。
    [logging]
     default = FILE:/var/log/krb5libs.log
     kdc = FILE:/var/log/krb5kdc.log
     admin_server = FILE:/var/log/kadmind.log
    
    [libdefaults]
     default_realm = KRB.GREENPLUM.COM
     dns_lookup_realm = false
     dns_lookup_kdc = false
     ticket_lifetime = 24h
     renew_lifetime = 7d
     forwardable = true
     default_tgs_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
     default_tkt_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
     permitted_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    
    [realms]
     KRB.GREENPLUM.COM = {
      kdc = kerberos-gpdb:88
      admin_server = kerberos-gpdb:749
      default_domain = kerberos-gpdb
     }
    
    [domain_realm]
     .kerberos-gpdb = KRB.GREENPLUM.COM
     kerberos-gpdb = KRB.GREENPLUM.COM
    
    [appdefaults]
     pam = {
        debug = false
        ticket_lifetime = 36000
        renew_lifetime = 36000
        forwardable = true
        krb4_convert = false
     }
    

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

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

  3. 要创建一个Kerberos KDC数据库,运行kdb5_util
    kdb5_util create -s
    kdb5_utilcreate选项创建数据库来为这个KDC服务器所管理的Kerberos realm存储密钥。-s选项创建一个存储文件。如果没有这个存储文件,每次KDC服务器启动都会要求口令。
  4. kadmin.local工具向该KDC数据库增加一个管理用户。因为其本身并不依赖于Kerberos认证,kadmin.local工具允许用户对本地的Kerberos服务器增加一个初始的管理用户。要对KDC数据库增加一个作为管理用户的用户gpadmin
    kadmin.local -q "addprinc gpadmin/admin"
    大部分用户不需要对Kerberos服务器的管理访问。它们可以使用kadmin来管理它们自己的principal(例如,更改它们自己的密码)。有关kadmin的信息请见Kerberos文档
  5. 如果需要,编辑/var/kerberos/krb5kdc/kadm5.acl文件对gpadmin授予适当的权限。
  6. 启动Kerberos守护进程:
    /sbin/service krb5kdc start
    /sbin/service kadmin start
  7. 在重启时自动启动Kerberos:
    /sbin/chkconfig krb5kdc on
    /sbin/chkconfig kadmin on

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

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

在交互模式中启动kadmin.local,然后增加两个principal到Greenplum数据库的Realm。
  1. 在交互模式中启动kadmin.local
    kadmin.local
  2. 增加principal:
    kadmin.local: addprinc gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
    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的认证信息。
    kadmin.local: xst -k gpdb-kerberos.keytab
        gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
        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包。
    sudo yum install krb5-libs krb5-workstation
  2. 确保/etc/krb5.conf文件和Kerberos服务器上的相同。
  3. 把Kerberos服务器上生成的gpdb-kerberos.keytab文件复制到Greenplum数据库的Master主机上。
  4. 用Kerberos的工具kdestroy移除任何已有的ticket。作为root运行该工具。
    sudo kdestroy
  5. 使用Kerberos工具kinitgpadmin/kerberos-gpdb@KRB.EXAMPLE.COM请求一个ticket来使用Greenplum数据库的Master上的keytab文件。 -t选项指定Greenplum数据库的Master上的keytab文件。
    # kinit -k -t gpdb-kerberos.keytab gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
  6. 使用Kerberos工具klist来显示Greenplum数据库的Master上Kerberos ticket缓存的内容。下面是一个例子:
    # klist
    Ticket cache: FILE:/tmp/krb5cc_108061
    Default principal: gpadmin/kerberos-gpdb@KRB.EXAMPLE.COM
    Valid starting     Expires            Service principal
    03/28/13 14:50:26  03/29/13 14:50:26  krbtgt/KRB.GREENPLUM.COM     @KRB.EXAMPLE.COM
        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
    psql postgres -c 'create role "gpadmin/kerberos-gpdb" login superuser;'
    
    在数据库postgres装创建的这个角色将在后面创建的任何新Greenplum数据库中都可用。
  2. 修改postgresql.conf以指定keytab文件的位置。例如,把下面这一行增加到中指定文件夹/home/gpadmin作为keytab文件gpdb-kerberos.keytab的位置。
    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。
    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-gpdbgpadmin角色登入到数据库:
    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数据库:
    $ psql -U "adminuser/mdw.proddb" -h mdw.proddb
    如果默认用户是adminuser,可以配置pg_ident.conf文件和pg_hba.conf文件,这样adminuser可以在不指定-U选项的情况下作为Kerberos principaladminuser/mdw.proddb登入到数据库中:
    $ psql -h mdw.proddb

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

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

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

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

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

  6. 如果一个Kerberos principal不是一个Greenplum数据库用户,当该用户尝试登入到数据库中时,psql命令行会显示类似于下面的消息:
    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并且把下面的文本加到该文件中:
    pgjdbc {
      com.sun.security.auth.module.Krb5LoginModule required
      doNotPrompt=true
      useTicketCache=true
      debug=true
      client=true;
    };
  3. 创建一个使用Kerberos认证连接到Greenplum数据库的Java应用。下面的数据库连接URL的例子使用了一个PostgreSQL的JDBC驱动并且指定了用于Kerberos认证的参数:
    jdbc:postgresql://mdw:5432/mytest?kerberosServerName=postgres
    &jaasApplicationName=pgjdbc&user=gpadmin/kerberos-gpdb
    指定的参数名和值取决于Java应用如何执行Kerberos认证。
  4. 通过从Greenplum数据库运行一个Java应用的例子来测试Kerberos登录。