基础教程
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
数据库名可能是 hdb
,mdb, 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=com
及 ou=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
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
执行
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"