Use LDAP store PostgreSQL Connection parameter & client use it with .pg_service.conf

前面几篇BLOG谈了一下PostgreSQL的用户密码认证可以通过LDAP 来做AUTH.

客户端提交用户和密码,

PostgreSQL server根据提供客户端的用户, 以及pg_hba.conf中的配置, 到LDAP server查找匹配条目.

如果找到了匹配的话, 根据客户端提供的密码在LDAP server进行认证.

客户端只和PostgreSQL server交互, 认证部分由PostgreSQL server和LDAP server完成. 所以PostgreSQL server编译时需要--with-ldap.

本文要讲的是LDAP的另一个用法, 用来存储客户端连接数据库的连接信息.

例如psql -h 172.16.3.150 -p 1818 -U digoal -d digoal

这里的-h 172.16.3.150 -p 1818 -U digoal -d digoal 存储到LDAP里面.

客户端psql通过LDAP获取到连接信息后再去连接数据库, 因此这里的客户端需要配置--with-ldap, 而服务端不需要.

首先将连接信息导入LDAP, 这里用到core.schema里面的objectclass groupOfUniqueNames, 因为连接信息存储多个, 所以存储到description中, uniqueMember存储1项即可.

[root@db-172-16-3-150 ~]# cat digoal_db.ldif
dn: cn=digoal,ou=People,dc=my-domain,dc=com
objectclass: top
objectclass: groupOfUniqueNames
cn: digoal
description: sslmode=allow
description: user=digoal
description: dbname=digoal
description: port=1818
description: host=172.16.3.150
uniqueMember: host=172.16.3.150

[root@db-172-16-3-150 ~]# ldapadd -vv -x -w 123321 -D "cn=Manager,dc=my-domain,dc=com" -f digoal_db.ldif
ldap_initialize( <DEFAULT> )
add objectclass:
        top
        groupOfUniqueNames
add cn:
        digoal
add description:
        sslmode=allow
        user=digoal
        dbname=digoal
        port=1818
        host=172.16.3.150
add uniqueMember:
        host=172.16.3.150
adding new entry "cn=digoal,ou=People,dc=my-domain,dc=com"
modify complete

查找这个DN正常.

[root@db-172-16-3-150 ~]# slapcat -s "cn=digoal,ou=People,dc=my-domain,dc=com"
bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
Expect poor performance for suffix "dc=my-domain,dc=com".
dn: cn=digoal,ou=People,dc=my-domain,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: digoal
description: sslmode=allow
description: user=digoal
description: dbname=digoal
description: port=1818
description: host=172.16.3.150
uniqueMember: host=172.16.3.150
structuralObjectClass: groupOfUniqueNames
entryUUID: 2119866a-848b-1033-8f3c-c1c6b9bc50eb
creatorsName: cn=Manager,dc=my-domain,dc=com
createTimestamp: 20140610013437Z
entryCSN: 20140610013437.788394Z#000000#000#000000
modifiersName: cn=Manager,dc=my-domain,dc=com
modifyTimestamp: 20140610013437Z

修改数据库的pg_hba.conf, 允许客户端连接

cd $PGDATA
vi pg_hba.conf
host all all 0.0.0.0/0 md5
pg_ctl reload

查看客户端是否加了--with-ldap配置项.

pg93@db-172-16-3-39-> pg_config --configure

'--prefix=/home/pg93/pgsql9.3.1' '--with-pgport=1999' '--with-perl' '--with-tcl' '--with-python' '--with-openssl' '--with-pam' '--with-ldap' '--with-libxml' '--with-libxslt' '--enable-thread-safety' '--with-wal-blocksize=16' '--enable-dtrace' '--enable-debug'

配置~/.pg_service.conf, 注意格式,  ldap://host:port/dn?attributes?scope?filter?extensions 

pg93@db-172-16-3-39-> cat .pg_service.conf
[mydb]
ldap://172.16.3.150:389/cn=digoal,ou=People,dc=my-domain,dc=com?description?sub?cn=digoal

