LDAP学习笔记 - LDIF

初始状态下,LDAP是一个空目录,即没有任何数据。可通过程序代码向目录数据库中添加数据,也可使用OpenLDAP客户端工具ldapadd命令来完成添加数据的操作,该命令可将一个LDIF文件中的条目添加到目录。因此,需要首先创建一个LDIF文件,然后再进行添加操作。

1.LDIF文本条目格式

LDIF用文本格式表示目录数据库的信息,以方便用户创建、阅读和修改。在LDIF文件中,一个条目的基本格式如下:
写道

# 注释
dn: 条目名
属性描述: 值
属性描述: 值
属性描述: 值
... ...

dn行类似于关系数据库中一条记录的关键字,不能与其他dn重复。一个LDIF文件中可以包含多个条目,每个条目之间用一个空行分隔。
例如,以下内容组成一个条目:
写道

dn: dc=dlw, dc=com
objectclass: top
objectclass: dcobject
objectclass: organization
dc: dlw
o: dlw,Inc.

在以上文本中,各行含义如下:

  • 第1行的dn定义该条目的标识。
  • 第2~4行定义该条目的objectcCass,可以定义多个属性,如上面代码中定义了3个objectClass。条目的属性根据objectClass的不同而不同,有的objectClass有必须设置的属性。在2~4行的3个objectClass中,top没有必须定义的属性,dcobject必须定义属性dc,用来表示一个域名的部分,而organization必须定义属性o,用来表示一个组织的名称。
  • 根据objectClass的要求,第5、6行分别定义属性dc和属性o的值

2.了解objectClass

LDAP中,一个条目必须包含一个objectClass属性,且需要赋予至少一个值。每一个值将用作一条LDAP条目进行数据存储的模板;模板中包含了一个条目必须被赋值的属性和可选的属性。
objectClass有着严格的等级之分,最顶层是top和alias。例如,organizationalPerson这个objectClass就隶属于person,而person又隶属于top。

objectClass可分为以下3类:

  • 结构型(Structural) :如person和organizationUnit;
  • 辅助型(Auxiliary) :如extensibeObject;
  • 抽象型(Abstract) :如top,抽象型的objectClass不能直接使用。

在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup

3.了解Attribute

属性(Attribute)类似于程序设计中的变量,可以被赋值。在OpenLDAP中声明了许多常用的Attribute(用户也可自己定义Attribute)。常见的Attribute含义如下:
● c:国家。
● cn:common name,指一个对象的名字。如果指人,需要使用其全名。
● dc:domain Component,常用来指一个域名的一部分。
● givenName:指一个人的名字,不能用来指姓。
● l:指一个地名,如一个城市或者其他地理区域的名字。
● mail:电子信箱地址。
● o:organizationName,指一个组织的名字。
● ou:organizationalUnitName,指一个组织单元的名字。
● sn:surname,指一个人的姓。
● telephoneNumber:电话号码,应该带有所在的国家的代码。
● uid:userid,通常指某个用户的登录名,与Linux系统中用户的uid不同。
提示:objectClass是一种特殊的Attribute,它包含其他用到的Attribute以及其自身。

对于不同的objectClass,通常具有一些必设属性值和一些可选属性值。例如,可使用person这个objectClass来表示系统中一个用户的条目,对于系统中用户通常需要有这样一些信息:姓名、电话、密码、描述等。如下图所示,对于person,通过cn和sn设置用户的名和姓,这是必须设置的,而其他属性则是可选的。


下面列出部分常用objectClass要求必设的属性。
● account:userid。
● organization:o。
● person:cn和sn。
● organizationalPerson:与person相同。
● organizationalRole:cn。
● organizationUnit:ou。
● posixGroup:cn、gidNumber。
● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。

4.创建LDIF文件

对以上内容有一定了解之后,就可以编写输入LDIF文件,编辑需要向目录数据库添加的条目了。
下面根据如下图所示的结构,创建LDIF文件dlw.com.ldif。



对上图进行分析,该目录结构分为3层,有4个结点。根据上图可创建LDIF文件如下:
提示:每个结点可用一个dn表示,对于每个结点,又可继续添加新的结点。如在根结点中可添加其他部门ou,在ou=managers结点也可继续添加其他管理人员的信息。

写道

dn:dc=dlw,dc=com
objectclass:top
objectclass:dcobject
objectclass:organization
dc:dlw
o:dlw,Inc.

dn:ou=managers, dc=dlw, dc=com
ou:managers
objectclass:organizationalUnit

dn:cn=dlw,ou=managers,dc=dlw,dc=com
cn:dlw
sn:dongliwei
objectclass:person

dn:cn=test,ou=managers,dc=dlw,dc=com
cn:test
sn:Test User
objectclass:person

以上文件中各行的含义如下:

  • 第1~6行创建根结点,这部分在前面也有介绍,就不再重复了。
  • 第7、11、16行为空行,用来分隔4个dn条目(4个结点)。
  • 第8~10行定义cn=managers结点的条目,该条目的objectClass为organizationalUnit,因此需要用ou属性定义组织名称。
  • 第12~15行定义cn=dlw结点的条目,该条目使用的objectClass为person,因此需设置cn和sn两个属性值。
  • 第17~20行与第12~15行的意义相同。
    在以上LDIF文件中,第1、8、12、17行以dn开头,这部分内容必须唯一,并且在向目录数据库添加这些数据时,也要确保这些数据不能与目录数据库中已有数据相同,否则,添加操作将中断。

5.从LDIF文件添加到目录数据库

新增

使用OpenLDAP客户端工具ldapadd命令,可将LDIF文件中的条目添加到目录数据库中,该命令的格式如下:
ldappadd 选项 LDIF文件

在ldappadd命令中常用的选项如下:
-x:进行简单认证。
-D:用来绑定服务器的dn。
-h:目录服务的地址。
-w:绑定dn的密码。
-f:使用LDIF文件进行条目添加的文件。

将前面编写的LDIF文件的条目数据添加到目录数据库中。
具体操作步骤如下:
(1)检查dlw.com.ldif文件中的内容,需要注意的是,每个冒号后面都需要空一格,而每行结束处不能留有空格字符。
(2)使用以下命令将dlw.com.ldif文件中的条目添加到目录中:

写道

# ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f dlw.com.ldif

执行以上命令,如果添加操作正常完成,将显示如下图所示的提示信息,表示添加了4个条目到目录数据库中。


提示:如果以上命令执行不成功,需要逐个字符检查dlw.com.ldif文件中的内容,特别注意空格的问题。

查询

添加到目录中的条目被保存在目录数据库,在Linux命令界面下,可使用OpenLDAP客户端工具ldapsearch命令来进行查询。该命令的格式如下:
ldapsearch 选项 过滤 属性值

常用的选项有以下几个:
● -x:进行简单认证。
● -D:用来绑定服务器的dn。
● -w:绑定dn的密码。
● -b:指定要查询的根节点。
● -H:制定要查询的服务器。

使用ldapsearch命令查询“dc=dlw, dc=com”下的所有条目,可使用以下命令:

# ldapsearch -x -b "dc=dlw,dc=com"  

执行结果如下图所示。

而如果使用以下命令,将查询显示sn中以字符wu开头的条目,将得到如下图所示的查询结果,只找到一个条目。

# ldapsearch -x -b "dc=dlw,dc=com" "sn=wu*"

修改条目

使用OpenLDAP客户端工具ldapmodify命令可对目录数据库中的条目进行修改。该命令的格式如下:
ldapmodify 选项

该命令的选项也很多,常用选项与ldapadd类似,这里就不再列出了。
提示:使用ldapmodify命令不能修改条目的dn,但可以修改其他属性值。

使用ldapmodify命令修改条目信息可以有两种方式:一种是交互式进行修改,另一种是通过文件进行修改。

1.交互式修改

修改前面创建的条目“cn=test, ou=managers, dc=dlw, dc=com”,将其sn属性修改为“Test User Modify”,并添加一个description属性,设置其值为“add Attribute”。
首先输入以下命令,进行修改状态:

# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret  

执行以上命令后,终端将等候用户输入需要修改条目的dn,输入以下内容:

dn: cn=test, ou=managers, dc=dlw, dc=com   
changetype: modify   
replace: sn   
sn: Test User Modify 

以上输入内容中,第1行查找需要修改的条目,第2行设置修改模式,第3行设置需要替换的属性sn,第4行给属性sn重新设置一个值,替换该属性原有的值。
输入完以上内容之后再按Enter键,程序将按以上设置更新数据,然后按Ctrl+C键退出修改命令。执行过程如下图所示。

使用以上命令修改条目的数据之后,可使用以下命令查看是否修改成功:

# ldapsearch -x -b "dc=dlw,dc=com" "cn=test"

执行以上命令查看test条目的数据如下图所示,可以看到sn属性被修改了。

2.通过文件修改

通过前面的方式对条目进行修改时,很不方便,如果在交互方式时输错了某个字符,只能中断命令后重新进行修改。因此,更好的修改方法是首先将修改时输入的文字保存到一个文件中,然后以该文件作为输入进行修改。用这种方式进行操作,首先需要创建一个临时文件,用来保存需要进行的修改操作,下面演示这种方式的修改过程。

【例子】 通过修改命令将前面LDAP数据库中的信息还原,即将sn属性由“Test User Modify”修改为“Test User”。
具体操作步骤如下:
(1)使用vi编辑器创建一个文件modify,在其中输入以下内容:

dn: cn=test,ou=managers,dc=dlw,dc=com   
changetype: modify   
replace: sn   
sn: Test User  

从以上输入内容可看到,与在交互式时输入的内容完全相同。
技巧:使用文件方式修改条目,可方便修改和检查,若某个地方有输入错误,可修改后再调用ldapmodify进行修改,减少输入量。

(2)使用以下命令调用modify的内容进行修改:

# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify  

执行结果如下图所示。

删除条目

对于目录数据库中不用的条目,也可使用ldapdelete命令将其删除。该命令的格式如下:
ldapdelete 选项 删除条目

该命令使用的选项与ldapadd类似,就不再列出来了。
删除目录数据库中的“cn=test,ou=managers,dc=dlw,dc=com”条目,具体命令如下:

# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret \   
> "cn=test,ou=managers,dc=dlw,dc=com"  

顺利执行以上命令后,终端上将不会有任何信息输出,表示完成了删除操作。
使用ldapdelete命令只能删除树形结构中的叶结点条目,如果删除非叶结点条目,将出现错误提示。例如,执行以下命令删除根结点“dc=dlw,dc=com”。

# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "dc=dlw,dc=com"

由于根结点下面还有结点,将显示如下图所示的错误提示信息:

数据导出

通过ldapadd命令可向目录数据库中添加数据,在某些情况下,可能还需要进行反向操作,即将目录数据库中的数据导出。
使用ldapsearch命令对目录数据库进行搜索,然后通过重定向将搜索结果保存到一个文件中,可达到导出数据的目的。另外,导出数据更常用的是slapcat命令,该命令的格式如下:
slapcat 选项

最常用的选项就是-l,表示导出为LDIF文件格式。
如将本章前面例子中创建的目录数据库导出为export.ldif文件,可使用以下命令:

slapcat -l export.ldif  

执行以上命令将在当前工作目录得到文件export.ldif,打开文件将显示如下图所示的内容:

提示:从导出结果可看出,除了使用ldapadd命令添加到目录数据库中的条目数据外,还导出了很多其他信息,包括条目录UUID、时间戳等信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265