如何使用openldap搭建LDAP服务篇1--初见LDAP

2022-12-28 12:48:43 浏览数 (1)

LDAP是轻量目录访问协议,这个服务从老高进入360就一直在用,LDAP带来的好处真的是很多,你可以把它想象成为一个内网版的单点登录服务,可以让你使用同一组账户密码访问所有支持LDAP验证的系统,为企业的内部运维带来了极大的便利。

不过想要自己独立搭建一个LDAP服务还是挺麻烦的!不过一旦搭建好了LDAP服务器,剩下的管理和运维就简单多了。

在搭建LDAP服务器前,我们必须需要了解一些LDAP的基本概念。

What is LDAP

Lightweight Directory Access Protocol,轻量目录访问协议,他是基于 X.500(目录访问协议)的DAP发展过来的,与LDAP一样提供类似的目录服务软件还有ApacheDS、Active Directory、Red Hat Directory Service。

X.500 是 ISO 制定的一套目录服务的标准,它是一个协议族,定义了一个机构如何在全局范围内共享名称和与名称相关联的对象。通过它,可以将局部的目录服务连接起来,构建基于 Internet 的分布在全球的目录服务系统……而目录访问协议(DAP)是 X.500 的核心组成之一。

LDAP的特点

  • LDAP基于TCP/IP
  • LDAP的结构用树来表示
  • LDAP读快写慢
  • Client/server模型,Server 用于存储数据,Client提供操作目录信息树的工具,LDIF格式
  • LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议

LDAP一些概念

目录树概念
  1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。有点类似URI,可以通过一个路径确定唯一一个对象。
  3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
  4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。
关键字缩写

关键字

英文全称

含义

Entry

-

条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。

Attribute

-

每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个,比如你有多个邮箱。

ObjectClass

-

对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。

Schema

-

对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定了条目、属性、值,他们之间的关系如下图所示。所以这些构成了模式(Schema)——对象类的集合。条目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。一般存放路径为/etc/openldap/schema,一个条目的属性必须存在于已定义的schema中

LDIF

LDAP Data Interchange Format

LDIF 是一种普遍使用的文件格式,用来描述目录信息或可对目录执行的修改操作。

dc

Domain Component

域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)

uid

User Id

用户ID songtao.xu(一条记录的ID)

ou

Organization Unit

组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)

cn

Common Name

公共名称,如“Thomas Johansson”(一条记录的名称)

sn

Surname

姓,如“许”

dn

Distinguished Name

“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)

rdn

Relative dn

相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

简单的例子

请先观察老高画的图,老高预先给出几个dn,看看你能不能总结出出什么规律! dn:dc=360,dc=Net dn:ou=Tech,dc=360,dc=Net dn:uid=phpgao,ou=Web,ou=Tech,dc=360,dc=net

代码语言:javascript复制
                  ------------- 
                 |             |
                 |    dc=Net   <---  顶 级 域 名
                 |             |
                  ------ ------ 
                        |
                        |
                  ------v------ 
                 |             <--------- 下 一 级 域 名
                 |    dc=360    ----------- 
                 |             |           |
                  ----- -------            |
                       |                   |
                       |                   |
                  -----v------        -----v------ 
                 |            |      |            |
       ----------    ou=Tech  |      | ou=Finance <-----  组 织
      |          |            |      |            |
      |           ------ -----        ----- ------ 
      |                 |                  |
      |                 |                  |
 -----v-----      ------v-----        -----v------ 
|           |    |            |      |            |
|   ou=Web  |    |    ou=App  |      |  uid=cfo   <-----  对 象
|           |    |            |      |            |
 ----- -----      ------ -----        ------------ 
      |                 |
      |                 |
 -----v-----      ------v----- 
|           |    |            |
| uid=phpgao|    |   uid=dev  |
|           |    |            |
 -----------      ------------ 

首先,dn的写法是从下向上,用逗号间隔; 其次,dn是唯一的,否则就没法确定一条entry了; 最后,rdn就是dn最左边的entry。

查看配置文件
schema文件

/etc/openldap/schema/nis.schema文件为例,我们可以发现,objectclass posixAccount 有以下定义:

代码语言:javascript复制
# Object Class Definitions

objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
    DESC 'Abstraction of an account with POSIX attributes'
    SUP top AUXILIARY
    MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
    MAY ( userPassword $ loginShell $ gecos $ description ) )

我们关注的是MUST中和MAY中的字段,以uidNumber和userPassword()为例,我们可以在文件的Attribute Type Definitions节中发现以下定义:

代码语言:javascript复制
# builtin
#attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
#    DESC 'An integer uniquely identifying a user in an administrative domain'
#    EQUALITY integerMatch
#    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )


attributetype ( 2.5.4.35 NAME 'userPassword'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )

安装LDAP(Centos7)

废话不多说,我们先安装好openldap,等下一篇老高来讲讲配置的方法。

安装LDAP服务端

代码语言:javascript复制
yum install openldap-servers

# 启动服务

systemctl start slapd
systemctl status slapd

# 查看版本
slapd -V

> OpenLDAP: slapd 2.4.44

安装LDAP客户端工具

首先,配置好一个新的LDAP服务器后,老高建议优先使用一个GUI工具配置,在此老高推荐使用Apache Directory Studio,支持多平台配置。

当然,你也可以用命令行管理

代码语言:javascript复制
yum install openldap-clients

# 查看工具
ls -al /usr/bin/ |grep  ldap

ldapadd
ldapcompare
ldapdelete
ldapexop
ldapmodify
ldapmodrdn
ldappasswd
ldapsearch
ldapurl
ldapwhoami

管理工具

phpLDAPadmin Self Service Password JXplorer

Refer:

  • http://www.openldap.org/doc/admin24/
  • https://ldapwiki.com/wiki/Main
  • http://www.zytrax.com/books/ldap/apd/index.html
  • http://www.zytrax.com/books/ldap/ch3/
  • http://www.zytrax.com/books/ldap/ch2/
  • https://www.cnblogs.com/wilburxu/p/9174353.html
  • https://www.adimian.com/blog/2014/10/how-to-enable-memberof-using-openldap/
  • http://seanlook.com/2015/01/15/openldap_introduction/
  • https://www.itzgeek.com/how-tos/linux/centos-how-tos/step-step-openldap-server-configuration-centos-7-rhel-7.html
  • https://linuxhostsupport.com/blog/how-to-install-ldap-on-centos-7/
  • https://www.ibm.com/developerworks/cn/linux/l-openldap/index.html
  • https://www.digitalocean.com/community/tutorials/how-to-change-account-passwords-on-an-openldap-server
  • https://segmentfault.com/a/1190000014683418

0 人点赞