上一篇BLOG介绍了OpenLDAP Server的配置,
本文将要讲一下ldap client的配置, 以及PostgreSQL的ldap认证方法.
ldap认证方法指的是通过ldap进行认证, 而非数据库本身的用户密码进行认证.
首先要确保PostgreSQL编译时带上了--with-ldap选项.
例如以下数据库不可用使用ldap认证, 因为带了
--without-ldap
被认证的用户必须在ldap服务端存在, 同时在数据库中也要存在, 但是数据库中的用户密码不被用作校验, 所以不需要指定密码.
在ldap中创建一个用户.
创建ldif
导入ldap
我们这里新增的用户在ldap中的DN是
查看postgresql csvlog确保pg_hba.conf的修改生效.
当数据库中不存在 new用户时, 使用111111这个密码登陆报角色不存在的错误.
创建这个用户, 不需要指定密码.
现在可以登陆了
修改用户的密码有效时间, 不会影响ldap认证
修改用户在数据库中的密码, 不影响ldap密码认证.
当然, 使用数据库中的密码是无法认证的
[参考]
postgres@db6-> pg_config --configure
'--prefix=/app/pgsql' '--with-pgport=1921' '--with-wal-segsize=64' '--with-perl' '--with-python' '--with-openssl' '--with-pam' '--without-ldap' '--with-libxml' '--with-libxslt' '--enable-thread-safety'
被认证的用户必须在ldap服务端存在, 同时在数据库中也要存在, 但是数据库中的用户密码不被用作校验, 所以不需要指定密码.
甚至可以指定数据库中的密码的到期日, 因为数据库中的密码不被用作校验, 所以限制数据库的密码到期不会限制用户是否能用.
首先介绍一下测试环境.
OpenLDAP server
172.16.3.150:389
PostgreSQL Server
172.16.3.39:1999
psql client
172.16.3.176
在ldap中创建一个用户.
生成用户密码
[root@db-172-16-3-150 ~]# slappasswd
New password: 111111
Re-enter new password: 111111
{SSHA}YrmLO/6mSZOkR+fCbtIbWHOAMoju9cCz
创建ldif
[root@db-172-16-3-150 ~]# vi user01.ldif
dn: uid=new,ou=People,dc=my-domain,dc=com
uid: new
cn: new
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
loginShell: /bin/bash
uidNumber: 503
gidNumber: 500
homeDirectory: /home/new
userPassword: {SSHA}YrmLO/6mSZOkR+fCbtIbWHOAMoju9cCz
导入ldap
[root@db-172-16-3-150 ~]# ldapadd -x -W -D "cn=Manager,dc=my-domain,dc=com" -f user01.ldif
我们这里新增的用户在ldap中的DN是
uid=new,ou=People,dc=my-domain,dc=com
PostgreSQL支持2种ldap的认证模式, simple bind和search
参考以下链接了解两种认证模式在pg_hba.conf中的配置方法.
配置数据库的pg_hba.conf, 我这里用simple bind的写法.
DN = prefix username suffix
prefix和suffix对应
ldapprefix
ldapsuffix
username对应客户端提交的用户名.
所以知道openldap中配置的DN的话, pg_hba.conf配置就非常简单了.
认证的话就是用到这个DN下的
userPassword.
因为pg_hba.conf是顺序匹配的, 所以为了方便, 直接在文件的最前面加一条
host all new 0.0.0.0/0 ldap ldapserver=172.16.3.150 ldapport=389 ldapprefix="uid=" ldapsuffix=",ou=People,dc=my-domain,dc=com"
pg93@db-172-16-3-39-> pg_ctl reload
server signaled
查看postgresql csvlog确保pg_hba.conf的修改生效.
2014-06-06 15:52:13.528 CST,,,5229,,53917265.146d,3,,2014-06-06 15:48:53 CST,,0,LOG,00000,"received SIGHUP, reloading configuration files",,,,,,,,"SIGHUP_handler, postmaster.c:2294",""
当数据库中不存在 new用户时, 使用111111这个密码登陆报角色不存在的错误.
postgres@db5-> psql -h 172.16.3.39 -p 1999 -U new postgres
Password for user new:
psql: FATAL: role "new" does not exist
创建这个用户, 不需要指定密码.
[root@db-172-16-3-39 postgresql-9.3.1]# su - pg93
pg93@db-172-16-3-39-> psql
psql (9.3.1)
Type "help" for help.
digoal=# create role new nosuperuser login;
CREATE ROLE
现在可以登陆了
postgres@db5-> psql -h 172.16.3.39 -p 1999 -U new postgres
Password for user new:
psql (9.1.3, server 9.3.1)
WARNING: psql version 9.1, server version 9.3.
Some psql features might not work.
Type "help" for help.
postgres=>
修改用户的密码有效时间, 不会影响ldap认证
digoal=# alter role new valid until '1970-01-01';
ALTER ROLE
digoal=# \du+ new
List of roles
Role name | Attributes | Member of | Description
-----------+---------------------------------------------+-----------+-------------
new | Password valid until 1970-01-01 00:00:00+08 | {} |
digoal=#
postgres@db5-> psql -h 172.16.3.39 -p 1999 -U new postgres
Password for user new:
psql (9.1.3, server 9.3.1)
WARNING: psql version 9.1, server version 9.3.
Some psql features might not work.
Type "help" for help.
postgres=>
修改用户在数据库中的密码, 不影响ldap密码认证.
postgres=> alter role new encrypted password 'abc';
ALTER ROLE
postgres@db5-> psql -h 172.16.3.39 -p 1999 -U new postgres
Password for user new: 111111
psql (9.1.3, server 9.3.1)
WARNING: psql version 9.1, server version 9.3.
Some psql features might not work.
Type "help" for help.
postgres=>
当然, 使用数据库中的密码是无法认证的
postgres@db5-> psql -h 172.16.3.39 -p 1999 -U new postgres
Password for user new: abc
psql: FATAL: LDAP authentication failed for user "new"
[参考]