本文首发: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:

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

CentOS:

yum install openldap-servers openldap-clients	# 上同

LDAP 服务器配置初始化

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

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

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

首先停止数据库服务:

systemctl stop slapd

然后编辑文件:

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

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

# file: rules

##################################
# 本文请自行选择复制到到文件内 #
##################################
#自定义基本域名(必选):
s/@SUFFIX@/$(basename)/g
#自定义管理员用户密码(必须):
s/@PASSWORD@/$(password)/g
#自定义管理员用户名称(可选):
s/cn=admin/cn=$(username)/g #数据库类型(3选1,必选):
# mdb
s/@BACKEND@/mdb/g
s/@BACKENDOBJECTCLASS@/olcMdbConfig/g
s/@BACKENDOPTIONS@/olcDbMaxSize: 1073741824/g
# hdb
s/@BACKEND@/hdb/g
s/@BACKENDOBJECTCLASS@/olcHdbConfig/g
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
# bdb
s/@BACKEND@/bdb/g
s/@BACKENDOBJECTCLASS@/olcBdbConfig/g
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数据库,样例如下:

# file:rule

s/@SUFFIX@/dc=black,dc=com/g
s/@PASSWORD@/{SSHA}RadcVPriXsR6gCwhwPKsCLkhnHy3r1ZS/g
s/cn=admin/cn=root/g
s/@BACKEND@/hdb/g
s/@BACKENDOBJECTCLASS@/olcHdbConfig/g
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

其中密码是这样生成的:

slappasswd -s 147258369

{SSHA}RadcVPriXsR6gCwhwPKsCLkhnHy3r1ZS

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

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

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

Closing DB...

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

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

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

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

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

systemctl start slapd

LDAP 数据库创建

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

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

# file:base.ldif

# 根节点					复制时,注意把这这个注释删了!!!!
dn: dc=black,dc=com
dc: black
objectClass: top
objectClass: domain
# 管理员用户root
dn: cn=root,dc=black,dc=com
objectClass: organizationalRole
cn: root
description: LDAP Manager

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

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: 指定文件

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

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 条目添加

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

# file: group.ldif

# 组织单元
dn: ou=User,dc=black,dc=com
objectClass: organizationalUnit
ou: User
# 用户1
dn: uid=User1,ou=User,dc=black,dc=com
objectClass: account
objectClass: simpleSecurityObject
uid: User1
userPassword: {SSHA}5WjJz9QfntUjurHirfv9C4832x1xh9Kt
# 用户2
dn: uid=User2,ou=User,dc=black,dc=com
objectClass: account
objectClass: simpleSecurityObject
uid: User2
userPassword: {SSHA}9biML+BP/W8w3mRkVack7CyB1hfDi8cD

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

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 可以从文件中读取数据,同时也可从标准输入输出读取数据:

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

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

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

ldapmodify 条目更改

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

# file: change.ldif

dn: uid=User3,ou=User,dc=black,dc=com
changetype: modify
replace: userPassword
userPassword: {SSHA}9TM5y06bvepK6k8i+Jfkc/9C6GkVsobm

然后使用命令即可。

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

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

那么再来验证一下:

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

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

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

ldapdelete 条目删除

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

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

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

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

ldap_bind: Invalid credentials (49)

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

ldapsearch 条目搜寻

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

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 用户查询

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

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)的节点。

# file: config.ldif

dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}5WjJz9QfntUjurHirfv9C4832x1xh9Kt

然后通过命令完成修改:

 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 提供的命令完成了该操作,主要就是方便而且全面,也不想去了解别的方法,都没这个实在。

服务器备份

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

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

服务器还原

关闭服务器:

systemctl stop slapd

删除原始文件:

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

还原数据库:

slapadd -l slapcat.bak.0.ldif -F /etc/ldap/slapd.d/ -b "cn=config"		# 还原服务器配置
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...

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

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

启动服务器:

systemctl start slapd

部署 LDAP 应用

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

apt install phpldapadmin

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

# file: /etc/phpldap/config.php

……
$servers->setValue('server','base',array('dc=black,dc=com')); # 在300行,更改服务器
……
……
$servers->setValue('login','bind_id','cn=root,dc=black,dc=com'); # 在326行,更改登入的默认字符串
……

然后登入即可:

界面如下:

本文经「原本」原创认证,作者乾坤盘,访问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. PATB 1015. 德才论 (25)

    1015. 德才论 (25) 比较函数折腾好久,最后还因为cout,printf的区别而超时,超时是因为cout输出效率低. 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 ...

  2. python基本数据类型之数字类型和其相关运算

    数字(number) Python3 支持 int.float.bool.complex(复数). 在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. ...

  3. java虚拟机-简介

    一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...

  4. CentOS java生成文件并赋予权限的问题

    2.检查文件是否允许: file.canExecute(); – return true, file is executable; false is not. file.canWrite(); – r ...

  5. JDK源码阅读(一):Object源码分析

    最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...

  6. easyui datagrid 单元格 编辑时 事件 修改另一单元格

    //datagrid 列数据 $('#acc').datagrid({ columns : [ [ { field : 'fee_lend', title : '收费A', width : 100, ...

  7. [Python学习]错误篇一

    REFERENCE:<Head First Python> ID:我的第一篇[Python学习] BIRTHDAY:2019.7.6 EXPERIENCE_SHARING:两个程序错误类型 ...

  8. mysql中id值被重置的情况

    MySQL中,如果你为一张使用了innodb引擎的表指定了一auto_increment列,那么这张表会有一个auto_increment计数器,专门记录当前auto_increment的相关值,用来 ...

  9. 哈工大计算机网络Week1-网络应用

    目录 哈工大计算机网络Week1-网络应用 2.1网络应用的体系结构 特点 应采取什么结构 C/S结构 客户机/服务器 P2P CS vs P2P 混合结构 思考题目 2.2网络应用的基本原理 网络应 ...

  10. 5分钟完成mysql离线安装

    1. 场景描述 mysql离线安装并不复杂,就是经常会出现漏东西,有时候的搞半天,总结下,快速离线安装mysql,直接把下面的命令敲一遍就好,5-10分钟就能安装好. 2. 解决方案 安装的mysql ...