1. 操作系统:Anolis(类似centos,使用yum,dnf包管理)

AD域控结合Self-Password-Services实现自助改密码

​ 经常会有这样的场景,AD域用户忘记或遗失了自己的密码。这时候可以找管理员进行修改,但是情况多了也会有些麻烦。所以可以尝试搭建**ssp(self-password-sercive)**实现用户自助改密码。还可以通过脚本的方式实现批量改密码,结合邮件等功能也能自主改密码。

​ 使用了两种方式部署,分别是实体机部署以及docker部署,本文部署方式为实体机部署,docker部署可能因为镜像,等等原因不及而终。最后整理部分报错信息以及解决方案供参考。

  • 准备资料

​ SSP项目地址:ltb-project/self-service-password: Web interface to change and reset password in an LDAP directory

​ AD域控服务器(CS)搭建方式:企业AD域(域控服务器)的安装和配置详细教程_域服务器的安装与配置-CSDN博客

​ AD CA服务器搭建方式:AD域控与CA证书、NPS(radius)超级详细安装_ad ca-CSDN博客

1. 安装httpd(apache)php各项依赖

1
2
# 安装 Apache 和 PHP
dnf install httpd php php-ldap php-mbstring -y

![image-20250704102141823]..\images\Linux\运维\ssp\image-20250704102141823.png)

2. 开始安装ssp

1.配置源

  • 可以尝试先下载
1
dnf -y install self-service-password

image-20250704102758477

我这里下载过所以显示已经安装,如果不能安装则进入下一步:

  1. 配置源:
1
vim /etc/yum.repos.d/ltb-project.repo

写入以下信息:

1
2
3
4
5
6
[ltb-project-noarch]
name=LTB project packages (noarch)
baseurl=https://ltb-project.org/rpm/$releasever/noarch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-LTB-project
  1. 导入GPG私钥
1
rpm --import https://ltb-project.org/wiki/lib/RPM-GPG-KEY-LTB-project

image-20250704104057746

  1. 添加php72的yum源
1
2
yum -y install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

image-20250704104232023

3. 下载安装

1
dnf -y install self-service-password

image-20250704104342086

4. 配置文件

​ 其实最麻烦的其实是这里,这个配置文件很长,有很多细节。此时你下载好了之后,启动httpd服务就可以访问到ssp的界面了,但是会报错:在使用凭据加密前,需要在 keyphrase 设置中填写一个随机字符串

image-20250704104846233

先实现基本功能-用户自己使用旧密码改为新密码。只要这一步能够pass,那么使用邮件就能通过。

1. 证书设置

1. 导出证书

  1. 要想ssp能够正常修改AD域的用户名账号密码几乎无法逃开证书认证的部分
    1. 个人尝试过各种方式跳过加密,都是不行的,顶多能够查询信息,修改是不可能的。
  • AD域根证书导出

登录到服务器后Win+R输入cmd打开命令行输入:

1
2
cd Desktop
certutil -ca.cert root.cer

这样根证书就导出到桌面了,注意如果没有安装AD CS服务,这个命令是无法生效的

然后传到服务器即可

1
scp root.cer root@192.168.72.128:/root/

2. 导入证书并生效

  • 上一步传过来的证书是二进制的,无法被Linux添加,需要先转换格式

image-20250704110454356

1
openssl x509 -in root.cer -inform DER -out root.pem -outform PEM

image-20250704110521201

  • 根据Linux发行版的不同,导入方式有差别,基于Debian/Ubuntu
1
2
3
# 对于基于 Debian/Ubuntu
ca.crt /usr/local/share/ca-certificates/
update-ca-certificates
  • 基于 RHEL/CentOS (龙蜥使也是用这种方式)
1
2
3
# 对于基于 RHEL/CentOS
cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

3. 检查是否导入成功。

  • 基于Debian/Ubuntu
1
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt root.pem
  • RHEL/CentOS (龙蜥使也是用这种方式)
1
openssl verify -CAfile /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem root.pem

image-20250704111216732

2. config.inc.php配置文件设置

  • 首先保证最小功能,也就是ldap和ad的设置
  • LDAP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# Debug mode
