基础教程

LDAP 全称轻量级目录访问协议(英文:Lightweight Directory Access Protocol),是一个运行在 TCP/IP 上的目录访问协议。目录是一个特殊的数据库,它的数据经常被查询,但是不经常更新。其专门针对读取、浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。比如 DNS 协议便是一种最被广泛使用的目录服务。

LDAP 中的信息按照目录信息树结构组织,树中的一个节点称之为条目(Entry),条目包含了该节点的属性及属性值。条目都可以通过识别名 dn 来全局的唯一确定1,可以类比于关系型数据库中的主键。比如 dn 为 uid=ada,ou=people,dc=xinhua,dc=io 的条目表示在组织中一个名字叫做 Ada Catherine 的员工,其中 uid=ada 也被称作相对区别名 rdn。

一个条目的属性通过 LDAP 元数据模型(Scheme)中的对象类(objectClass)所定义,下面的表格列举了对象类 inetOrgPerson(Internet Organizational Person)中的一些必填属性和可选属性。

参数说明

LDAP 中的参数命名可以说是五花八门,如果光看参数,很难明白到底是什么意思,为什么会这样呢,主要原因就是LDAP的开发者命名不规范,比如cn他是Common Name的缩写

cn该条目被人所熟知的通用名(Common Name)
sn该条目的姓氏
o该条目所属的组织名(Organization Name)

安装

环境

  • centos 7 / centos6

注意:所有密码可以不使用slappasswd生成,可以使用明文或者沿用文章中的旧密码,旧密码对应的明文都为 666666

第一步 安装相关程序包

需要切换到 root 账号来安装 OpenLDAP 相关程序包,并启动服务:

yum install -y openldap-servers openldap-clients
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
# CentOS 7
systemctl enable slapd && systemctl start slapd
# CentOS 6
service slapd start

第二步 配置管理员密码

我们使用 slappasswd 命令来生成一个密码 (明文是 666666),并使用 LDIF(LDAP 数据交换格式)文件将其导入到 LDAP 中来配置管理员密码:

# {SSHA}KS/bFZ8KTmO56khHjJvM97l7zivH1MwG 是执行 slappasswd,输入密码后生成的加密字符串
slappasswd
vim chrootpw.ldif
# specify the password generated above for "olcRootPW" section
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}KS/bFZ8KTmO56khHjJvM97l7zivH1MwG

执行导入文件

ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

第三步 导入元组

我们需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于 /etc/openldap/schema/ 目录中,定义了我们以后创建的条目可以使用哪些属性:

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/core.ldif
 ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
 ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
 ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

第四步 配置顶级域

我们需要配置 LDAP 的顶级域(以 dc=xxxx,dc=com 为例)及其管理域:

slappasswd
vim chdomain.ldif
# replace to your own domain name for "dc=***,dc=***" section
# specify the password generated above for "olcRootPW" section
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=admin,dc=zdpoc,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=zdpoc,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=zdpoc,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}AnRd0duASR5nCajYUbnkzumtkPi6ZKo2

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=admin,dc=zdpoc,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=zdpoc,dc=com" write by * read

执行

ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
注意
  • 换行会影响文件读取,可能报文件格式错误
  • 每台机器的数据库配置名不一样,可能和 openldap 版本和 linux 系统版本相关,执行
  • hdb 要换成你实际的数据库
  • add 只能用一次,后面再用的话,只能用 replace,要不然会报 no equality matching rule
ls /etc/openldap/slapd.d/cn=config/

结果如下

cn=schema  cn=schema.ldif  olcDatabase={0}config.ldif  olcDatabase={-1}frontend.ldif  olcDatabase={1}monitor.ldif  olcDatabase={2}hdb.ldif

数据库名可能是 hdbmdb, bdb,具体到你的系统中去查看

这里的 hdb、mdb、bdb 可能是不同的后端数据库类型,参考 https://www.openldap.org/doc/admin24/backends.html

创建组织

