Windows搭建OpenLDAP

前言

目的之初始于学Security的SSO的时候想要自己搭建一个LDAP服务,原本以为一两天就能搞定的东西,我还是低估了LDAP这片大领域,到目前为止走了不少弯路,百度谷歌了不少资源,其中大多数是Linux下的搭建,而且无一例外,大部分都是拷贝粘贴的成品,虽然我这篇也基本集精华于百度谷歌,不过也想和大家分享分享我的学习成果,主要讲讲我走过的一些弯路。

安装OpenLDAP

首先OpenLDAP我下载的是:2.4.42版本

安装过程比较简单一直next就可以了,不过别无脑next,密码之类的数据库之类的至少要自己修改一下。数据库我选择的是BDB(Berkeley DB,在这个东东花不少时间),它有如下几个特点:
- 高并发
- 内存小
- 查询快(NoSQL,针对查询进行优化的数据库)
- 嵌入式
- 云存储(key-value对存储)
- 单机小霸王(没错!它似乎不支持远程!)
嗯对!没错!它是嵌入式数据库,也就是说它是嵌入了OpenLDAP这个软件的,我们没必要去搭这个数据库,然后我确确实实在证实这一点上花了不少时间,以至于我的电脑现在就有BDB这个数据库,而且对它还小有了解。。。
安装完之后默认是开启服务的,你应该在服务中停止它,并设定为手动开启,这主要是方便我们后面调试。

配置OpenLDAP

安装完之后我们进入OpenLDAP的安装目录,在该目录下我们需要关注几个文件:
- slapd.conf
- maxcrc.ldif
配置文件是slapd.conf,这个文件主要配置如下:

database    bdb #配置数据库,我们下载的时候选择的是BDB
suffix      "dc=maxcrc,dc=com"      #配置后缀,也就是你的树根,我们可以类比关系型数据库的数据库名
rootdn      "cn=Manager,dc=maxcrc,dc=com"   #登陆的用户名
rootpw  {MD5}9huttJT7BbQS1yE4HL/vqw==       #配置密码,看这样子是base64加密

上面的配置中第一个应该是不能改的,因为在安装过程中让我们选择数据库就意味着它只下载你选定的数据库(大概)。
第二项根据的你喜好设定,可以不用dc,之所以用dc是取名domain name,在这之前,往往是取c(country),不过现在很多公司用域名来代表自己而不用地域和公司名,因此基本都用dc。
第三项同样根据你的喜好设定,不过一般不会改动,大概是一种大家心照不宣的规则——OpenLDAP管理员用cn=Manager,而其他的比如AD、ADS(都是LDAP协议的实现)则用其他的。
第四项配置登陆密码,你可以设定成明文,也可以在命令行通过slappasswd的命令来加密,然后加密后的密码粘贴过来,登陆的时候同样通过明文登陆,它自己会解密匹配的。
最后,建议假如你刚开始接触这方面的内容,最好不要过多改动它的配置文件,不过如果你经得起折磨,一定要按自己心思来改动它的配置文件,因为你会获得很多知识,走弯路能获得意想不到的成果。

现在假如配置完了,你可以尝试启动它。在安装目录通过slapd -d 1启动它。如果你能看到58eca2bc slapd starting说明你的配置是没问题的,那么开始下一步,导入数据。

导入LDIF数据

在导入数据这块我花了不少时间,花了大量时间去学习LDIF的语法以及一些相关的知识。如果你遇到了一些问题,比如无法导入,导入失败的话,我能猜测你的LDIF文件多半是拷贝网上的,并且不加思考地拿来用,而这应该是很多初学者导致问题的原因,因此你在导入之前必须熟悉LDIF。

LDAD是什么?LDIF 完全独立于在所有特定目录中使用的储存格式,LDIF 通常用于从 LDAP 服务器导出目录信息或将数据导入 LDAP 服务器。他一般是如下格式:

dn:dc=maxcrc,dc=com
objcetclass:top

dn:ou=People,dc=maxcrc,dc=com
objectclass:top
objectclass:organizationalUnit
ou:People

dn: cn=hua,ou=People,dc=maxcrc,dc=com
objectclass: inetOrgPerson
cn:hau
sn:huamei
userPassword:hauhua
telephoneNumber:244245963255

我们知道,LDAP是通过树型结构组织数据的(如果你不知道我觉得你最好先熟悉一下LDAP的概念在尝试搭建LDAP服务),并且也正是得益于它这种组织的方式,因此它读取数据相当快,相对的新增数据就显得比较慢。而这种组织方式就在LDIF文件中体现出来了。
首先先熟悉“LDAP数据库”的相关概念。LDAP-》条目-》属性:值,这就是“LDAP数据库”的相关概念的最完整的描述((⊙﹏⊙)b)。上面LDIF文件总共有三个条目,每个条目之间通过换行符分隔(记住,最后一个条目后面也有一个换行符,不然文件出错),条目的概念我们可以类比关系型数据库的记录;每个条目通过dn(distinguished name)进行区分,dn是唯一的,相当于关系型数据库的主键(但是不要完全用关系型数据库的概念来取而代之,它们毕竟是两种东西);dn的objectclass是对象类型,这是大部分我们CtrlC&CtrlV出错的根源,objectclass有三种类型:结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)。结构类型是最基本的类型,它规定了对象实体的基本属性,每个条目属于且仅属于一个结构型对象类。抽象类型可以是结构类型或其他抽象类型父类,它将对象属性中共性的部分组织在一起,称为其他类的模板,条目不能直接集成抽象型对象类。辅助类型规定了对象实体的扩展属性。每个条目至少有一个结构性对象类。对于这些类型的定义被写进schema文件里,它们被存放在安装目录下的schema目录内,这些schema通过slap.conf导入,像下面这样导入:

