本文首发:https://www.somata.net/2019/openldap_server_config_and_management.html

本文主要在debian配置,如果需要在CentOS上部署,需要修改大部分的路径,这里需要自行修改。

LDAP 服务按照个人理解,也可使理解为一个数据库,但是这个数据库的读写性能不像 MySQL 一样拥有良好的读写性能,而 LDAP 更偏向于读取,而弱于写入。并且 LDAP 的数据类型属于面向对象的数据类型,这和 MySQL 的数据类型不同,并且使用树状结构记录数据,这些都与普通的数据库(关系型数据库),有着极大的差别。而这一切的一切都代表着 LDAP 这个服务并不是用做一个普通的数据库(关系型数据库)用的,而是用于类似于账户存储等这种少存入、多读取、需要包含对象类型和对象相关属性的场合。

LDAP工作机制

就跟上面说的一样,LDAP是树状结构的数据库,所以说如果想要找到其中一个节点,就得通过逐层查询,并且必须保证每一个节点的路径唯一,那么这个节点的路径就称之为dn,dn 的编写路径必须是由下而上编写的,例如:

cn=scott,ou=marketing,ou=people,dc=mydomain,dc=org

关键字 英文全称 含义
dc Domain Component 域名的部分,其格式是将完整的域名分成几部分,如域名为 example.com 那么就是: dc=example,dc=com
uid User Id 用户 ID,如 “tom”
ou Organization Unit 组织单位,类似于 Linux 文件系统中的子目录,它是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如 “market”
cn Common Name 公共名称,如 “Thomas Johansson”
sn Surname 姓,如 “Johansson”
c Country 国家,如 “CN” 或“US”等。
o Organization 组织名,如 “Example, Inc.”
dn Distinguished Name 惟一辨别名,类似于 Linux 文件系统中的绝对路径,每个对象都有一个惟一的名称,如 “uid= tom,ou=market,dc=example,dc=com”,在一个目录树中 DN 总是惟一的
rdn Relative dn 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如 “uid=tom” 或“cn= Thomas Johansson”

以上这些类别没有指定特定的用法,这些完全由应用程序自行决定。

LDAP 安装

debian:

  1. apt install slapd ldap-utils # slapd 为服务端, ldap-utils 为客户端程序

CentOS:

  1. yum install openldap-servers openldap-clients # 上同

LDAP 服务器配置初始化

做这一步的目的是为了完全自定义初始化数据库,抛弃由软件包构成的数据库。
当然你也可以跳过这个步骤,直接开始下一步,这样也是无所谓的。

你也可以你使用 debian 提供的便捷方式来完成服务器配置: dpkg-reconfig slapd

首先先来解释一些为什么要按照如下(完全属于个人理解):
新版的 OpenLdap 已经弃用了 slapd.conf 配置文件,改而使用 slapd.d 目录下的树状目录文件来配置服务器的相关配置。但是 slapd.d 是由服务进程维护的,并且使用CRC来校验文本是否改动,我们无法轻易修改,slapd安装包给我们提供了一个命令 slapadd 用于创建配置文件,所以才用了下面的方法来初始化数据库。后期使用 ldapmodifyldapadd 来完成服务器配置。

首先停止数据库服务:

  1. systemctl stop slapd

