51CTO_开源的密码自助平台Self Service Password
开源的密码自助平台Self Service Password

阅读原文
建议阅读原文,始终查看最新文档版本,获得最佳阅读体验:《开源的密码自助平台Self Service Password》
https://docs.dingtalk.com/i/nodes/gpG2NdyVX3Z65nZ2sydD1x1jWMwvDqPk
引言
企业环境中,一般都是将各个系统的账号统一对接到活动目录中,方便管理,用户也不用记住一堆用户名和密码,修改密码也比较方便,很多企业都会自己部署密码自助修改平台,方便用户自行重置密码。我在github上发现了一个开源项目,可以实现自助修改密码,操作简单,页面支持多语言,在生产环境中应用也是完全OK的,我写了一盘文章介绍这个开源项目,并详细说明了如何利用docker快速部署,以及验证。
LTB简介
LTB(LDAP Tool Box)旗下的 Self Service Password 是一个用于 LDAP / Active Directory 的自助密码管理 Web 应用。🚀
用户可以通过这个系统自己修改密码、重置密码、解锁账户等,而无需 IT 人员干预,大幅减轻密码相关运维负担。该项目在 GitHub 上以 MIT/GPL 类开源许可证发布,并提供 Docker 镜像方便部署。
核心特性
-
支持标准 LDAPv3 目录服务(如 OpenLDAP、389 Directory、ApacheDS),同时也兼容 Active Directory 模式。
-
本地密码策略支持:密码最小/最大长度、禁止字符、自定义复杂度规则、禁止重用历史密码等。
-
提供多种重置方式:邮件令牌、中途安全问题、SMS(通过外部服务接口)等。
-
带有验证码机制(防止自动脚本滥用)、邮件通知、钩子脚本(允许在密码变更前后插入自定义逻辑)。
-
提供官方 Docker 镜像,部署方式灵活:从源码、打包、Docker 均可使用。
优点与适用场景(可在你的文章中强调)
-
部署轻量、运维成本低 — 只需 PHP + LDAP 扩展环境,借助 Docker 可以快速上线。
-
可扩展性强 — 钩子机制、外部服务接口(如邮件、SMS)、多语言支持都具备。
-
安全性可控 — 支持 SSL / LDAPS、证书验证、密码策略、禁用账户检查等。
-
用户友好 — 对终端用户界面直观,减少忘记密码带来的支持工单量。
相似的开源项目
pwm-project/pwm: pwm
github网址
https://github.com/ltb-project/self-service-password
官方文档
LDAP Tool Box Self Service Password documentation — LDAP Tool Box Self Service Password documentation
用docker快速部署
官方文档:Installation — LDAP Tool Box Self Service Password documentation
管理AD证书
文档:LDAP connection — LDAP Tool Box Self Service Password documentation
https://ltb-project.org/documentation/active_directory_certificates.html
如果要通过LTB来更改域账号的密码,则必须要通过LDAPS连接到AD,也就是要用到证书。其实这个证书就是CA的根证书,所以可以通过任意一台加入域的计算机导出根证书。
首先得有证书颁发机构,如果还没有安装,可以参考我写的这篇文章:《自建bitwarden密码管理服务器》
然后随便找一台加入域的计算机,运行窗口中输入mmc,然后回车进入Microsoft控制台

添加/删除管理单元



我的环境中,证书颁发机构是直接部署在域控制器上的,下图红色箭头所示的就是证书颁发机构的根CA,我们就是要导出这个root ca







如此,便成功导出了root ca。

