LDAP协议简介以及OpenLDAP服务搭建

我这篇文章是自己在学习LDAP的时候,为了记录下来,将自己收集的资料集合成一篇文章而成的

仅供参考,并非原创。

参考过的文章有

点击打开链接

点击打开链接

点击打开链接

点击打开链接

一:LDAP协议简介

LDAP,全称为轻量级目录访问协议,是一项开放协议,用于通过分层目录结构对数据进行存储与检索。LDAP是一种灵活得解决方案,适用于定义各类条目及相关性质。OpenLDAP项目是实现了LDAP协议的开源软件。

基本LDAP数据组件

属性(Attribute)

LDAP系统中的数据主要以被称为属性得元素形式存储。属性在本质上属于健-值对。与其它系统不同,其中的健名称由为条目选定得objectClass进行预定义。另外,属性中的数据必须匹配属性初始定义内所定义得类型。属性不是随便定义的,需要符合一定规则,而这个规则可以通过schema制定。

条目(Entry)

单凭属性本身没有多少作用,我们必须将其与其它事物进行关联。在LDAP中,我们在条目内使用属性。条目基本上相当于属性与一条用于描述事物得名称得集合。条目也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。一个Entry就是一条记录,是LDAP中一个基本的存储单元。也可以看作是一个DN和一组属性的集合。

dn:每一个条目都有一个唯一的标识名

rdn:一般指dn逗号最左边的部分

Base DN:LDAP目录树的最顶部

DIT

DIT代表的是与文件系统类似得一种组织化结构,其中每个条目有且只有一个父条目,其下则可能有任意数量子条目。

定义LDAP数据组件

属性Attribute定义

属性定义必须注明属性名称、任何其它能够用于引用该属性得名称、可以输入的数据类型以及其它各类元数据。该元数级能够描述此属性,告知LDAP如何对属性值进行排序或比对,同时告知其如何将其与其它属性相关联。

幸运的是,大多数情况下我们无需自行定义属性,因为大部分LDAP实现方案中已经提供各类最为常用得属性,其它方案也能够导入现成属性。

ObjectClass定义

各个属性被收集在objectClass条目中。ObjectClass属于相关属性得简单分组,可用于描述特定事物。

对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。通过对象类可以方便的定义条目类型。每个条目可以直接继承多个对象类。对象类有三种类型:结构类型,抽象类型和辅助类型。结构类型是最基本的类型,它规定了对象实体的基本属性,每个条目属于且仅属于一个结构型对象类。抽象类型可以是结构类型或其它抽象类型父类,它将对象属性中共性的部分组织在一起,称为其它类的模板,条目不能直接集成抽象型对象类。辅助类型规定对象实体的扩展属性。每个条目至少有一个结构性对象类。

Schema

objectClass定义与属性定义两者由一套架构组合在一起,这个就是schema。就是对象类,属性分别约定了条目、属性、值,所有的这些构成了模式——对象类的集合。


LDAP协议的衍生版本

ldap:// 基本LDAP协议,允许对目录服务进行结构化访问

ldaps:// 此衍生版本用于通过SSL/TLS实现LDAP表达。

ldapi://用于通过IPC表达LDAP,其通常用于安全接入本地LDAP系统以实现管理用途.

LDAP特点

LDAP的结构用树表示,而不是用表格。

LDAP可以很快地得到查询结果,不过在写方面,就慢得多

LDAP提供了静态数据得快速查询方式

Client/server模型:Server用于存储数据,Client提供操作目录信息树的工具

LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议

Backend & Database

ldap的后台进程slapd接收、响应请求,但实际存储数据、获取数据的操作是由Backends做的,而数据是存放在Database中的,所以你可以看到backend和database指令是一样的值如bdb。一个backend可以有多个database instance,但是每个database的suffix和rootdn不一样。

而bdb是一个高性能的支持事务和故障恢复的数据库后端,可以满足大部分需求。

TLS&SASL

分布式LDAP是以明文的格式通过网络来发送信息的,包括client访问ldap的密码,SSL/TLS的加密协议就是来保证数据传送的保密性和完整性。SASL是简单身份验证安全框架,它能够实现openldap客户端到服务器的用户验证,也就是ldapsearch,ldapmodify这些标准客户端工具默认尝试与LDAP服务器认证用户的方式。SASL有几大工业实现标准:Kerveros V5、DIGEST-MD5、EXTERNAL、PLAIN、LOGIN。

LDIF(LDAP数据交换格式)

LDIF是LDAP数据库信息的一种文本格式,用于数据的导入导出。

LDAP Search filter搜索

Filter一般由(attribute=value)这样的单元组成。

二.搭建LDAP服务器

这里我们使用的是OpenLDAP框架进行LDAP服务器的搭建。

搭建方式有源码安装docker搭建

apt-get install build-essential

1.在Ubuntu上搭建OpenLDAP服务器

  1.1 准备编译环境和依赖包

apt-get install build-essential

关于这个build-essential的作用,可以用apt-cache depends 'build-essential'来查看它的依赖


可以看到它相关了很多编译有关的软件包

apt-get install libssl-dev

而libssl-dev 包含了openssl的include文件和代码库

 1.2 安装openldap和berkeley

OpenLDAP默认使用BerkeleyDB数据库,因此需要先安装BerkeleryDB。

wget http://download.oracle.com/berkeley-db/db-5.1.29.NC.tar.gz #下载BerkeleyDB压缩包
wget  ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.46.tgz  #下载openldap源码
tar -zxf openldap* #解压openldap
tar -zxf db*       #解压berkeleyDB
    1.2.1安装BerkeleyDB
