PostgreSQL使用LDAP认证,简单说就是将用户名和密码存储在LDAP服务器上,postgresql数据库必须有相同的用户(用户名称相同,密码可以不同),当数据库客户端登录数据库时,数据库服务器不使用本地的密码校验机制而是去请求LDAP服务器验证用户名密码是否正确,正确则登录成功,失败则登录失败。
LDAP是运行于Postgresql数据库之外的独立的服务,可以与postgresql数据库运行于同一主机上,也可以单独运行于其他地方,postgresql通过网络访问LDAP服务器。
编译PostgreSQL
使用--with-ldap编译选项编译PostgreSQL数据库源码:
export LD_LIBRARY_PATH=`pwd`/dep/openssl/`arch`/lib
./configure \
CFLAGS="-O0" \
--enable-debug \
--prefix=`pwd`/install-ldap \
--with-openssl \
--with-ldap \
--with-includes="`pwd`/dep/openssl/`arch`/include" \
--with-libraries="`pwd`/dep/openssl/`arch`/lib"
可能会提示找不到必要的依赖库,需要根据具体情况安装。
搭建LDAP服务
搭建LDAP有多种方式,在此我使用的是最简单的docker安装。为了使用方便同时安装了图形界面管理工具phpldapadmin,安装环境为unbuntu server 18。
安装docker
sudo apt install docker.io
安装openldap phpldapadmin
sudo docker pull osixia/openldap:latest
sudo docker pull osixia/phpldapadmin:latest
如果因网络问题拉取失败,请更换源:
sudo vim /etc/docker/daemon.json
{
"registry-mirrors":[
"https://i1el1i0w.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://registry.aliyuncs.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
然后重启docker后重新拉取ldap:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker pull osixia/openldap:latest
sudo docker pull osixia/phpldapadmin:latest
成功拉取ldap后,本地有了openldap和phpldapadmin的镜像,然后就可以创建并运行ldap和phpldapadmin的实例了:
docker run \
-d \
-p 389:389 \
-p 636:636 \
-v /data/openldap/local:/usr/local/ldap \
-v /data/openldap/lib:/var/lib/ldap \
-v /data/openldap/slapd.d:/etc/ldap/slapd.d \
--env LDAP_ORGANISATION="Manager" \
--env LDAP_DOMAIN="example.com" \
--env LDAP_ADMIN_PASSWORD="123456" \
--name openldap \
--hostname openldap-host\
--network bridge \
osixia/openldap
-p 389:389 TCP/IP访问端口
-p 636:636 SSL连接端口
–name openldap 容器名称为openldap
–network bridge 连接默认的bridge网络
–hostname openldap-host 设置容器主机名称为 openldap-host
–env LDAP_ORGANISATION=“Manager” 配置LDAP组织名称
–env LDAP_DOMAIN=“example.com” 配置LDAP域名
–env LDAP_ADMIN_PASSWORD=“123456” 配置LDAP密码
docker run \
-p 10001:80 \
--privileged \
--name phpldapadmin \
--env PHPLDAPADMIN_HTTPS=false \
--env PHPLDAPADMIN_LDAP_HOSTS=192.168.0.160 \
--detach osixia/phpldapadmin
–privileged 特权模式启动(使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。)
–env PHPLDAPADMIN_HTTPS=false 禁用HTTPS
–env PHPLDAPADMIN_LDAP_HOSTS =192.168.0.160 安装和运行docker的电脑IP地址,这里需要修改为你的IP
安装参考:docker 安装 OpenLDAP 及 LdapAdmin桌面版、页面版(osixia/openldap)_docker安装ldap-CSDN博客
至此,ldap和phpladpadmin已经运行起来了,验证:
root@ubuntu:/home/postgres# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25b58a39e2c2 osixia/phpldapadmin "/container/tool/run" 5 hours ago Up 5 hours 443/tcp, 0.0.0.0:10001->80/tcp, :::10001->80/tcp phpldapadmin
4f56f20f80f2 osixia/openldap "/container/tool/run" 5 hours ago Up 5 hours 0.0.0.0:389->389/tcp, :::389->389/tcp, 0.0.0.0:636->636/tcp, :::636->636/tcp openldap
浏览器输入地址:http://192.168.44.129:10001 (我的安装docker运行ldap服务的电脑IP)即可打开如下界面:
配置LDAP
登录LDAP管理系统,依次创建管理组织->用户组->用户:
至此已配置完成LDAP,如果你想多增加几个用户,请在ou=postgresql下继续新增Generic: User Account。
配置PostgreSQL
vim ../data/pg_hba.conf
host postgres postgres 127.0.0.1/32 ldap ldapserver=192.168.44.129 ldapport=389 ldapbasedn="dc=example,dc=com" ldapbinddn="cn=admin,dc=example,dc=com" ldapbindpasswd=123456
配置postgres用户使用ldap认证,认证参数在后面设置。
测试验证
[postgres@localhost bin]$ ./psql -U postgres -h 127.0.0.1 -p 5432 -d postgres
Password for user postgres:
psql (14.7)
Type "help" for help.
postgres=# alter user postgres password '123';
ALTER ROLE
postgres=# \q
[postgres@localhost bin]$ ./psql -U postgres -h 127.0.0.1 -p 5432 -d postgres
Password for user postgres:
psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: LDAP authentication failed for user "postgres"
[postgres@localhost bin]$ ./psql -U postgres -h 127.0.0.1 -p 5432 -d postgres
Password for user postgres:
psql (14.7)
Type "help" for help.
postgres=#
上面第一次登录使用的是LDAP中配置的用户postgres的密码12345,登录成功,登录后修改数据库用户postgres用户的密码为123,退出重新登录,使用密码123登录失败,再次登录使用密码12345登录成功。验证LDAP可用。
标签:PostgreSQL,postgres,--,ldap,认证,openldap,LDAP,docker From: https://blog.csdn.net/weixin_38700215/article/details/140042524