我这篇文章是自己在学习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:qq@qq.com
输入完之后按 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
它们的文档在打开上面的网址可以看到。我这里就不详细说了。