然后编辑文件:

  1. # 首先备份文件,以免无法复原
  2. mkdir /root/back
  3. tar -Jcvf /root/back/slapd.config-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/ldap/slapd.d/
  4. tar -Jcvf /root/back/slapd.data-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap /var/lib/slapd
  5. # 然后再删除配置文件
  6. rm -rf /etc/ldap/slapd.d/*
  7. rm -rf /var/lib/slapd/*
  8. rm -rf /var/lib/ldap/*
  9. # 复制配置文件到临时目录
  10. cp /usr/share/slapd/slapd.init.ldif /tmp
  11. cd /tmp

这里我创建一个sed的规则表,方便使用,以下请自行选择。

  1. # file: rules
  2. ##################################
  3. # 本文请自行选择复制到到文件内 #
  4. ##################################
  5. #自定义基本域名(必选):
  6. s/@SUFFIX@/$(basename)/g
  7. #自定义管理员用户密码(必须):
  8. s/@PASSWORD@/$(password)/g
  9. #自定义管理员用户名称(可选):
  10. s/cn=admin/cn=$(username)/g
  11. #数据库类型(3选1,必选):
  12. # mdb
  13. s/@BACKEND@/mdb/g
  14. s/@BACKENDOBJECTCLASS@/olcMdbConfig/g
  15. s/@BACKENDOPTIONS@/olcDbMaxSize: 1073741824/g
  16. # hdb
  17. s/@BACKEND@/hdb/g
  18. s/@BACKENDOBJECTCLASS@/olcHdbConfig/g
  19. s/@BACKENDOPTIONS@/olcDbConfig: set_cachesize 0 2097152 0\nolcDbConfig: set_lk_max_objects 1500\nolcDbConfig: set_lk_max_locks 1500\nolcDbConfig: set_lk_max_lockers 1500/g
  20. # bdb
  21. s/@BACKEND@/bdb/g
  22. s/@BACKENDOBJECTCLASS@/olcBdbConfig/g
  23. s/@BACKENDOPTIONS@/olcDbConfig: set_cachesize 0 2097152 0\nolcDbConfig: set_lk_max_objects 1500\nolcDbConfig: set_lk_max_locks 1500\nolcDbConfig: set_lk_max_lockers 1500/g

这里我选择hdb数据库,样例如下:

  1. # file:rule
  2. s/@SUFFIX@/dc=black,dc=com/g
  3. s/@PASSWORD@/{SSHA}RadcVPriXsR6gCwhwPKsCLkhnHy3r1ZS/g
  4. s/cn=admin/cn=root/g
  5. s/@BACKEND@/hdb/g
  6. s/@BACKENDOBJECTCLASS@/olcHdbConfig/g
  7. s/@BACKENDOPTIONS@/olcDbConfig: set_cachesize 0 2097152 0\nolcDbConfig: set_lk_max_objects 1500\nolcDbConfig: set_lk_max_locks 1500\nolcDbConfig: set_lk_max_lockers 1500/g

其中密码是这样生成的:

  1. slappasswd -s 147258369

{SSHA}RadcVPriXsR6gCwhwPKsCLkhnHy3r1ZS

再然后通过命令修改配置文件,并且生成配置文件和数据库:

  1. sed -i -f rule /tmp/slapd.init.ldif
  2. slapadd -F "/etc/ldap/slapd.d/" -b "cn=config" -l slapd.init.ldif

_#################### 100.00% eta none elapsed none fast!

Closing DB...

我们再查看一下这些文件的:

  1. ll /etc/ldap/slapd.d/*

-rw------- 1 root root 478 Jul 10 09:06 /etc/ldap/slapd.d/cn=config.ldif

/etc/ldap/slapd.d/cn=config:

total 28

-rw------- 1 root root 452 Jul 10 09:06 cn=module{0}.ldif

drwxr-x--- 2 root root 4096 Jul 10 09:06 cn=schema

-rw------- 1 root root 394 Jul 10 09:06 cn=schema.ldif

-rw------- 1 root root 412 Jul 10 09:06 olcBackend={0}hdb.ldif

-rw------- 1 root root 542 Jul 10 09:06 olcDatabase={0}config.ldif

-rw------- 1 root root 657 Jul 10 09:06 olcDatabase={-1}frontend.ldif

-rw------- 1 root root 1084 Jul 10 09:06 olcDatabase={1}hdb.ldif

哦,我们这里看到了好像文件权限不对啊,所以我们也改改文件属主。

  1. chown -R openldap:openldap slapd.d
  2. chown -R openldap:openldap /var/lib/slapd/*
  3. chown -R openldap:openldap /var/lib/ldap/*

那么这里就可以正常启动服务器了:

  1. systemctl start slapd

LDAP 数据库创建

这里我们还需要注意虽然前面创建的服务器配置里有DN信息,但是真正的数据库完全没有创建,这里我们必须手动创建这些数据库。当然你可以使用命令 slapcat 或者 ldapsearch 命令来查询是否有数据存在。

首先创建一个文件,用于记录需要存入的数据,ldap数据库没有交互式界面,每一次操作都必须一条命令,其实这也侧面证明了LDAP是是个偏读取的面向对象型的服务,而不是一个综合型的数据库服务。

  1. # file:base.ldif
  2. # 根节点 复制时,注意把这这个注释删了!!!!
  3. dn: dc=black,dc=com
  4. dc: black
  5. objectClass: top
  6. objectClass: domain
  7. # 管理员用户root
  8. dn: cn=root,dc=black,dc=com
  9. objectClass: organizationalRole
  10. cn: root
  11. description: LDAP Manager

然后我们再通过命令,将 base.ldif 这的信息导入至数据库

  1. ldapadd -x -D "cn=root,dc=black,dc=com" -w 147258369 -f base.ldif

adding new entry "dc=black,dc=com"

adding new entry "cn=root,dc=black,dc=com"

这里需要解释一项这里命令的基本用法:

  • -x: 表示使用基本拥挤认证
  • -D "cn=root,dc=black,dc=com" -w 147258369: 指定用户和密码
  • -f: 指定文件

那么这里再验证一下数据库是否创建成功:

  1. ldapsearch -x -D "cn=root,dc=black,dc=com" -w 147258369 -b "dc=black,dc=com"

# extended LDIF

#

# LDAPv3

# base <dc=black,dc=com> with scope subtree

# filter: (objectclass=*)

# requesting: ALL

#

# black.com

dn: dc=black,dc=com

dc: black

objectClass: top

objectClass: domain

# root, black.com

dn: cn=root,dc=black,dc=com

objectClass: organizationalRole

cn: root

description: LDAP Manager

# search result

search: 2

result: 0 Success

# numResponses: 3

# numEntries: 2

再解释一个参数:

  • -b: 指定需要搜索的base目录

LDAP 后期管理

数据库管理

这里的数据库管理也可是使用一些 LDAP 软件来完成(部署 LDAP 应用),不过还以要写写命令行,因为命令行的灵活性高,而且便于理解,这些都是应用程序无法比拟的。

ldapadd 条目添加

还是和上面数据库创建一样的,需要先创建一个文件用于存放数据。

  1. # file: group.ldif
  2. # 组织单元
  3. dn: ou=User,dc=black,dc=com
  4. objectClass: organizationalUnit
  5. ou: User
  6. # 用户1
  7. dn: uid=User1,ou=User,dc=black,dc=com
  8. objectClass: account
  9. objectClass: simpleSecurityObject
  10. uid: User1
  11. userPassword: {SSHA}5WjJz9QfntUjurHirfv9C4832x1xh9Kt
  12. # 用户2
  13. dn: uid=User2,ou=User,dc=black,dc=com
  14. objectClass: account
  15. objectClass: simpleSecurityObject
  16. uid: User2
  17. userPassword: {SSHA}9biML+BP/W8w3mRkVack7CyB1hfDi8cD

然后我们再通过命令将文件添加到数据库:

  1. ldapadd -x -D "cn=root,dc=black,dc=com" -w 147258369 -f group.ldif

adding new entry "ou=User,dc=black,dc=com"

adding new entry "uid=User1,ou=User,dc=black,dc=com"

adding new entry "uid=User2,ou=User,dc=black,dc=com"

ldapadd 可以从文件中读取数据,同时也可从标准输入输出读取数据:

  1. cat << EOF | ldapadd -x -D "cn=root,dc=black,dc=com" -w 147258369
  2. dn: uid=User3,ou=User,dc=black,dc=com
  3. objectClass: account
  4. objectClass: simpleSecurityObject
  5. uid: User3
  6. userPassword: {SSHA}iES3qeH0nYUcwGtSQm1hIBCEsV+gBF3P
  7. EOF

adding new entry "uid=User3,ou=User,dc=black,dc=com"

这样就可以临时添加数据了,同时这样也可使用bash脚本完成批量用户添加,这里我就不演示了。

ldapmodify 条目更改

还是一样的将数据写入文件,不过这里需要注意,因为是更改条目,所以需要编写指明更改模式,和更改目标。

  1. # file: change.ldif
  2. dn: uid=User3,ou=User,dc=black,dc=com
  3. changetype: modify
  4. replace: userPassword
  5. userPassword: {SSHA}9TM5y06bvepK6k8i+Jfkc/9C6GkVsobm

然后使用命令即可。

  1. ldapmodify -x -D "cn=root,dc=black,dc=com" -w 147258369 -f change.ldif

modifying entry "uid=User3,ou=User,dc=black,dc=com"

那么再来验证一下:

  1. ldapwhoami -x -D "uid=User3,ou=User,dc=black,dc=com" -w 147

dn:uid=User3,ou=User,dc=black,dc=com

如果返回如上,那么修改成功。

ldapdelete 条目删除

删除条目不需要写清除如何如何,只需要指定条目路径即可,也就是dn.

  1. ldapdelete -x -D "cn=root,dc=black,dc=com" -w 147258369 "uid=User3,ou=User,dc=black,dc=com"

这个命令没有返回信息,那么表明执行成功。我们再次使用命令验证:

  1. ldapwhoami -x -D "uid=User3,ou=User,dc=black,dc=com" -w 123456

ldap_bind: Invalid credentials (49)

这就返回凭据无效则表明条目删除成功。

ldapsearch 条目搜寻

这个就不多说了,直接上命令:

  1. ldapsearch -x -b "dc=black,dc=com" -D "cn=root,dc=black,dc=com" -w 147258369 "(&(objectclass=account)(uid=User1))" # 这里最后一段是filter,用于过滤查询结果

# extended LDIF

#

# LDAPv3

# base <dc=black,dc=com> with scope subtree

# filter: (objectclass=*)

# requesting: ALL

#

# User1, User, black.com

dn: uid=User1,ou=User,dc=black,dc=com

objectClass: account

objectClass: simpleSecurityObject

userPassword:: e1NTSEF9OWJpTUwrQlAvVzh3M21Sa1ZhY2s3Q3lCMWhmRGk4Y0Q=

uid: User1

# search result

search: 2

result: 0 Success

# numResponses: 6

# numEntries: 5

-b:指定基本路径,会查找该路径下的所有节点

ldapwhomai 用户查询

前面也用过了,直接上命令:

  1. ldapwhoami -x -D "cn=root,dc=black,dc=com" -w 147258369

dn:cn=root,dc=black,dc=com

返回值如上则表示正常

服务器配置

这里服务器的后续配置,不能再动 slapd.d 目录下的文件了,必须通过 ldap 提供的 API 接口完成服务器配置,这点是非常重要的,因为默认的配置是只允许通过本地SASL认证的用户才能修改服务器的配置文件,这样才能保证服务器的安全性。所以我们还需要通过客户端命令 ldapmodify 命令来进行服务配置,比如所修改管理员密码:

这里的dn节点与数据库节点不同,你可以看到这些条目对应的就是 slapd.d 目录下的文件了,当然是去去除了后缀名(ldif)的节点。

  1. # file: config.ldif
  2. dn: olcDatabase={1}hdb,cn=config
  3. changetype: modify
  4. replace: olcRootPW
  5. olcRootPW: {SSHA}5WjJz9QfntUjurHirfv9C4832x1xh9Kt

然后通过命令完成修改:

  1. ldapmodify -Y EXTERNAL -H ldapi:/// -f config.ldif

SASL/EXTERNAL authentication started

SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth

SASL SSF: 0

modifying entry "olcDatabase={1}hdb,cn=config"

注:如果节点不存在,但是你还是想要创建也是可是的,你需要将dn节点指定到你需要创建的文件路径,然后使用命令ldapadd 添加即可。

LDAP 备份和还原

这里我使用了 slapd 提供的命令完成了该操作,主要就是方便而且全面,也不想去了解别的方法,都没这个实在。

服务器备份

  1. slapcat -n 0 -l slapcat.bak.0.ldif # 0 表示备份服务器配置
  2. slapcat -n 1 -l slapcat.bak.1.ldif # 1 表示备份数据库

无返回信息则表示执行成功。

服务器还原

关闭服务器:

  1. systemctl stop slapd

删除原始文件:

  1. # 首先备份文件,以免无法复原
  2. mkdir /root/back
  3. tar -Jcvf /root/back/slapd.config-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/ldap/slapd.d/
  4. tar -Jcvf /root/back/slapd.data-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap /var/lib/slapd
  5. # 然后再删除配置文件
  6. rm -rf /etc/ldap/slapd.d/*
  7. rm -rf /var/lib/slapd/*
  8. rm -rf /var/lib/ldap/*

还原数据库:

  1. slapadd -l slapcat.bak.0.ldif -F /etc/ldap/slapd.d/ -b "cn=config" # 还原服务器配置
  2. slapadd -l slapcat.bak.1.ldif -F /etc/ldap/slapd.d/ # 还原数据库

_#################### 100.00% eta none elapsed none fast!

Closing DB...

_#################### 100.00% eta none elapsed none fast!

Closing DB...

这样就搞定了。
但是还是需要注意权限:

  1. chown -R openldap:openldap /etc/ldap/slapd.d/*
  2. chown -R openldap:openldap /var/lib/slapd/*
  3. chown -R openldap:openldap /var/lib/ldap/*

启动服务器:

  1. systemctl start slapd

部署 LDAP 应用

这里直接使用 phpldapadmin了, 我也不想再多弄了,怎么简单,怎么来了。

  1. apt install phpldapadmin

然后配置一下 phpladpadmin的文件即可:

  1. # file: /etc/phpldap/config.php
  2. ……
  3. $servers->setValue('server','base',array('dc=black,dc=com')); # 在300行,更改服务器
  4. ……
  5. ……
  6. $servers->setValue('login','bind_id','cn=root,dc=black,dc=com'); # 在326行,更改登入的默认字符串
  7. ……

然后登入即可:

界面如下:

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【2P9ZA60S】获取授权信息。

LDAP 服务搭建和后期管理的更多相关文章

  1. OPENLDAP 服务搭建和后期管理

    LDAP 服务 本文首发:https://www.cnblogs.com/somata/p/OPENLDAPServerConfigAndPostManagement.html 本文主要在debian ...

  2. [ LDAP ] LDAP服务搭建及应用

    ldap 搭建及应用 node1: 192.168.118.14node2: 192.168.118.25 ldap server : 192.168.118.14 1. 安装LDAP服务器 [roo ...

  3. windows服务器基本管理及服务搭建

    windows服务器基本管理及服务搭建 ****windows服务器系统版本:2000 2003 2008 2012 1.用户与组管理 用户:账户=账号/用户名+密码 每个账户有自己唯一的SID 账户 ...

  4. 微信小程序语音识别服务搭建全过程解析(项目开源在github)

    silk v3录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) ## 重要的写在前面 重要事项一: 目前本文中提到的API已支持微信小程序录音文件格式:silk v ...

  5. 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)

    silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...

  6. 常用服务搭建(nfs/ftp/samba)

    一. NFS1. NFS简介NFS全称是network file systemNFS允许一个系统在网络上与他人共享目录和文件.通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件. 假 ...

  7. centos 7 部署LDAP服务

    172.21.251.111 server172.21.251.112 node {SSHA}gGQUjzyJX+Oi7ZJCURCVmqq2UmtVWHZd一.环境准备关闭 selinux fire ...

  8. linux之FTP服务搭建 ( ftp文件传输协议 VSFTPd虚拟用户)

    FTP服务搭建 配置实验之前关闭防火墙 iptables -F iptables -X iptables -Z systemctl stop firewalld setenforce 0 1.ftp简 ...

  9. 【干货】ECS服务器OPENVPN搭建,方便管理所有内网服务器

    [干货]ECS服务器OPENVPN搭建,方便管理所有内网服务器 使用场景 一台有外网的ECS服务器+N台无外网的ECS服务器,使用OPENVPN管理全部的ECS服务器(包括无外网的ECS服务器). 鉴 ...

随机推荐

  1. 手动搭建自己的nuget服务器及使用

    这篇文章的主要目的: 1.搭建自己的私有的nuget服务器 2.打包代码为nuget包 3.在其他项目中使用私有服务器上的nuget包 一. 搭建自己的nuget服务器 1. 创建一个空的ASP.NE ...

  2. 牛客假日团队赛1 B

    B.便便传送门(一) 题目链接:https://ac.nowcoder.com/acm/contest/918/B 题目 Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他制造了一个伟 ...

  3. [MFC.Windows程序设计(第2版) 第一章

    1,windows编程模型如下图: 2, windows的消息有成百上千种,以下列举10个: 3,消息处理函数的四个参数:窗口句柄(表示消息属于哪个窗口,32值.该窗口句柄引用一个数据结构,数据结构存 ...

  4. C++ 洛谷 P2704 [NOI2001]炮兵阵地

    P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...

  5. leadcode的Hot100系列--155. 最小栈

    栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...

  6. 【名额有限】云开发AI拓展能力等你来体验!

    这次来了个超厉害的新能力! 人脸智能打马赛克.人脸智能裁剪--各种操作,都能一步到位! 迫不及待想体验,戳链接:https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂,继续往 ...

  7. Python入门(一) 异常处理

    异常处理 捕捉异常可以使用try/except语句. try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理. 以下是语法: try: <语句> # ...

  8. Python旅途——函数的递归和栈的使用

    Python--函数之递归.栈的使用 今天主要和大家分享函数的递归,同时引入一个新的概念--栈 1.递归 1.定义 函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子: 这 ...

  9. reportlab生成pdf

    文档地址:https://www.reportlab.com/docs/reportlab-userguide.pdf 源码地址:https://bitbucket.org/rptlab/report ...

  10. Java集合类的概述

    前述 复习一下Java中的集合类,是面试笔试中常考察的一个点,特地做的整理. 什么是集合类? 集合类,也叫容器类.Java集合类可以用来存储数量庞大的对象. 我们和数组进行对比: 数组:存储基本数据类 ...