include     ./schema/core.schema
include     ./schema/cosine.schema
include     ./schema/nis.schema
include     ./schema/inetorgperson.schema

我们在看一些教程的时候它们会反复强调这些文件的导入是有次序要求的,但又没说明为什么,可能它们觉得很简单不需要告知,然而我在这些导入次序上也花了不少时间。实际上,这种次序要求主要原因是类的继承上,在导入某个schema文件时,有时候它的类需要依赖其他的类,而这些其他类的导入次序在这个类的之后的话它就报错。所以当我们想要知道它的次序要求的时候简单的浏览一下它内部定义的类是不是存在依赖关系,一般的,core.schema定义了最基本的类,它永远排在第一位。objectclass的定义大致如下(下面我抽取了inetOrgPerson的继承关系):

# inetOrgPerson
# in inetorgperson.schema
    objectclass ( 2.16.840.1.113730.3.2.2
    NAME 'inetOrgPerson'
    DESC 'RFC2798: Internet Organizational Person'
    SUP organizationalPerson
    STRUCTURAL
    MAY (
        audio $ businessCategory $ carLicense $ departmentNumber $
        displayName $ employeeNumber $ employeeType $ givenName $
        homePhone $ homePostalAddress $ initials $ jpegPhoto $
        labeledURI $ mail $ manager $ mobile $ o $ pager $
        photo $ roomNumber $ secretary $ uid $ userCertificate $
        x500uniqueIdentifier $ preferredLanguage $
        userSMIMECertificate $ userPKCS12 )
    )

#in core.schema
    objectclass ( 2.5.6.7 NAME 'organizationalPerson'
    DESC 'RFC2256: an organizational person'
    SUP person STRUCTURAL
    MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $
        preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
        telephoneNumber $ internationaliSDNNumber $ 
        facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
        postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )

#in core.schema 
    objectclass ( 2.5.6.6 NAME 'person'
    DESC 'RFC2256: a person'
    SUP top STRUCTURAL
    MUST ( sn $ cn )
    MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

通过这样我们既可以看出他们的继承关系,假如我们把core.schema放在inetOrgPerson.schema后面可能就会出大问题了。在这个objectclass的定义中,我们看到person这个类的定义。首先是2.5.6.6这个类似点分四组序列的东东,说实话我不是很懂这是什么东西,大概是类似标志位的东西,听说通过什么什么组织,获得一个这种什么什么码是要钱的,而且超贵,不过这个不是我们关心的事情,我们(至少我是这样)把它简单理解成标志位就好了;Name命名该类,我们给对象赋值objectclass就是通过这个name来赋值的;DESC就是描述;MUST是该类必须含有的属性,也就是如果你定义的你的对象为该类的对象,那么它就必须包含这两个属性,其中sn(surname)是姓氏,cn(common name)是常用名称,一般就是名字吧。最后的MAY是可选参数,也就是说你定义的对象是不能随便指定参数的,你的参数必须是这个类的可选参数。另外,如果你要给这个类添加参数也不是直接在这里添加一个字段就可以的,你还必须在该schema文件内声明这个参数的属性。例如:

attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' )
    DESC 'RFC2256: last (family) name(s) for which the entity is known by'
    SUP name )

最后是属性:值,属性相当于关系型数据库中的字段(field),它就像上面那样被定义在schema文件内,值可以是任何类型的值,实际上在属性的定义上也没规定数据类型这种东西,而且说到底ldap的数据类型也跟关系型数据的数据类型完全不一样,所以不能停留在关系型数据库的思维里面。还有一点是,属性可以不是唯一的,比如我们可以定义两个不同的userPassword在一个条目里面,这是不冲突的。其实除此之外,LDIF还有一个标志是changetype,它是对“目录数据库”进行增删改操作的,不过我用服务端命令的时候出错了,它不认这个属性,不过我也没去深究,因为后面我都会用JNDI操作数据库,而不会用它的这些工具。一般按照规则编辑好LDIF文件之后,直接通过slapadd -l filename.ldif就能进行导入了,检索或者其他操作可以通过clientTools内的工具进行操作,具体自己help看看就知道命令怎么用了。最后推荐两个工具。
- ldapBrowser
- Apache Directory Studio
上面那个是用于连接ldap并进行查询的工具。下面那个用途比较广,具体看它的官方文档,讲得也是比较清楚,下面那个也有eclipse的插件版本,直接可以在eclipse的插件库下载。

另外,强推这个 家伙的博文,写得很好!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值