12-openldap使用AD密码
阅读视图
本文严重参考
Openldap 整合windows AD认证
本文其他参考
OpenLDAP使用AD密码
Configuring OpenLDAP pass-through authentication to Active Directory
一、需求概述及解决方案
1. 需求概述
Openldap是开源的目录服务实现,windows AD是微软的目录服务现实。现状是有的场景(应用、客户端)跟openldap结合比较容易,有的场景又是必须要用AD,所以几乎不可能弃用其中的任意一种。但同时维护两套系统意味着维护工作大量增加(不仅仅只是增加一倍,要考虑信息分别维护、同步etc等)、出错几率增加。
其中的一种较成熟、使用比较多的解决方案是:openldap使用windows AD的认证,这样只需要在AD上维护一套用户密码即可。
比较常用的场景,如图

2. 流程图

如上图,相关组件分四大部分:
- LDAP client:这个是实际调用ldap服务的系统,也可以是类似ldapsearch之类的client程序;
- Openldap:开源服务端,实际进程为slapd;
- Saslauthd:简单认证服务层的守护进程,该进程要安装在openldap服务器上;
- Active directory:即windows AD,这个不用解释;
二、AD域设置
AD域设置设置很简单,如下:
- 在AD域的Users目录下新建一个用户
saslauthd。 - 新建一个技术运营部,新建一个用户
user10。 - 在Users新建一个用户
test1
三、Saslauthd安装配置
1. 安装Saslauthd
在openldap-server服务器上安装Saslauthd
[root@0 ~]# yum install cyrus-sasl
[root@0 ~]# rpm -ql cyrus-sasl
/etc/sysconfig/saslauthd # 配置文件
/run/saslauthd
/usr/lib/systemd/system/saslauthd.service # 启动脚本
/usr/sbin/pluginviewer
/usr/sbin/saslauthd # 守护进程
/usr/sbin/testsaslauthd # 测试程序
/usr/share/doc/cyrus-sasl-2.1.26
/usr/share/doc/cyrus-sasl-2.1.26/LDAP_SASLAUTHD
/usr/share/man/man8/pluginviewer.8.gz
/usr/share/man/man8/saslauthd.8.gz
/usr/share/man/man8/sasldblistusers2.8.gz
/usr/share/man/man8/saslpasswd2.8.gz
/usr/share/man/man8/testsaslauthd.8.gz
2.【可选】测试sasl本身
1. 创建1个帐号及密码
[root@0 ~]# useradd test
[root@0 ~]# passwd test
Changing password for user test.
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
2. 配置saslauthd使用shadow认证并启动saslauthd进程
[root@0 ~]# grep -Ev "^$|^#" /etc/sysconfig/saslauthd
SOCKETDIR=/run/saslauthd
MECH=shadow
FLAGS=
[root@0 ~]# systemctl restart saslauthd
3. 使用testsaslauthd进行验证
[root@0 ~]# testsaslauthd -u test -p password
0: OK "Success."
这里如密码正确应该出现认证成功,密码错误则失败,到这里可理解sasl本身OK的。后续配置还会用 testsaslauthd 程序测试、调试。验证OK后可删除用户。
3. 配置sasl关联到ad域
- 【可选】先用ldap客户端测一下windowad域是否可用,用户密码是否正确。如果验证失败,就需要排查openldap的问题了。
[root@0 ~]# ldapsearch -x -H ldap://192.168.244.31 -D "CN=administrator,CN=Users,DC=windows,dc=com" -w Aa123456 -b "DC=windows,DC=COM" | less
# extended LDIF
#
# LDAPv3
# base <DC=windows,DC=COM> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# windows.com
dn: DC=windows,DC=com
objectClass: top
objectClass: domain
objectClass: domainDNS
distinguishedName: DC=windows,DC=com
...省略
- 配置sasl访问ad
1. 修改/etc/sysconfig/saslauthd, 如下
[root@0 ~]# grep -Ev "^$|^#" /etc/sysconfig/saslauthd
SOCKETDIR=/run/saslauthd
MECH=shadow
FLAGS="-O /etc/saslauthd2ad.conf"
[root@0 ~]# cat /etc/saslauthd2ad.conf # 该文件需要新建立
ldap_servers: ldap://192.168.244.31
ldap_search_base: DC=windows,DC=com
ldap_timeout: 10
ldap_filter: sAMAccountName=%U
ldap_bind_dn: CN=saslauthd,CN=Users,DC=windows,DC=com # 第二步骤建立的用户
ldap_password: Aa123456
ldap_deref: never
ldap_restart: yes
ldap_scope: sub
ldap_use_sasl: no
ldap_start_tls: no
ldap_version: 3
ldap_auth_method: bind
3. 重启saslauthd服务
该文件的主要参数:
ldap_servers: LDAP URI, windowsAD地址
ldap_bind_dn: DN for connection ,一个windows AD用户的DN,实际不需要admin的
ldap_password: Password for connection,密码
ldap_search_base: Search base
ldap_filter: Search filter ,%U 表示user, %u 表示user@domain
测试testsaslauthd -u administrator -p 密码 ,这里就是使用AD域的用户-密码认证了,并不只是写到配置文件里面的administrator,而是所有AD用户都已经可以用testsaslauthd程序测试验证。可进一步AD里面加用户、或改密码测试。需注意AD修改密码,老密码依然可用5分钟。如验证不通过检查 sasl的配置。重启sasl即可清楚密码缓存。
四、openldap-server配置
1. 检查Openldap
如果是编译的必须要有编译参数 ./configure --enable-spasswd;如没有需要重新编译,否则不支持之后形如 userPassword: {SASL}user@domain的语法配置。
本文采用yum安装,默认是支持的。
2. 配置openldap使用Saslauthd
在openldap的配置文件/etc/openldap/slapd.conf加入如下两行
sasl-host localhost
sasl-secprops none
这两行配置是告诉openldap使用本机的sasl
再修改/新建sasl的配置文件
[root@0 ~]# cat /etc/sasl2/slapd.conf
mech_list: plain
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
这个配置文件相当于sasl的前端,意思是来自于slapd的请求,让saslauthd接手处理。注意这两个配置文件文件名是相同的,但却是不同软件包的配置文件。如果slapd是用非root的OS用户启动的,那还要将用户加到组里。(本次实验是用root启动saslauthd)
usermod -a -G sasl ldap
3. openldap新建测试用户
cat << EOF | ldapadd -x -D "cn=Manager,dc=windows,dc=com" -W
dn: uid=user10,ou=people,dc=windows,dc=com
uid: user10
cn: user10
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 30010
gidNumber: 30005
homeDirectory: /home/user10
userPassword: {SASL}user10
如上userPassword配置, openldap就会将用户user10转发给sasl程序认证, 而sasl又会进一步转发给windows AD。也可同样原理参照, 新建test1用户
测试如下
[root@0 ~]# testsaslauthd -u user10 -p Acc123456
0: OK "Success."
[root@0 ~]# ldapsearch -w Acc123456 -H ldap://xyz.com -D "uid=user10,ou=people,dc=xyz,dc=com" -b "uid=user10,ou=people,dc=xyz,dc=com"
# extended LDIF
#
# LDAPv3
# base <uid=user10,ou=people,dc=xyz,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# user10, people, xyz.com
dn: uid=user10,ou=people,dc=xyz,dc=com
uid: user10
cn: user10
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 30010
gidNumber: 30005
homeDirectory: /home/user10
userPassword:: e1NBU0x9dXNlcjEw
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
五、配置TLS加密
本人并没有配置, 所以忽略。
解决方案有这么几种:
Ø外层网络层加密,比如×××隧道
Ø使用windows安全认证如NTLM 、Kerberos
Ø启用SSL/TLS镶套协议
本文采用TLS方案
D.Windowsad启用TLS
Windows AD启用TLS支持需要先安装证书服务,即 AD CS,建议在功能里面安装相关管理工具。安装完成后执行 certutil -dcinfo verify ,再用ldp.exe程序本地验证。

