使用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认证:
-
验证系统满足将Kerberos用于Greenplum数据库的先决条件。见在Greenplum数据库中使用Kerberos的必要条件。
-
设置或者确定一台用于认证的Kerberos密钥分发中心(KDC)服务器。见安装和配置一台Kerberos KDC服务器。
-
在KDC服务器上的一个Kerberos数据库中,设置一个Kerberos realm和该服务器上的principal。对于Greenplum数据库,一个principal就是一个使用Kerberos认证的Greenplum数据库角色。在Kerberos数据库中,一个realm把作为Greenplum数据库角色的Kerberos principal组织在一起。
-
为Greenplum数据库创建Kerberos keytab文件。要访问Greenplum数据库,创建一个只有Kerberos和Greenplum数据库知道的服务密钥。在Kerberos服务器上,该服务密钥被存储在Kerberos数据库中。
在Greenplum数据库的Master上,该服务密钥被存储在密钥表中,就是被称为keytab的文件。服务密钥通常被存储在keytab文件/etc/krb5.keytab中。这个服务密钥等效于该服务的口令,并且必须保持安全。打算对该服务只读的数据被使用这个密钥加密。
-
在Greenplum数据库的Master上安装Kerberos客户端包和keytab文件。
-
为使用该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)服务器。
-
安装Kerberos服务器包:
sudo yum install krb5-libs krb5-server krb5-workstation
-
编辑/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]小节中的kdc和admin_server键指定运行Kerberos服务器的主机(kerberos-gpdb)和端口。可以用IP来代替主机名。
如果Kerberos服务器还管理者其他realm的认证,需要把KRB.GREENPLUM.COM realm添加在kdc.conf文件中的[realms]和[domain_realm]小节中。有关kdc.conf文件的信息请见Kerberos文档。
-
要创建一个Kerberos KDC数据库,运行kdb5_util。
kdb5_util的create选项创建数据库来为这个KDC服务器所管理的Kerberos realm存储密钥。-s选项创建一个存储文件。如果没有这个存储文件,每次KDC服务器启动都会要求口令。
-
用kadmin.local工具向该KDC数据库增加一个管理用户。因为其本身并不依赖于Kerberos认证,kadmin.local工具允许用户对本地的Kerberos服务器增加一个初始的管理用户。要对KDC数据库增加一个作为管理用户的用户gpadmin:
kadmin.local -q "addprinc gpadmin/admin"
大部分用户不需要对Kerberos服务器的管理访问。它们可以使用
kadmin来管理它们自己的principal(例如,更改它们自己的密码)。有关
kadmin的信息请见
Kerberos文档。
-
如果需要,编辑/var/kerberos/krb5kdc/kadm5.acl文件对gpadmin授予适当的权限。
-
启动Kerberos守护进程:
/sbin/service krb5kdc start
/sbin/service kadmin start
-
在重启时自动启动Kerberos:
/sbin/chkconfig krb5kdc on
/sbin/chkconfig kadmin on
在KDC数据库中创建Greenplum数据库角色
为Greenplum数据库增加principal到Kerberos realm。
在交互模式中启动kadmin.local,然后增加两个principal到Greenplum数据库的Realm。
-
在交互模式中启动kadmin.local:
-
增加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是必需的。
-
用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主机。
-
用quit命令退出kadmin.local交互模式:
kadmin.local: quit
安装和配置Kerberos客户端
在Greenplum数据库的Master主机上安装Kerberos客户端的步骤。
在Greenplum数据库的Master上安装Kerberos客户端并且配置该Kerberos客户端。
-
在Greenplum数据库的Master上安装Kerberos包。
sudo yum install krb5-libs krb5-workstation
-
确保/etc/krb5.conf文件和Kerberos服务器上的相同。
-
把Kerberos服务器上生成的gpdb-kerberos.keytab文件复制到Greenplum数据库的Master主机上。
-
用Kerberos的工具kdestroy移除任何已有的ticket。作为root运行该工具。
-
使用Kerberos工具kinit为gpadmin/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
-
使用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客户端。
-
在数据库postgres中为被用作数据库管理员的Kerberos的principal创建一个Greenplum数据库管理员。下面的例子使用gpamin/kerberos-gpdb。
psql postgres -c 'create role "gpadmin/kerberos-gpdb" login superuser;'
在数据库postgres装创建的这个角色将在后面创建的任何新Greenplum数据库中都可用。
-
修改postgresql.conf以指定keytab文件的位置。例如,把下面这一行增加到中指定文件夹/home/gpadmin作为keytab文件gpdb-kerberos.keytab的位置。
krb_server_keyfile = '/home/gpadmin/gpdb-kerberos.keytab'
-
修改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
-
使用kinit创建一个ticket并且用klist显示Kerberos ticket缓存中的ticket。
-
作为一次测试,作为带有Kerberos证书gpadmin/kerberos-gpdb的gpadmin角色登入到数据库:
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 principal
adminuser/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文档中的用户名映射。
-
如果一个Kerberos principal不是一个Greenplum数据库用户,当该用户尝试登入到数据库中时,psql命令行会显示类似于下面的消息:
psql: krb5_sendauth: Bad response
该principal必须被作为一个Greenplum数据库用户添加。
为JDBC设置带Kerberos的Greenplum数据库
启用对Greenplum数据库的经Kerberos认证的JDBC访问。
可以配置Greenplum数据库来使用Kerberos运行用户定义的Java函数。
-
确保在Greenplum数据库的Master上安装和配置了Kerberos。见安装和配置Kerberos客户端。
-
在文件夹/home/gpadmin中创建文件.java.login.config并且把下面的文本加到该文件中:
pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
useTicketCache=true
debug=true
client=true;
};
-
创建一个使用Kerberos认证连接到Greenplum数据库的Java应用。下面的数据库连接URL的例子使用了一个PostgreSQL的JDBC驱动并且指定了用于Kerberos认证的参数:
jdbc:postgresql://mdw:5432/mytest?kerberosServerName=postgres
&jaasApplicationName=pgjdbc&user=gpadmin/kerberos-gpdb
指定的参数名和值取决于Java应用如何执行Kerberos认证。
-
通过从Greenplum数据库运行一个Java应用的例子来测试Kerberos登录。