使用psql连接, 会先到LDAPserver找到attributes的值作为连接项, 连接到目标数据库.

pg93@db-172-16-3-39-> psql service=mydb
Password:
psql (9.3.1)
Type "help" for help.
digoal=> 

如果客户端未配置--with-ldap, 那么在.pg_service.conf中使用ldap uri是会报语法错误的.

pg94@db-172-16-3-39-> pg_config --configure
'--prefix=/home/pg94/pgsql9.4devel' '--with-pgport=2999' '--with-perl' '--with-tcl' '--with-python' '--with-openssl' '--with-pam' '--without-ldap' '--with-libxml' '--with-libxslt' '--enable-thread-safety' '--with-wal-blocksize=16' '--enable-dtrace'
pg94@db-172-16-3-39-> cat .pg_service.conf
[mydb]
ldap://172.16.3.150:389/cn=digoal,ou=People,dc=my-domain,dc=com?description?sub?cn=digoal
pg94@db-172-16-3-39-> psql service=mydb
psql: syntax error in service file "/home/pg94/.pg_service.conf", line 2

在LDAP server中存储数据库的连接信息, 对于需要修改数据库连接配置的场景, 只需要修改LDAP, 而不需要修改客户端的配置, 方便管理.

[参考]
1. http://blog.163.com/digoal@126/blog/static/16387704020145953644535/

2. http://blog.163.com/digoal@126/blog/static/16387704020145914717111/

3. http://blog.163.com/digoal@126/blog/static/1638770402014563264469/

4. src/interfaces/libpq/fe-connect.c

/*
 *              ldapServiceLookup
 *
 * Search the LDAP URL passed as first argument, treat the result as a
 * string of connection options that are parsed and added to the array of
 * options passed as second argument.
 *
 * LDAP URLs must conform to RFC 1959 without escape sequences.
 *      ldap://host:port/dn?attributes?scope?filter?extensions
 *
 * Returns
 *      0 if the lookup was successful,
 *      1 if the connection to the LDAP server could be established but
 *        the search was unsuccessful,
 *      2 if a connection could not be established, and
 *      3 if a fatal error occurred.
 *
 * An error message is returned in the third argument for return codes 1 and 3.
 */