第五步,在上述基础上,我们来创建一个叫做 Xinhua News Agency 的组织,并在其下创建一个 Manager 的组织角色(该角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元:

dn: dc=zdpoc,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: ZDPOC.COM
dc: zdpoc

dn: cn=admin,dc=zdpoc,dc=com
objectClass: organizationalRole
cn: Manager

dn: ou=people,dc=zdpoc,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=group,dc=zdpoc,dc=com
objectClass: organizationalUnit
ou: group

执行,并输入密码

ldapadd -x -D cn=admin,dc=zdpoc,dc=com -W -f basedomain.ldif

通过以上的所有步骤,我们就设置好了一个 LDAP 目录树:其中基准 dn dc=zdpoc,dc=io 是该树的根节点,其下有一个管理域 cn=admin,dc=zdpoc,dc=io 和两个组织单元 ou=people,dc=zdpoc,dc=comou=group,dc=zdpoc,dc=com

接下来,我们来创建一个叫作 user1 的员工并将其分配到 Secretary 组来验证上述配置是否生效。

slappasswd
# 把下面的内容放至 ldapuser1.ldif
# replace to your own domain name for "dc=***,dc=***" section
# specify the password generated above for "olcRootPW" section
dn: uid=user1,ou=people,dc=zdpoc,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user1
cn: user1
sn: user1
userPassword: {SSHA}2aJi+5n5FMxiw1uhLnXp1rKJvI93TU0r
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
mail: [email protected]
homeDirectory: /home/users/ada

dn: cn=Secretary,ou=group,dc=zdpoc,dc=com
objectClass: posixGroup
cn: Secretary
gidNumber: 1000
memberUid: user1

执行,并输入密码

ldapadd -x -D cn=admin,dc=zdpoc,dc=com -W -f ldapuser1.ldif

输出

[root@v0107-c0a82183 ldif]# ldapadd -x -D cn=admin,dc=zdpoc,dc=com -W -f ldapuser1.ldif
Enter LDAP Password:
adding new entry "uid=user1,ou=people,dc=zdpoc,dc=com"

adding new entry "cn=Secretary,ou=group,dc=zdpoc,dc=com"

添加其他账号信息 vim adduser.ldif

<pre>dn: uid=user2,ou=people,dc=zdpoc,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user2
cn: user2
sn: user2
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/users/ada
mail: [email protected]
userPassword: {SSHA}ATlzkWMbQtYaX0s8W2uXpD2/buepYd9x

dn: uid=user3,ou=people,dc=zdpoc,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user3
cn: user3
sn: user3
uidNumber: 1003
gidNumber: 1000
homeDirectory: /home/users/ada
mail: [email protected]
userPassword: {SSHA}aFqA+iULm0vd060lgiu/xuPmcEANJaDY

dn: uid=user4,ou=people,dc=zdpoc,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user4
cn: user4
sn: user4
uidNumber: 1004
gidNumber: 1000
homeDirectory: /home/users/ada
mail: [email protected]
userPassword: {SSHA}OoCwflKJIGWL60E+GFk0SJTLHn0+0Ha6

dn: uid=user5,ou=people,dc=zdpoc,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user5
cn: user5
sn: user5
uidNumber: 1005
gidNumber: 1000
homeDirectory: /home/users/ada
mail: [email protected]
userPassword: {SSHA}aRDF1bKvezsbR2cHlk07E1PEyRiowZ2V</pre>

执行

ldapadd -x -D cn=admin,dc=zdpoc,dc=com -W -f adduser.ldif

查看服务中的所有条目信息

ldapsearch -x -b "dc=zdpoc,dc=com" ldap://127.0.0.1

删除某个条目

ldapdelete -x -W -D 'cn=admin,dc=zdpoc,dc=com' "uid=user1,ou=People,dc=zdpoc,dc=com"

参考资料

CentOS 7 环境下 OpenLDAP 的安装与配置

OpenLDAP 初识

我花了一个五一终于搞懂了OpenLDAP

How to Setup OpenLDAP Multi-Master Replication on CentOS 7

03-05 20:07