本文记述Greenplum使用LDAP做身份验证的过程。
略过搭建LDAP服务器部分
gpdb master做设置
Gpdb master 实际是作为ldap客户端,需要安装 # yum install -y openldap-clients
Gpdb创建数据库用户user4,并对testdb.test1表有权限。
在LDAP服务器上向ldap中增加账户
创建ldif文件内容为
dn:dc=gp1,dc=idap
objectClass:top
objectClass:dcObject
objectClass:organization
dc:gp1
o:gp1
dn:ou=users,dc=gp1,dc=idap
objectClass:organizationalUnit
ou:users
dn:uid=user4-2,ou=users,dc=gp1,dc=idap
objectClass:inetOrgPerson
userid:user4
cn:user4-2
sn:user4-2
userPassword:passwd4-2
调用命令 # ldapadd -x -W -D "cn=ldapadm,dc=idap" -f ./b.ldif
pg_hba.conf 配置文件
在pg_hba.conf里面有两种配置方式,
一种是将登录用户名作为dn的一部分,
host all user4 0.0.0.0/0 ldap ldapserver=idap-66 ldapprefix="uid=" ldapsuffix=",ou=users,dc=gp1,dc=idap"
另一种是用户名可以不在dn里面,这样更灵活一些(采用这种)
host all user4 10.47.0.153/32 ldap ldapserver=idap-66 ldapbasedn="uid=user4-2,ou=users,dc=gp1,dc=idap" ldapbinddn="cn=ldapadm,dc=idap" ldapbindpasswd="WOH/BJryZ1cdeG4dRpHyc9vS5dl70DYw" ldapsearchattribute="userid"
JDBC客户端代码
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://10.110.18.241/testdb";
String pwd = "password123";
Connection conn = DriverManager.getConnection(url, "user4", pwd);
身份验证的逻辑
客户端将user4发送到greenplum,找到对应的配置项,即 host all user4 ** 。
发现验证方式是ldap,即通过属性ldapserver dn binddn passwd等连接ldap,查找到user4-2条目(属性userid=user4) 则成功了第一步,第二步验证密码,即将jdbc客户端的密码与user4-2.userPassword 进行比较。
数据库用户登录的密码不再是保存在数据库了。
数据库用户登录的密码可以在ldap 上通过命令ldappasswd修改,即修改了属性userPassword的值
注意 这里密码从客户端到GPmaster是通过明文传输的。使用SSL通道更好些。