记述验证Greenplum使用Kerberos作登陆身份验证的过程java
略过kerberos服务端配置过程。linux
基础环境(linux)sql
10.110.18.84 idap-server-84.idap.com 安装了全部kerberos服务数据库
10.110.18.241 idap-241 gpdb master服务器
10.110.18.67 idap-67 模拟gpdb客户端登陆gpdbide
kerberos用户应如是设置(postgresql和gpdb文档)post
对数据库来讲须要设置两个kerberos帐号,测试
一个是数据库用户名,固然这个用户是在数据库里面实际建立好的ui
好比数据库用户为user4,则设置帐号为 user4@IDAP.COM ,格式是username@realm name;url
一个是postgres,这个名字对应于master上的postgresql.conf中 krb_srvname = 'postgres' ,
则设置帐号为 postgres/idap-241@IDAP.COM,格式是postgres/svrname@realm name
操做系统基本设置
作主机间互信(idap-server-84 的root与 idap-241的用户(root,gpadmin))
修改/etc/hosts文件
kerberos server增长
10.110.18.241 idap-241
gpdb master 增长
10.110.18.84 idap-server-84.idap.com
时钟同步(idap-server-84 与 idap-241) ntp
配置过程:
kerberos服务端配置
#kadmin.local
kadmin.local: addprinc user4@IDAP.COM
kadmin.local:addprinc postgres/idap-241@IDAP.COM
kadmin.local: xst -k gpdb-user4-7.keytab user4@IDAP.COM postgres/idap-241@IDAP.COM
而后复制生成的gpdb-user4-7.keytab到241上。由于是在gpadmin用户下使用,全部最好是拷贝到gpadmin home目录下且拥有全部权限
不然可能有以下错误 kinit: Permission denied while getting initial credentials
复制/etc/krb5.conf文件到241 /etc/下
kerberos客户端(gpdb master)
安装krb5客户端
#yum install krb5-libs krb5-workstation
从kerberos server 拷贝 /etc/krb5.conf文件到/etc/
安装票据(gpadmin用户下执行)
$kdestroy -A
$kinit -k -t /home/gpadmin/gpdb-user4-7.keytab postgres/idap-241@IDAP.COM
$kinit -k -t /home/gpadmin/gpdb-user4-7.keytab user4@IDAP.COM
kinit顺序多是有关的,验证失败留意是否有以下提示 provided user name (user4) and authenticated user name (postgres/idap-241) do not match
gpdb master配置
建立数据库用户 user4
修改postgresql.conf
krb_server_keyfile = '/home/gpadmin/gpdb-user4-7.keytab'
修改pg_hba.conf
host all all 0.0.0.0/0 gss include_realm=0 krb_realm=IDAP.COM
重启gpdb服务,使配置生效
PSQL登陆验证(在master上)
[gpadmin@idap-241 ~]$ psql -U user4 -h idap-241 template1
JDBC登陆验证(在master上)
建立配置文件文件 ~/.java.login.config ,路径和名称可有可无
pgjdbc{
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
useKeyTab=true
keyTab="/home/gpadmin/gpdb-user4-7.keytab"
useTicketCache=true
debug=true
principal="user4@IDAP.COM"
useFirstPass=true
isInitiator=true
client=true;
};
Java代码
String url = "jdbc:postgresql://idap-241/testdb?kerberosServerName=postgres&jaasApplicationName=pgjdbc&user=user4";
Connection conn = DriverManager.getConnection(url);
//注意这里没有要求输入密码;注意这里的user和pgjdbc config中配置的帐号是同样的。
注意 由于建立帐号为 postgres/idap-241@IDAP.COM ,因此这里也得用idap-241拼接URL,不然提示 服务器不匹配。好奇怪的感受。
测试
$java -jar App1.jar
JDBC登陆验证(在67机器上)
安装kerberos客户端,并配置票据
#yum install krb5-libs krb5-workstation
从kerberos服务器拷贝/etc/krb5.conf 到/etc/krb5.conf
从241拷贝keytab文件到/root/下
修改67 /etc/hosts 增长
10.110.18.84 idap-server-84.idap.com
10.110.18.241 idap-241
[root@hostname67 ~]# kinit -k -t gpdb-user4-7.keytab postgres/idap-241@IDAP.COM
[root@hostname67 ~]# kinit -k -t gpdb-user4-7.keytab user4@IDAP.COM
建立 /root/pgjdbc.login.conf 文件
内容为
pgjdbc{
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
useKeyTab=true
keyTab="/root/gpdb-user4-7.keytab"
useTicketCache=true
debug=true
principal="user4@IDAP.COM"
useFirstPass=true
isInitiator=true
client=true;
};
测试java客户端
[root@hostname67 ~]# java -Djava.security.auth.login.config=/root/pgjdbc.login.conf -jar App1.jar
基础知识很重要,官网文档很重要,细节很重要。测试遇到的坑多来自不够细心,胡乱假设,基础知识不通,文档看的不细