cd db*
../dist/configure --prefix=/usr/local/berkeleydb-5.1
make && make install
    1.2.2安装openldap

  1.2.2.1首先设置环境变量

export BERkELEYDB_HOME="/usr/local/berkeleydb-5.1"
export CPPFLAGS="-I$BERKELERYDB_HOME/include"
export LDFLAGS="-L$BERKELEYDB_HOME/lib"
export LD_LIBRARY_PATH="$BERKELEYDB_HOME/lib"
export LDAP_HOME="/usr/local/openldap-2.4"
export PATH="$PATH:$BERKELEYDB_HOME/bin:$LDAP_HOME/bin:$LDAP_HOME/sbin:$LDAP_HOME/libexec"

1.2.2.2 编译安装

cd openldap*
./configure -prefix=/usr/local/openldap-2.4
make depend
make 
make install

安装完成后就可以进行配置了

1.3 OpenLDAP的基本配置

1.3.1配置root密码
slappassed
1.3.2修改配置文件

文件在/etc/openldap下,有四个文件,主要的是slapd.conf and ldap.conf,其它两个是backup文件。对slapd.conf进行修改。

# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.8 2003/05/24 23:19:14 kurt Exp $
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
#为了有效使用目录服务,包含相关的文件。注意,在包含文件时是要按一定顺序的,因为
#文件里的属性存在依赖关系。如果顺序不对,服务器启动不了,文档间的依赖关系在文档
#中都有说明,请仔细查看一下。如果懒得看也可以按我的顺序。
include         /usr/local/openldap/etc/openldap/schema/core.schema
include         /usr/local/openldap/etc/openldap/schema/corba.schema
include         /usr/local/openldap/etc/openldap/schema/cosine.schema
include         /usr/local/openldap/etc/openldap/schema/inetorgperson.schema    
include         /usr/local/openldap/etc/openldap/schema/misc.schema             
include         /usr/local/openldap/etc/openldap/schema/openldap.schema
include         /usr/local/openldap/etc/openldap/schema/nis.schema
include         /usr/local/openldap/etc/openldap/schema/samba.schema
# Define global ACLs to disable default read access.
 
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral       ldap://root.openldap.org
 
pidfile         /usr/local/openldap/var/slapd.pid
argsfile        /usr/local/openldap/var/slapd.args
 
loglevel 1                       
#增加了日志功能,需修改syslog配置文件,在文件中增加一项:local4.* /var/log/ldap.log日志级别定义可查相官方网站的文档。
#1级记录的信息很多,可用于调试。
# Load dynamic backend modules:
# modulepath    /usr/local/openldap/libexec/openldap
# moduleload    back_bdb.la
# moduleload    back_ldap.la
# moduleload    back_ldbm.la
# moduleload    back_passwd.la
# moduleload    back_shell.la
 
# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
 
# Sample access control policy:
#       Root DSE: allow anyone to read it
#       Subschema (sub)entry DSE: allow anyone to read it
#       Other DSEs:
#               Allow self write access
#               Allow authenticated users read access
#               Allow anonymous users to authenticate
#       Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
#       by self write
#       by users read
#       by anonymous auth
#
# if no access controls are present, the default policy is:
#       Allow read by all
#
# rootdn can always write!
 
#######################################################################
# ldbm database definitions
#######################################################################
 
database        bdb
suffix          "dc=it,dc=com"
#改成你自已的目录后缀,
rootdn          "cn=root,dc=example,dc=org"
#设置root为管理员,与linux的root没有什么关系。
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw          {MD5}mjkiuPt0wXhpxxkdiOOO+0000000AKq0by
#设置root密码,用MD5加密。密码串用slappasswd -h {MD5}指令生成
# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory       /usr/local/openldap/var/openldap-data    
# Indices to maintain
index   objectClass     eq
#这里可根据你的需要设置相关索引,以加快查询速度。具体内容可查询官方网站管理手册。
 

配置完之后,服务器就基本配置完成了。用下面命令进行启动

slapd

没有出错信息证明服务正常启动

slapd -d 1

如果有问题,可以用上面的形式去看具体报错信息。

可以用以下命令验证服务是否正常运行

ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
1.3.3 信息的录入

手动录入方法

第一步要建立DN:

ldapadd -x -D 'cn=root,dc=example,dc=org' -W
dn:dc=example,dc=org
objectClass:dcObject
objectClass:organization
dc:example
o:Corporation

第二步建立RDN

ldapadd -x -D 'cn=root,dc=example,dc=org' -W
dn: uid=qq,dc=it,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: qq
cn: qq
sn: qq
telephoneNumber: 138888888
description: openldap test
telexNumber: tex-8888888
street: my street
postOfficeBox: postofficebox
displayName: qqdisplay
homePhone: home1111111
mobile: mobile99999
mail:[email protected]

输入完之后按 Ctrl+d 结果存盘。

文件方式

ldapadd -x -D 'cn=root,dc=example,dc=org' -W -f test.ldif

2.用docker部署LDAP服务器

这种方式比源码安装简单多了,只要安装了docker,就可以简单搭建OpenLDAP服务器。

docker实现openldap的image有

dinkel/docker-openldap  

osixia/docker-openldap

它们的文档在打开上面的网址可以看到。我这里就不详细说了。


猜你喜欢

转载自blog.csdn.net/ximingren/article/details/80147353