一、什么是openLDAP
OpenLDAP是一个开源的轻量级目录访问协议(LDAP)实现。它是一种协议,用于在网络环境中查询和操作目录服务中的信息。LDAP协议被广泛用于企业环境,以提供对用户信息、组织结构、权限和其他企业相关数据的访问。
1、为什么用LDAP
使用LDAP(轻型目录访问协议)的主要原因是其开放性和灵活性。LDAP是一个工业标准的目录访问协议,被设计用于访问和操作目录服务器中的信息。它提供了一种标准的接口,使得客户端应用程序可以搜索和修改目录中的信息。
LDAP服务器的优势在于它与关系数据库相比,可以轻松地处理大量用户和组数据,并且更好地适应分布式环境。此外,LDAP服务器在查询上进行了很多优化,可以快速查询出想要的结果。
通俗来说,LDAP就像一张表,只需要用户名和口令,加上一些其他的东西,非常简单。它是一个轻量级的产品,主要目的是为了查,因此在架构和优化主要是针对读,而不是写,从效率和结构上都可以满足认证的需求。这就是为什么LDAP成为很多的统一认证的解决方案的优势所在。
此外,LDAP还支持Kerberos身份验证协议,可以实现单点登录和集中管理,为企业提供更安全、高效的用户身份验证和访问控制管理。
2、LDAP相关概念
-
dn(Distinguished Name):区分名称,LDAP中每个条目都有自己的dn,dn是该条目在整棵树中的唯一标识,如同文件系统中,带路径的文件名就是DN。
-
rdn(Relative dn):相对区别名称,好比linux中的相对路径。
-
dc(Domain Component):域名组件。其格式是将完整的域名分成几部分,如将http://example.com变成dc=example,dc=com。
-
uid(User ID):用户ID,如 san.zhang。
-
ou(Organization Unit):组织单元。
-
cn(Common Name):公共名称。
-
sn(surname):姓氏。
-
c(Country):国家,如“CN”或者“US”。
-
o(Organization):组织名,如XXX银行,XXX部门,XXX公司等等。
二、安装openldap
1、使用yum命令
# setenforce 0
# systemctl stop firewalld
# systemctl disbale firewalld
# yum install -y openldap openldap-clients openldap-devel openldap-servers compat-openldap
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/DB_CONFIG
# systemctl start slapd
# systemctl status slapd
# systemctl enable slapd
# netstat -antup |grep 389
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1982/slapd
tcp6 0 0 :::389 :::* LISTEN 1982/slapd
1、安装包说明
安装包名称 | 说明 |
---|---|
openldap | openldap服务端和客户端必须用的库文件。 |
openldap-servers | 用于启动服务和设置. 包含单独的ldap后台守护程序。 |
openldap-clients | 用于启动服务和设置. 包含单独的ldap后台守护程序。 |
openldap-devel | devel包,可选择进行安装。 |
openldap-servers-sql | 支持sql模块,可进行选择性安装。 |
migrationtools | 通过migrationtools实现OpenLDAP用户及用户组的添加,导入系统账户,可进行选择性安装。 |
compat-openldap | openldap兼容性库 其中compat-openldap这个包与主从有很大的关系 |
2、查看安装版本
# slapd -VV
@(#) $OpenLDAP: slapd 2.4.44 (Feb 23 2022 17:11:27) $
mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
3、OpenLDAP的相关配置文件信息
/etc/openldap/slapd.conf:OpenLDAP的主配置文件,记录根域信息,管理员名称,密码,日志,权限等
/etc/openldap/slapd.d/:这下面是/etc/openldap/slapd.conf配置信息生成的文件,每修改一次配置信息,这里的东西就要重新生成
/etc/openldap/schema/:OpenLDAP的schema存放的地方
/var/lib/ldap/:OpenLDAP的数据文件
/usr/share/openldap-servers/slapd.conf.obsolete 模板配置文件
/usr/share/openldap-servers/DB_CONFIG.example 模板数据库配置文件
OpenLDAP监听的端口: 默认监听端口:389(明文数据传输) 加密监听端口:636(密文数据传输)
2、docker-compose 部署openLDAP
填写自定义的ldif文件
vim ./openldap/config/init.ldif
dn: ou=People,dc=example,dc=net
objectClass: organizationalUnit
ou: people
dn: ou=Group,dc=example,dc=net
objectClass: organizationalUnit
ou: group
将该配置挂载到容器中,然后容器启动之后会执行这个文件
version: "2"
services:
openldap:
container_name: "openldap"
image: "osixia/openldap:latest"
restart: always
environment:
LDAP_ORGANISATION: "openldap"
LDAP_DOMAIN: "example.com"
LDAP_ADMIN_PASSWORD: "123456"
LDAP_CONFIG_PASSWORD: "123456"
TZ: Asia/Shanghai
command: [ '--copy-service' ]
volumes:
- ./ldap/data:/var/lib/ldap # 如果需要的话,可以配置挂载持久化目录
- ./ldap/config:/etc/ldap/slapd.d # 如果需要的话,可以配置挂载持久化目录
- ./openldap/config:/container/service/slapd/assets/config/bootstrap/ldif/custom # 注意这里是目录挂载到目录,需要提前创建放入自定义的ldif文件
ports:
- 388:389
三、部署phpldapadmin
PHPLDAPadmin是一个用于管理LDAP(轻量级目录访问协议)的Web界面。它可以帮助用户轻松管理和编辑LDAP目录。
1、yum安装
安装软件源
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum -y install epel-release
# yum-config-manager --enable remi-php74
2、安装软件
# yum install php-Smarty php74-php-fpm php74-php-gd php74-php-json php74-php-mbstring php74-php-xmlrpc php74-php-opcache php74-php-ldap -y
# systemctl start php74-php-fpm.service
# systemctl enable php74-php-fpm.service
# systemctl status php74-php-fpm.service
# yum install -y phpldapadmin
3、修改配置文件
# vim /etc/phpldapadmin/config.php
#398行,dn为使用dn登陆,cn为使用用户名登陆,可选其一
$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');
#460行,关闭匿名登录,必做
$servers->setValue('login','anon_bind',false);
#519行,保证用户属性的唯一性
$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
4、设置nginx代理
# vim /etc/nginx/conf.d/phpldapadmin.conf
server {
listen 8080;
server_name localhost;
access_log /var/log/nginx/phpldapadmin_access.log;
error_log /var/log/nginx/phpldapadmin_errors.log;
root /usr/share/phpldapadmin/htdocs/;
index index.php index.html;
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
出现以下报错解决方案
Deprecated: Array and string offset access syntax with curly braces is deprecated in /usr/share/phpldapadmin/lib/functions.php on line 1641
# vim /usr/share/phpldapadmin/lib/functions.php
1640 if (in_array('sambaaccount',$object_classes) &&
1641 '$' == $rdn[ strlen($rdn) - 1 ]) # 将使用大括号 {} 的数组或字符串偏移量访问语法修改为使用方括号 []
1642 return 'nt_machine.png';
# nginx -s reload
# systemctl restart php74-php-fpm.service
访问http://ip:8080/
DN:cn=admin,dc=gaoyufu,dc=net
密码:123456
2、docker-compose部署
version: "2"
services:
phpldapadmin:
image: osixia/phpldapadmin:0.9.0
container_name: phpldapadmin
hostname: phpldapadmin
restart: always
environment:
TZ: Asia/Shanghai # 设置容器时区与宿主机保持一致
PHPLDAPADMIN_HTTPS: "false" # 是否使用https
PHPLDAPADMIN_LDAP_HOSTS: openldap # 指定LDAP连接地址
ports:
- 8090:80
volumes:
- ./phpadmin:/var/www/phpldapadmin # 如果需要的话,可以配置挂载持久化目录
当打开phpldapadmin页面发现是英文时可以执行以下命令
docker exec -it phpldapadmin sed -i -e 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen && dpkg-reconfigure --frontend=noninteractive locales
四、部署self-service-password
self-service-password是一个用于重置和更改密码的Web应用程序,旨在提供一种方便的方式来管理密码。这个应用程序可以与LDAP目录进行交互,允许用户在不需要依赖管理员或访问密码的情况下更改其密码。通过self-service-password,用户可以通过一个简单的Web界面访问其密码,并在需要时进行更改。这个应用程序还提供了许多安全功能,例如密码重置链接和双因素身份验证,以保护用户的账户和数据安全。
因为self-service-password容器化部署参数过多,所以不建议使用docker部署
1、添加软件源
# vim /etc/yum.repos.d/ltb-project.repo
[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
# rpm --import https://ltb-project.org/wiki/lib/RPM-GPG-KEY-LTB-project
2、安装软件包
php7.4安装方法同上
# yum -y install self-service-password
# yum -y install sendmail
注:self-service-password的邮件服务使用的是sendmail而不是系统自带的postfix服务
3、使用Nginx代理
# vim /etc/nginx/conf.d/self-service-password.conf
server {
listen 8888; # 前端页面端口,可自行更改
root /usr/share/self-service-password/htdocs;
index index.php index.html index.htm;
# Make site accessible from http://localhost/
server_name localhost;
# Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
sendfile off;
gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
gzip_vary on;
gzip_proxied any;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
# Add stdout logging
access_log /var/log/php-access.log;
error_log /var/log/php-error.log;
# pass the PHP scripts to FastCGI server listening on socket
#
location ~ \.php {
#fastcgi_pass unix:/var/run/php-fpm.socket;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
try_files $fastcgi_script_name =404;
fastcgi_read_timeout 600;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
internal;
}
# deny access to . files, for security
#
location ~ /\. {
log_not_found off;
deny all;
}
location ~ /scripts {
log_not_found off;
deny all;
}
}
# nginx -s reload
4、配置self-service-password服务
1、关联ldap
# cd /usr/share/self-service-password/conf/
# vim config.inc.php
$ldap_url = "ldap://127.0.0.1:389";
$ldap_starttls = false;
$ldap_binddn = "cn=admin,dc=example,dc=com";
$ldap_bindpw = '123465';
// for GSSAPI authentication, comment out ldap_bind* and uncomment ldap_krb5ccname lines
//$ldap_krb5ccname = "/path/to/krb5cc";
$ldap_base = "dc=example,dc=com";
$ldap_login_attribute = "uid";
$ldap_fullname_attribute = "cn";
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
$ldap_use_exop_passwd = false;
$ldap_use_ppolicy_control = false;
2、设置邮件
## Mail
# LDAP mail attribute
$mail_attributes = array( "mail", "gosaMailAlternateAddress", "proxyAddresses" );
# Get mail address directly from LDAP (only first mail entry)
# and hide mail input field
# default = false
$mail_address_use_ldap = false;
# Who the email should come from
$mail_from = "132465789@163.com";
$mail_from_name = "LDAP密码重置服务";
$mail_signature = "本邮件为通过密码自助修改LDAP账号密码,无需回复,如有重置密码遇到问题可以联系运维同学";
# Notify users anytime their password is changed
$notify_on_change = true;
# PHPMailer configuration (see https://github.com/PHPMailer/PHPMailer)
$mail_sendmailpath = '/usr/sbin/sendmail';
$mail_protocol = 'smtp';
$mail_smtp_debug = 0;
$mail_debug_format = 'html';
$mail_smtp_host = 'smtp.163.com';
$mail_smtp_auth = true;
$mail_smtp_user = '132465798@163.com';
$mail_smtp_pass = '11111111111111111111';
$mail_smtp_port = 465;
$mail_smtp_timeout = 30;
$mail_smtp_keepalive = false;
$mail_smtp_secure = 'ssl';
$mail_smtp_autotls = true;
$mail_smtp_options = array();
$mail_contenttype = 'text/plain';
$mail_wordwrap = 0;
$mail_charset = 'utf-8';
$mail_priority = 3;
3、配置重置密码
$keyphrase
是配置文件中的一个重要参数。它用于加密和验证密码重置链接,确保链接的安全性和有效性。
当用户请求密码重置时,系统会生成一个包含$keyphrase
的加密链接,并将其发送给用户。用户点击链接后,系统会使用相同的$keyphrase
来验证链接的有效性,并允许用户重置密码。
因此,$keyphrase
的作用是确保密码重置链接的安全性和验证过程的正确性。建议将$keyphrase
设置为一个强密码,并定期更改以增加安全性。
$keyphrase = "zzzzzzzzzzzzzzz";
4、设置中文页面
$lang = "zh-CN";
5、更换自定义logo
# Logo
$logo = "images/ltb-logo.png";
五、LDAP卸载
1、停止openldap
systemctl stop slapd
systemctl disable slapd
2、卸载软件包
yum -y remove openldap-servers openldap-clients
3、删除残留文件
# 删除ldap用户
userdel ldap
# 删除数据文件
rm -rf /var/lib/ldap
# 删除openldap目录
rm -rf /etc/openldap
ldap删除重装无法启动或者启动报错main: TLS init def ctx failed: -1处理
mkdir -p /etc/openldap/certs
bash /usr/libexec/openldap/create-certdb.sh
bash /usr/libexec/openldap/generate-server-cert.sh
评论区