通过后在用ldapsearch远程验证。这个有几个注意点,过程如下:
4.导出windows证书,并配置给ldapsearch
windows的证书导出如图:


讲导出的文件传到ldapsearch所在服务器
修改配置文件(ldap客户端配置文件和openldap客户端配置文件是不同的)
/usr/local/openldap2.4/etc/openldap/ldap.conf
加入 TLS_CACERT /etc/openldap/certs/ca2.crt
5.可能需要修改/etc/hosts
192.168.0.101 WIN-QLMQQENMPLO.test.com
因为会验证主机名是否与证书里的字段匹配,所以不能用ip地址访问
测试命令:
ldapsearch -x -H ldaps://WIN-QLMQQENMPLO.test.com -D "CN=blake,CN=Users,DC=test,DC=com" -w 密码 -b "CN=administrator,CN=Users,DC=test,DC=com"
注意连接协议是ldaps,默认636端口,不再是ldap
这里OK了再继续。否则后面也容易出问题
E.Sasl配置TLS
修改配置文件/etc/saslauthd2ad.conf
[root@localhost log]# cat /etc/saslauthd2ad.conf
ldap_servers: ldaps://WIN-QLMQQENMPLO.test.com/
ldap_search_base: CN=Users,DC=test,DC=com
ldap_filter: sAMAccountName=%U
ldap_bind_dn: CN=administrator,CN=Users,DC=test,DC=com
ldap_password: 密码
ldap_tls_cacert_file: /etc/openldap/certs/ca-test.cer
这里和前面的配置有2点不同,一是协议变为ldaps,而是最后一行指定了证书。就是前面从windows导出的证书。这里的逻辑是:自签名的ssl/tls证书,ldaps要求把自签名用到的ca证书配置给客户端。Ldapsearch程序修改ldap.conf文件,sasl则修改本文件。
使用testsaslauthd -u administrator -p 密码 命令验证
F.Openldap配置TLS
Openldap服务端也可以配置TLS,配置文件是slapd.conf
比如 /usr/local/openldap2.4/etc/openldap/slapd.conf
增加3行
TLSCACertificateFile /etc/openldap/certs/ca.crt
TLSCertificateFile /etc/openldap/certs/ldap.crt
TLSCertificateKeyFile /etc/openldap/certs/ldap.key.pem
这里第一行是自签名用到的ca证书(可以不是本机,可以用前面的windows服务器来签证书),第二行是本机服务器证书,第三行是本机服务器证书密钥。证书的概念这里不详细讲解。
之后,用命令开启TLSslapd -4 -h "ldap:/// ldaps:///"
特别注意,这里要验证openldapTLS的话又比较麻烦
可以先openssl s_client -connect localhost:636看一下证书对不对
然后配置ldapsearch 1.合并证书,即ldap.conf 配置文件里面,TLS_CACERT 参数指定的文件,直接用cat命令讲两个ca证书合并(一个是前面windows的,一个是签发给openldap的) 2.修改/etc/hosts 192.168.0.107 ldap
测试验证命令:ldapsearch -w 密码 -H ldaps://ldap -D "cn=blake,ou=users,dc=saybot,dc=com" -b "cn=blake,ou
=users,dc=saybot,dc=com"
G.概念总结
TLS的配置整体比较麻烦,把握以下概念:
ØLdap协议是389端口,明文;TLS加密后协议是ldaps ,636端口
ØWindowsad开启ldaps(TLS)安装活动目录证书(AD CS)服务
Ø证书有2种,1是服务器证书,2是签发服务器证书的ca证书
Ø自签名的情况下,客户端需要额外配置ca证书(第二种)
12-openldap使用AD密码的更多相关文章
- [系统集成] OpenLDAP使用AD密码
关于OpenLDAP和AD帐号的整合,网上有大量的文档,绝大多数都不符合我们的需求,下面的方案是我经过调研.测试.修改.最终采用的. . 需求概述 公司网络中有两种帐号:OpenLDAP帐号和AD帐号 ...
- gitlab 接入 openldap、AD
=============================================== 20171009_第2次修改 ccb_warlock === ...
- sharepoint 修改AD密码
sharepoint 修改AD密码 下面是添加添加“空元素”代码: 第一个<CustomAction>是添加修改密码项目 第二个<CustomAction>是添加js修改脚本 ...
- 在泛微系统中修改AD密码的配置
参照文档: Windows server 2008 R2 安装AD域证书:https://blog.csdn.net/zhuyongru/article/details/81107839 配置泛微OA ...
- Ubuntu 12.04 root默认密码? 如何使用root登录?
在安装Ubuntu 12.04时并没有设置root的密码,登录的时候也没有使用root账户.当我们使用root权限时,一般都使用sudo命令进行.那么当我们安装完毕Ubuntu 12.04时,root ...
- Ubuntu 12.04 root默认密码? 如何使用root登录? (转载)
转自:http://www.lupaworld.com/article-219280-1.html 在安装Ubuntu 12.04时并没有设置root的密码,登录的时候也没有使用root账户.当我们使 ...
- Ubuntu 12 修改当前用户密码:new password is too simple
修改当前登录用户的密码,通常使用如下命令: $ passwd Old password:****** New password:******* Re-enter new password:****** ...
- Python 修改AD密码
前提条件: AD 已开启证书服务(最重要的一句话). import ldap3 SERVER = 'adserver' BASEDN = "DC=example,DC=com" U ...
- SharePoint 2010中重置windows 活动目录(AD)域用户密码的WebPart(免费下载)
由于SharePoint 2013推出不久,并非所有的企业都会升级到SharePoint 2013的,毕竟升级不是打打补丁这么简单,更多的企业还是使用Sharepoint 2010版本的,因此本人自行 ...
随机推荐
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递.Java编程语言只有值传递参数. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用 ...
- 微信开放平台创建android应用时怎么获取应用签名
之前微信开放平台中申请创建应用,没有整理,过了好久,又重新百度,今天索性整理了,以供童鞋们备用. 1.微信开发平台注册申请成开发者账号,就此略过 2.在管理中心选择创建移动应用.按照严格要求填写.上传 ...
- Django学习(5)优雅地分页展示网页
在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能.那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类. 本次分享讲具体展示如何利用Djan ...
- 解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题
这段时间写Android和IOS服务时 sql数据库查询有数据正常,没数据总是报异常:System.Data.SqlClient.SqlException (0x80131904): Timeout ...
- C# 性能优化 之 秒表 Stopwatch。
生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagnostics; Stopwatch sw = new Stopwatch (); sw ...
- LeetCode翻转矩阵后的得分-Python3<六>
上一篇:LeetCode子域名访问计数-Python3.7<五> 题目:https://leetcode-cn.com/problems/score-after-flipping-matr ...
- [PHP] 数据结构-从尾到头打印链表PHP实现
1.遍历后压入反转数组,输出2.array_unshift — 在数组开头插入一个或多个单元,将传入的单元插入到 array 数组的开头int array_unshift ( array &$ ...
- 通过Eureka自带REST API强行剔除失效服务
1.确定需要强行剔除的服务 2.执行接口 方便复制: http://{ip}:{port}/eureka/apps/CONFIG-SERVER-TEST/tom:config-server-test: ...
- ServletConfig与ServletContext对象详解
一.ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数.(配置在某个servlet标签或者整个w ...
- Go开发之路 -- Go语言基本语法 - 作业
1. 判断101 - 200之间有多少个素数,并输出所有素数. package main import ( "fmt" ) var count = 0 func prime(a, ...