将到处的root ca文件放到服务器的/home/ubuntu目录中,并复制到/etc/ssl/certs/目录下。下文的docker要用到(通过卷映射)
创建配置文件
先创建一个目录,配置文件放到这个目录里
mkdir ltb
cd ltb
下面是我使用的配置文件
参考文档:LDAP connection — LDAP Tool Box Self Service Password documentation
<?php
// ======================================================
// Self Service Password (SSP) 配置文件
// 环境:Microsoft Active Directory + LDAPS
// 作者:tornadoami
// 网站:https://docs.dingtalk.com/i/nodes/gpG2NdyVX3Z65nZ2sydD1x1jWMwvDqPk
// ======================================================// 🔐 SSP 内部加密密钥(用于临时令牌、验证码等加密)
// 可自定义为复杂字符串,生产环境务必修改
$keyphrase = "mysecret";// 🧩 调试模式
// true:启用详细日志(调试阶段用)
// false:生产环境建议关闭
$debug = true;// 🏢 启用 Active Directory 模式
$ad_mode = true;// 👤 LDAP 用户过滤器
// - sAMAccountName:登录用户名属性
// - userAccountControl:...:排除被禁用账户
$ldap_filter = "(&(objectClass=user)(sAMAccountName={login})(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";// ⚙️ AD 特定选项
$ad_options['force_unlock'] = true; // 密码修改时自动解锁账户
$ad_options['change_expired_password'] = true; // 支持修改过期密码// 🌐 LDAP 服务器地址(LDAPS 模式)
// 注意:LDAP的url,不应使用ip地址,而是应该用服务器的计算机全名,这是因为证书中的san通常都是计算机名而不是ip地址,如果用ip地址,则会导致绑定失败。
$ldap_url = "ldaps://dc-t.dltornado2.com";// 🧷 禁用 StartTLS(LDAPS 已使用 SSL)
$ldap_starttls = false;// 🧾 设定 LDAP SSL 安全参数(通过 putenv 注入)
// demand = 必须验证服务器证书(生产推荐)
// allow = 允许但不强制验证(测试时可用)
putenv("LDAPTLS_REQCERT=demand");// 📜 指定 AD 根证书路径(容器挂载时定义)
// 注意:必须与 docker run 中的挂载路径一致
putenv("LDAPTLS_CACERT=/etc/ssl/certs/dltornado2.com-root-ca.cer");// 🔑 绑定账户(具有 LDAP 查询权限)
// 建议使用仅限查询权限的服务账户
$ldap_binddn = "CN=it.django,OU=SpecialAccount,OU=myse,DC=dltornado2,DC=com";
$ldap_bindpw = "<此处要输入域用户it.django的密码>";// 🗂️ LDAP 搜索起始点(用户所在 OU)
$ldap_base = "OU=myse,DC=dltornado2,DC=com";// 👥 登录使用的属性(AD 中通常是 sAMAccountName)
$ldap_login_attribute = "sAMAccountName";// ======================================================
// ✉️ 邮件通知功能(可选)
// ======================================================
// 如果需要在用户密码修改后发送确认邮件,请启用以下配置$mail_attribute = "mail"; // AD 邮箱属性字段
$mail_from = "noreply@dltornado2.com";
$mail_from_name = "密码自助系统";
$mail_signature = "此邮件由系统自动发送,请勿回复。";$mail_smtp_server = "smtp.dltornado2.com";
$mail_smtp_port = 587;
$mail_smtp_auth = true;
$mail_smtp_user = "noreply@dltornado2.com";
$mail_smtp_password = "你的SMTP密码";
$mail_tls = true;// ======================================================
// ✅ 结束
// ======================================================
?>
运行容器
官方提供了容器镜像
注意:LDAP的url,不应使用ip地址,而是应该用服务器的计算机全名,这是因为证书中的san通常都是计算机名而不是ip地址,如果用ip地址,则会导致绑定失败。
docker run -d \-p 8001:80 \-v /home/ubuntu/ltb/:/var/www/conf/ \-v /home/ubuntu/dltornado2.com-root-ca.cer:/etc/ssl/certs/dltornado2.com-root-ca.cer:ro \-e LDAP_URL="ldaps://dc-t.dltornado2.com" \-e LDAP_TLS_CACERTFILE="/etc/ssl/certs/dltornado2.com-root-ca.cer" \-e LDAP_TLS_REQCERT="demand" \docker.io/ltbproject/self-service-password:latest

验证

我随便选了一个用户,测试能否正常修改密码

密码修改成功


验证
[外链图片转存中…(img-dcKsBvVf-1761556967594)]
我随便选了一个用户,测试能否正常修改密码
[外链图片转存中…(img-UWKL5OqB-1761556967594)]
密码修改成功
[外链图片转存中…(img-YxbG5q6w-1761556967594)]
[外链图片转存中…(img-l6mU15Cy-1761556967594)]

