PostgreSQL pg_hba.conf "simple bind" configure Use LDAP auth

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
上一篇BLOG介绍了OpenLDAP Server的配置, 

本文将要讲一下ldap client的配置, 以及PostgreSQL的ldap认证方法.
ldap认证方法指的是通过ldap进行认证, 而非数据库本身的用户密码进行认证.
首先要确保PostgreSQL编译时带上了--with-ldap选项.
例如以下数据库不可用使用ldap认证, 因为带了 --without-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"


[参考]
2. man slapd-mdb, slapd-sql ....
8.  http://quark.humbug.org.au/publications/ldap/ldap_tut.html
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 网络协议 安全
|
关系型数据库 PostgreSQL
PostgreSQL sharding : citus 系列7 - topn 加速(count(*) group by order by count(*) desc limit x) (use 估值插件 topn)
标签 PostgreSQL , topn , topn.number_of_counters , count(*) group by order by count(*) desc limit x 背景 count(*) group by order by count(*) desc limit x 用来统计 topn。
1369 0
|
关系型数据库 PostgreSQL
PostgreSQL sharding : citus 系列6 - count(distinct xx) 加速 (use 估值插件 hll|hyperloglog)
标签 PostgreSQL , hll , hyperloglog , distinct , 加速 , citus.count_distinct_error_rate 背景 在分布式数据库中,计算count(distinct xxx),需要对distinct 的字段, 1、去重, 2、重分布去重后的数据,(这一步,如果distinct值特别多,那么就会比较耗时) 3、然后再去重, 4、最后count (xxx), 5、求所有节点的count SUM。
1783 0
|
弹性计算 关系型数据库 测试技术
PostgreSQL 11 tpcc 测试(103万tpmC on ECS) - use sysbench-tpcc by Percona-Lab
标签 PostgreSQL , tpcc 背景 环境 阿里云虚拟机 [root@pg11-test ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: ...
4107 0
|
网络协议 关系型数据库 网络安全
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 20 章 客户端认证_20.1. pg_hba.conf文件
20.1. pg_hba.conf文件 客户端认证是由一个配置文件(通常名为pg_hba.conf并被存放在数据库集簇目录中)控制(HBA表示基于主机的认证)。在initdb初始化数据目录时,它会安装一个默认的pg_hba.conf文件。
1561 0