static int
ldapServiceLookup(const char *purl, PQconninfoOption *options,
                                  PQExpBuffer errorMessage)
{
        int                     port = LDAP_DEF_PORT,
                                scope,
                                rc,
                                msgid,
                                size,
                                state,
                                oldstate,
                                i;
        bool            found_keyword;
        char       *url,
                           *hostname,
                           *portstr,
                           *endptr,
                           *dn,
                           *scopestr,
时间: 2024-10-31 10:42:57

Use LDAP store PostgreSQL Connection parameter & client use it with .pg_service.conf的相关文章

PostgreSQL 10.0 preview 变化 - 逻辑复制pg_hba.conf变化,不再使用replication条目

标签 PostgreSQL , 10.0 , 变化 , pg_hba.conf , replication , 逻辑复制 背景 pg_hba.conf的replication条目,在10.0后,将仅仅适用于物理复制. 逻辑复制使用普通DATABASE条目,但是逻辑复制的角色依旧需要带replication属性. 配置时请注意了. Change logical replication pg_hba.conf use Logical replication no longer uses the "r

PostgreSQL 10.0 preview 功能增强 - 客户端ACL(pg_hba.conf动态视图)

标签 PostgreSQL , ACL , pg_hba.conf 背景 pg_hba.conf文件是用于控制客户端访问PostgreSQL数据库的防火墙配置(ACL),以往我们要了解数据库配置的ACL,必须打开这个文件进行查看. 例如 cat $PGDATA/pg_hba.conf # PostgreSQL Client Authentication Configuration File # ===================================================

Hadoop RPC通信Client客户端的流程分析

Hadoop的RPC的通信与其他系统的RPC通信不太一样,作者针对Hadoop的使用特点,专门的设计了一套RPC框架,这套框架个人感觉还是有点小复杂的.所以我打算分成Client客户端和Server服务端2个模块做分析.如果你对RPC的整套流程已经非常了解的前提下,对于Hadoop的RPC,你也一定可以非常迅速的了解的.OK,下面切入正题. Hadoop的RPC的相关代码都在org.apache.hadoop.ipc的包下,首先RPC的通信必须遵守许多的协议,其中最最基本的协议即使如下: /**

PostgreSQL 9.0 流复制介绍

PostgreSQL9提供了一个非常兴奋的功能,hot-standby,功能与ORACLE 11G的ACTIVE STANDBY类似.并且增加了流复制的功能,这个与oracle 的standby redo log功能类似,大大的缩短了备份库与主库的事务间隔. HOT-STANDBY可以提供容灾,恢复的同时可以把数据库打开,提供查询功能.以前的版本恢复的时候是不能打开的. 首先看一张postgreSQL的高可用,负载均衡,复制特征矩阵图 这里有一个很好的特性 Slaves accept read-

PostgreSQL on ECS SLA 流复制备库+秒级快照+PITR+自动清理

标签 PostgreSQL , ECS , 阿里云 , 部署 , 物理镜像 , 流复制 , 快照备份 , 备份验证 , 自动清理 背景 介绍在阿里云ECS环境中,实现一个非常简单,但是可用性和可靠性满足一般企业要求的PostgreSQL环境. 包括: 1.自动启动数据库 2.包括一个物理流复制备库 3.包括自动的秒级快照备份 4.包括自动备份集有效性验证 5.包括自动清理N天以前的备份集.归档文件 6.监控请自建 部署环境介绍 1.ECS 111.111.111.199 (主) 111.111.

PostgreSQL 10.0 preview 功能增强 - libpq支持多主机连接(failover,LB)让数据库HA和应用配合更紧密

标签 PostgreSQL , 10.0 , libpq , jdbc , failover , loadbalance , multi host , target_session_attrs 背景 数据库一主多备,这个词在互联网应该不陌生.但是主备切换和应用程序如何配合才能天衣无缝呢?你可能会有这样的疑问. 1. 什么类型的QUERY发给主库,什么类型的QUERY发给备库? 2. 主库和备库发生了角色切换之后,客户端连接如何配合? 业界有一些做法可以回答这两个问题. 1. 通常使用集群软件,使

SHA-1被攻破了吗? PostgreSQL SCRAM-SHA-256 安全认证机制解救你来了

标签 PostgreSQL , 认证方法 , SCRAM-SHA-256 , scram , scram-sha-256-plus , SASL , Simple Authentication and Security Layer 背景 PostgreSQL的很多设计非常的工业化,比如开放了许多扩展接口(类型.操作符.索引.扫描.采样.数据库编程语言等). 另外还有一个,认证也是模块化的,比如你不喜欢md5的认证方法,可以随意更换认证模块,提高安全性. 20.3.1. Trust Authent

PostgreSQL 备份链路sslcompression压缩

通过链路压缩,提高窄带网络PostgreSQL数据库的备份性能. 需要用到PostgreSQL的SSL支持,用法请参考 http://blog.163.com/digoal@126/blog/static/163877040201342233131835 流复制协议,pg_dump都支持ssl,因为它们都走libpq的调用,libpq是支持ssl的. http://www.postgresql.org/docs/9.3/static/libpq-envars.html PGSSLCOMPRESS

Call to master/192.168.137.101:9001 failed on connection exception: java.net.ConnectException: Connection refused

java.net.ConnectException: Call to master/192.168.137.101:9001 failed on connection exception: java.net.ConnectException: Connection refused  at org.apache.hadoop.ipc.Client.wrapException(Client.java:1099)  at org.apache.hadoop.ipc.Client.call(Client