# true: log and display any errors or warnings (use this in configuration/testing)
# false: log only errors and do not display them (use this in production)
$debug = true;

# LDAP
$ldap_url = "ldaps://192.168.72.129:636";# 替换成自己的AD域服务器
$ldap_starttls = false; # 已经使用了ldaps,所以关闭

$ldap_binddn = "CN=Administrator,CN=Users,DC=www,DC=test,DC=com";# AD域DN,可以通过查看AD域服务器或者ldapsearch命令查看
$ldap_bindpw = "PAssword"; # 密码

$ldap_base = "DC=www,DC=test,DC=com"; # 待修改的用户所在的组织结构,一般是一开始创建的林

$ldap_login_attribute = "sAMAccountName"; # 不改
$ldap_fullname_attribute = "cn"; # 不改

$ldap_filter = "(&(objectClass=user)(sAMAccountName={login})(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";# 过滤器,可以照抄

$ldap_scope = "sub"; # 不改,sub模式出错概率小

$ldap_use_exop_passwd = false; # 出错可以试true
$ldap_use_ppolicy_control = false;

$ldap_network_timeout = 10;
$ldap_page_size = 0;

  • AD设置
1
2
3
4
5
6
7
8
9
10
11
12

# Active Directory mode
# true: use unicodePwd as password field
# false: LDAPv3 standard behavior
$ad_mode = true; # 必改
$ad_options=[];
# Force account unlock when password is changed
$ad_options['force_unlock'] = false;
# Force user change password at next login
$ad_options['force_pwd_change'] = false;
# Allow user with expired password to change password
$ad_options['change_expired_password'] = false;
  • 还有一处重要的地方!
  • 搜索 manager,一共有2处设置

image-20250704131911829

需要将对应的设置比如$who_change_password = "manager";改为manager,否则会遇到改密码权限问题。

image-20250704160819334

image-20250704161000961

5. 启动

​ 至此大部分配置均已结束,可以开始启动或尝试重启httpd和php-fpm进行测试了。

1
2
systemctl restart httpd
systemctl restart php-fpm

6. 遇到的问题汇总与解决方式

1. 安装ssp时提示有关php的版本问题

查看已有的版本,并启用对应的版本:

1
2
3
4
5
dnf module reset php -y
dnf module enable php:7.4 -y
# 之后再尝试下载
dnf install php php-cli php-common php-ldap php-mbstring php-gd php-opcache php-json php-xml -y

1
dnf module list php # 查看系统的php模块

image-20250704133139411

2. 不能访问LDAP服务

  • 这个问题可能是由以下原因造成
    1. 网络问题(防火墙等)

对于网络问题,可以测试用telnet

1
telnet 192.168.72.129 636

image-20250704135116699

对于防火墙策略:

  • 客户端和服务端可以关闭防火墙进行测试

3. 证书问题引起的无法修改密码

证书问题也是我卡住的主要问题,比较棘手。

  • 引起证书问题的原因
    1. 根证书不对
    2. 证书加密强度不够
    3. 证书未正确加载
  1. 根证书不对的结局方向:

  2. 重复重新操作证书设置,

  3. 从AD域服务器重装CA服务器角色

  4. 不使用命令行,使用图形化的方式导出方式

  5. 证书加密强度不够

  • 这个会导致能够访问到ldap服务器,但是无法修改成功,会显示密码被拒绝,即使你用了强密码,完全符合AD域服务器的密码策略。

解决方法:

  1. 重新导出根证书:使用加密方式更为安全的算法:sha512 * 4096 bit或更好
  2. 放宽加密证书要求的策略,也是我测试时使用的最有效的方式
1
vim /etc/openldap/ldap.conf

增加,或者禁用

1
TLS_CIPHER_SUITE NORMAL
1
TLS_REQCERT allow # or TLS_REQCERT never
  1. 证书未正确加载

  2. 查看证书是否一致

1
cat root.crt # or cat root.pem
  1. 查看证书是否放在正确的位置,根据发行版不同放在不同的位置
1
2
3
4
5
6
# 对于基于 Debian/Ubuntu
ca.crt /usr/local/share/ca-certificates/
update-ca-certificates
# 对于基于 RHEL/CentOS
cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust