使用Kerberos认证
您可以使用Kerberos认证服务器控制对Greenplum数据库的访问。
Greenplum数据库支持使用Kerberos认证的通用安全服务应用程序接口(GSSAPI)。 GSSAPI为支持它的系统提供了自动身份认证(单点登录)功能。 可以在Greenplum数据库配置文件pg_hba.conf中指定需要Kerberos身份认证的Greenplum数据库用户或角色。 当角色尝试登录Greenplum数据库时,如果Kerberos身份认证不可用,则登录失败。
Kerberos提供一种安全的、加密的认证服务。 它不加密客户端和数据库之间传输的数据,不提供授权服务。 如果要网络传输的数据,可以使用SSL连接。 如果要管理Greenplum数据库及对象的访问权限,可以在pg_hba.conf文件中进行设置,为数据库中的Greenplum数据库用户和角色的授权。 更多有关Kerberos的信息,可以参考管理角色与权限.
For more information about Kerberos, see http://web.mit.edu/kerberos/。
先决条件
在为Greenplum数据库配置Kerberos身份认证之前,请确保
- 您可以识别用于Kerberos身份认证的KDC服务器和用于Greenplum数据库系统的Kerberos域。
- 如果您计划使用MIT Kerberos的KDC服务器但尚未配置它,参阅安装和配置Kerberos KDC服务器的示例说明
- 如果您使用现有的Active Directory KDC服务器,须确保具有:
- 在AD KDC服务器上安装所有Active Directory服务角色。
- 启用LDAP服务。
- 系统时间在Kerberos密钥分发中心(KDC)服务器和Greenplum数据库主服务器之间是同步的。 例如,在两台服务器上安装NTPntp软件包。
- 在KDC服务器和Greenplum数据库master主机之间存在网络连接。
- 所有Greenplum数据库主机上都安装了Java 1.7.0_17或更高版本。 在Red Hat Enterprise Linux 6.x或7.x上使用要使用Kerberos认证的JDBC,需要安装Java 1.7.0_17或更高版本。
步骤
以下是完成为Greenplum数据库设置Kerberos身份认证的任务步骤。
- 在KDC数据库中创建Greenplum数据库的主体(Principal)
- 在master主机安装Kerberos客户端
- 使用Kerberos身份认证配置Greenplum数据库
- 将Kerberos主体映射为Greenplum数据库角色
- 为Greenplum数据库配置JDBC的Kerberos身份认证
- 在Windows上为Greenplum数据库客户端配置Kerberos
- 使用活动目录配置客户端身份认证
Parent topic: 配置客户端认证
在KDC数据库中创建Greenplum数据库的主体(Principal)
创建服务主体,为Greenplum数据库服务和Kerberos管理主体,用于以gpadmin用户身份管理KDC数据库。
以root用户身份登录Kerberos KDC服务器。
$ ssh root@<kdc-server>
为Greenplum数据库服务创建一个主体。
# kadmin.local -q "addprinc -randkey postgres/mdw@GPDB.KRB"
-randkey选项可防止命令提示输入密码。
主体名称中postgres部分,匹配Greenplum数据库krb_srvname配置参数的值,默认情况值为postgres即可。
主体名称中主机名部分(译者注,示例中的mdw部分),必须匹配Greenplum数据库master主机上hostname命令的输出结果。 如果hostname命令显示的是完全限定域名(FQDN),例如显示mdw.example.com,应用到主体名称则为postgres/mdw.example.com@GPDB.KRB。
主体名称中GPDB.KRB部分,是Kerberos域(realm)的名称
为gpadmin/admin角色创建一个主体。
# kadmin.local -q "addprinc gpadmin/admin@GPDB.KRB"
此主体允许您以gpadmin身份登录时,管理KDC数据库。确保Kerberos的kadm.acl配置文件包含用于向此主体授予权限的ACL。例如,此ACL为GPDB.KRB域中所有管理员用户,授予所有权限。
*/admin@GPDB.KRB *
使用kadmin.local创建密钥表(keytab)文件。以下示例在当前目录中创建密钥表文件gpdb-kerberos.keytab,并包含Greenplum数据库服务主体和gpadmin/dmin主体的身份认证信息。
# kadmin.local -q "ktadd -k gpdb-kerberos.keytab postgres/mdw@GPDB.KRB gadmin/admin@GPDB.KRB"
将密钥表文件复制到master主机。
# scp gpdb-kerberos.keytab gpadmin@mdw:~
在master主机安装Kerberos客户端
在Greenplum数据库master服务器上安装Kerberos客户端实用程序和依赖库。
在Greenplum数据库master服务器上安装Kerberos软件包。
$ sudo yum install krb5-libs krb5-workstation
从KDC服务器拷贝/etc/krb5.conf文件到Greenplumm数据库aster主机相同目录下。
使用Kerberos身份认证配置Greenplum数据库
使用Kerberos配置Greenplum数据库。
以gpadmin用户身份登录Greenplum数据库master主机。
$ ssh gpadmin@<master>
$ source /usr/local/greenplum-db/greenplum_path.sh
设置从KDC服务器复制的密钥表文件的所有者和权限。
$ chown gpadmin:gpadmin /home/gpadmin/gpdb-kerberos.keytab
$ chmod 400 /home/gpadmin/gpdb-kerberos.keytab
通过设置Greenplum数据库krb_server_keyfile服务器配置参数,配置密钥表文件的位置。 该gpconfig命令指定将/home/gpadmin文件夹为为密钥表文件gpdb-kerberos.keytab的位置。
$ gpconfig -c krb_server_keyfile -v '/home/gpadmin/gpdb-kerberos.keytab'
修改Greenplum数据库的pg_hba.conf文件,启用Kerberos支持。例如,添加以下行到pg_hba.conf文件,为来自同一网络上的所有用户和主机的连接请求添加GSSAPI和Kerberos身份认证支持。
host all all 0.0.0.0/0 gss include_realm=0 krb_realm=GPDB.KRB
设置krb_realm选项为某个域名称,确保只有该域下的用户才能使用Kerberos成功进行身份认证。 设置include_realm选项为0为身份认证通过的用户名去除域部分。关于pg_hba.conf文件更多信息,参阅PostgreSQL文档中的关于pg_hba.conf文件内容。
更新krb_server_keyfile和pg_hba.conf后,重启Greenplum数据库。
$ gpstop -ar
创建Greenplum数据库超级用户角色gpadmin/admin。
$ createuser gpadmin/admin
Shall the new role be a superuser? (y/n) y
此数据库角色的Kerberos密钥文件可以从KDC服务器复制。
使用kinit创建票据,使用klist显示Kerberos票证缓存中所有票据。
$ LD_LIBRARY_PATH= kinit -k -t /home/gpadmin/gpdb-kerberos.keytab gpadmin/admin@GPDB.KRB
$ LD_LIBRARY_PATH= klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: gpadmin/admin@GPDB.KRB
Valid starting Expires Service principal
06/13/2018 17:37:35 06/14/2018 17:37:35 krbtgt/GPDB.KRB@GPDB.KRB
, LD_LIBRARY_PATH 环境变量设置为包含Greenplum数据库 LIB目录,包括Kerberos库。这可能会导致Kerberos实用程序命令,如使用kinit 和 klist的由于版本冲突而失败。解决方案是在您获取Kerberos实用程序之前运行Kerberos实用程序 greenplum-db_path.sh 文件或暂时取消设置 LD_LIBRARY_PATH 执行Kerberos实用程序时的变量,如示例中所示。
Note: 通过加载greenplum-db_path.sh脚本来设置Greenplum数据库环境时, 环境变量LD_LIBRARY_PATH 被设置为包含Greenplum数据库的lib目录, 目录中包含Kerberos库文件。 可能会导致Kerberos工具命令,如kinit何klist因为版本冲突而执行失败。 解决方案是在加载greenplum-db_path.sh脚本之前运行Kerberos工具程序,或暂时取消设置LD_LIBRARY_PATH变量再执行如上Kerberos工具程序。
作为测试,使用gpadmin/admin角色登录postgres数据库:
$ psql -U "gpadmin/admin" -h mdw postgres
psql (9.4.20)
Type "help" for help.
postgres=# select current_user;
current_user
---------------
gpadmin/admin
(1 row)
Note: 当您在master主机启动psql时,必须包含-h
选项, 强制使用TCP连接,因为使用本地连接时Kerberos认证不生效。
如果Kerberos主体不是Greenplum数据库用户, 用户尝试登录数据库时,则会显示类似的以下内容的消息显示在的psql命令行:
psql: krb5_sendauth: Bad response
必须将主体添加为Greenplum数据库用户。
将Kerberos主体映射为Greenplum数据库角色
要连接到启用了Kerberos身份认证的Greenplum数据库系统,用户首先使用kinit命令从KDC服务器请求授予票证,期间需要输入密码或者提供密钥表文件。 随后当用户连接到启用Kerberos的Greenplum数据库系统时,用户的Kerberos主题名称将是Greenplum数据库角色名称。 具体名称根据Greenplum数据库pg_hba.conf中受到在gss选项进行转换:
- 如果krb_realm=
选项存在, Greenplum数据库只接收指定域名下的Kerberos主体。 - 如果include_realm=0选项存在,the Greenplum数据库角色名是Kerberos主体名去除Kerberos域后部分。 如果include_realm=1选项被指定,Kerberos域不会从Greenplum数据库角色名中被剔除。 角色名必须使用Greenplum数据库的CREATE ROLE命令创建。
- 如果map=
选项被指定,将Kerberos主体名称与$MASTER_DATA_DIRECTORY/pg_ident.conf中指定的 标记匹配,根据第一个匹配项替换为Greenplum数据库角色名。
用户名称映射被定义在$MASTER_DATA_DIRECTORY/pg_ident.conf配置文件。 此示例定义了一个名为的映射MyMap中有两个条目。 本例中使用两条mymap记录,定义了两个名称映射。
# MAPNAME SYSTEM-USERNAME GP-USERNAME
mymap /^admin@GPDB.KRB$ gpadmin
mymap /^(.*)_gp)@GPDB.KRB$ \1
名称映射被指定在pg_hba.conf文件的Kerberos记录的可选项中
host all all 0.0.0.0/0 gss include_realm=0 krb_realm=GPDB.KRB map=mymap
第一个映射条目匹配Kerberos主体admin@GPDB.KRB,并替换为Greenplum数据库的gpadmin角色名。 第二个条目使用通配符匹配GPDB.KRB域下名称是_gp结尾的的Kerberos主体, 并替换为Kerberos主体名称的开始部分(译者注:_gp前面的部分)。 Greenplum数据库使用pg_ident.conf文件中第一个匹配的映射条目,因此条目的顺序很重要。
有关使用用户名映射的更多信息,请参阅PostgreSQL的文档的用户名映射。
为Greenplum数据库配置JDBC的Kerberos身份认证
使用JDBC访问启用Kerberos证的Greenplum数据库。
您可以配置Greenplum数据库使用Kerberos运行用户定义的Java函数。
确保在Greenplum数据库主机中,已经安装并配置了Kerberos。参阅在master主机安装Kerberos客户端。
在/home/gpadmin文件夹下 创建.java.login.config文件, 并在文件中添加如下内容:
pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
useTicketCache=true
debug=true
client=true;
};
创建一个Java应用,使用Kerberos认证连接到Greenplum数据库。 如下示例中数据库连接URL使用PostgreSQL的JDBC驱动,并指定了用于Kerberos认证的参数:
jdbc:postgresql://mdw:5432/mytest?kerberosServerName=postgres
&jaasApplicationName=pgjdbc&user=gpadmin/gpdb-kdc
指定的参数名和参数值取决于Java应用如何执行Kerberos认证。
运行Java应用示例,测试使用Kerberos登录Greenplum数据库。
安装和配置Kerberos KDC服务器
在Red Hat Enterprise Linux上,为Greenplum设置Kerberos密钥分发中心(KDC)服务器的步骤。
如果您没有KDC,参考如下步骤,在Red Hat Enterprise Linux主机上安装配置一个KDC服务,其域为GPDB.KRB。 本示例中KDC服务器的主机名是gpdb-kdc。
安装Kerberos服务器客户端软件包:
$ sudo yum install krb5-libs krb5-server krb5-workstation
编辑/etc/krb5.conf配置文件。如下示例展示的包含默认GPDB.KRB域配置的Kerberos服务。
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = GPDB.KRB
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]
GPDB.KRB = {
kdc = gpdb-kdc:88
admin_server = gpdb-kdc:749
default_domain = gpdb.krb
}
[domain_realm]
.gpdb.krb = GPDB.KRB
gpdb.krb = GPDB.KRB
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
在[realms]分布,kdc和admin_server键指定了Kerberos服务运行的域名(gpdb-kdc)和端口。可以用IP地址来代替主机名。
如果该Kerberos服务器还管理者其他域的认证, 需要在kdc.conf文件[realms]和[domain_realm] 部分添加GPDB.KRB域配置。关于kdc.conf文件更多信息,参阅Kerberos文档。
运行kdb5_util,创建Kerberos数据库。
# kdb5_util create -s
其kdb5_util的 create子命令创建数据库,为KDC服务器所管理的Kerberos域存储密钥。 其-s选项创建一个隐藏文件。如果没有这个隐藏文件,每次启动KDC服务时都需要输入密码
使用kadmin.local工具增加一个管理员用户到KDC数据库中。 因为工具本身并不依赖于Kerberos认证,kadmin.local工具 允许您为本地的Kerberos服务器增加一个初始的管理员用户。 运行如下命令,添加用户gpadmin作为管理员用户到KDC数据库中:
# kadmin.local -q "addprinc gpadmin/admin"
大部分用户不需要对Kerberos服务器的管理访问。 他们可以使用kadmin来管理自己的主体(例如,更改自己的密码)。 关于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