介绍
LDAP 是一个用于管理和与目录服务交互的协议,OpenLDAP 项目提供一个符合 LDAP 的目录服务,可用于存储和为目录数据提供接口。
在本指南中,我们将讨论用于与 LDAP 目录通信的 LDIF 文件格式. 我们将讨论您可以使用的工具来处理这些文件,并根据指定的命令修改 LDAP 目录信息树。
前提条件
在启动本指南之前,您应该可以访问 OpenLDAP 服务器. 您可以学习如何设置 OpenLDAP 服务器(https://andsky.com/tech/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-an-ubuntu-14-04-server). 您应该熟悉使用 LDAP 目录服务时使用的基本术语。
LDIF格式
LDIF 或 LDAP 数据交换格式是用于代表 LDAP 数据和命令的文本格式. 当您使用 LDAP 系统时,您可能会使用 LDIF 格式来指定您的数据以及您想要对 LDAP DIT 进行的更改。
LDIF 旨在描述 LDAP 系统中的任何条目,以及必须发生的任何修改,因此,语法非常精确,最初可能看起来有点复杂。使用 LDIF,LDAP 更改在文件中简单地写入任意名称,然后使用可用的管理命令输入 LDAP 系统。
LDIF 使用一个基本的关键值系统,每行有一个陈述。 该键位于一行左侧,随后是列(:)和一个空间。 空间对于正确读取该行很重要。 然后在右侧分配该值。
可以使用多个行来为属性提供长值,通过以单个空间开始额外的行。
添加入口到此
有两种主要的方法来指定一个新的条目在一个 LDIF 文件中. 最适合您的需求的方法取决于您需要协调的其他类型的更改. 您选择的方法将决定您必须使用的工具和论点来应用更改到 LDAP DIT (目录信息树)。
列出要添加到 DIT 的条目
最基本的定义新条目添加到 LDAP 的方法是简单地列出所有条目,就像他们通常会使用 LDAP 工具显示的那样。
1dn: ou=newgroup,dc=example,dc=com
在上面的行中,我们引用了几个关键值对,以构建我们新输入的DN。当使用 setting 属性值时,您必须使用 kolon 和空间。
在最简单的LDIF格式中,用于添加条目到DIT中,其余条目仅仅是用DN定义下的这个格式来写出。
1dn: ou=People,dc=example,dc=com
2objectClass: organizationalUnit
3ou: People
您可以在单个文件中添加多个条目,每个条目必须分隔至少一个完全空的行:
1dn: ou=People,dc=example,dc=com
2objectClass: organizationalUnit
3ou: People
4
5dn: ou=othergroup,dc=example,dc=com
6objectClass: organizationalUnit
7ou: othergroup
正如你所看到的,这个LDIF格式几乎完全反映了你在查询LDAP树中包含此信息的条目时所看到的格式。
使用Changetype: Add
创建新条目
OpenLDAP提供了工具,可以处理添加和修改,所以如果我们正在修改相同文件中的其他条目,我们可以标记我们的新条目为添加,以便它们得到正确的处理。
这看起来很像上面的方法,但我们直接在DN规格下方添加changetype: add
。
1dn: uid=jsmith1,ou=People,dc=example,dc=com
2changetype: add
3objectClass: inetOrgPerson
4description: John Smith from Accounting. John is the project
5 manager of the building project, so contact him with any que
6 stions.
7cn: John Smith
8sn: Smith
9uid: jsmith1
这基本上是我们迄今为止用来描述条目的格式,除了DN规格之后的一个额外行之外。在这里,我们告诉LDAP我们正在进行的更改是创建条目。由于我们正在使用changetype
选项,这个条目可以由ldapmodify
工具无问题处理,允许我们在同一LDIF文件中放置其他类型的更改。
上面的另一个要注意的事情是使用一个多行值的描述
属性. 由于随后的行以一个空间开始,它们将被连接到被删除的空间。
与上一节一样,同一文件中的每一个额外条目都是用空行分开的。 评论可以用字符#
开头来使用。 评论必须存在于自己的条目上。
1# Add John Smith to the organization
2dn: uid=jsmith1,ou=People,dc=example,dc=com
3changetype: add
4objectClass: inetOrgPerson
5description: John Smith from Accounting. John is the project
6 manager of the building project, so contact him with any qu
7 estions.
8cn: John Smith
9sn: Smith
10uid: jsmith1
11
12# Add Sally Brown to the organization
13dn: uid=sbrown20,ou=People,dc=example,dc=com
14changetype: add
15objectClass: inetOrgPerson
16description: Sally Brown from engineering. Sally is responsibl
17 e for designing the blue prints and testing the structural int
18 egrity of the design.
19cn: Sally Brown
20sn: Brown
21uid: sbrown20
加工入口添加
现在我们知道如何构建 LDIF 文件以添加新的条目,我们需要实际上使用 LDAP 工具来处理这些条目,以便将其添加到 DIT。
如果你正在使用简单的输入格式(没有changetype
设置),你可以使用ldapadd
命令或ldapmodify
命令与-a
旗帜,指定一个输入添加。
例如,如果我们从简单的输入部分存储到名为newgroups.ldif
的文件中,我们需要处理该文件并添加新的条目的命令会看起来像这样:
1ldapadd -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif
您也可以使用ldapmodify -a
组合来获得相同的结果:
1ldapmodify -a -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif
如果您正在使用 second 格式,使用changetype
声明,您将希望使用ldapmodify
命令而无需-a
旗帜. 由于此命令和格式适用于大多数其他修改,因此对于大多数更改可能更容易使用。
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newusers.ldif
您可以轻松地将许多条目存储在一个LDIF文件中,并将您的DIT填充到一个命令中。
删除从 DIT 的入口
我们在最后一节看到了‘changetype’选项的第一眼,该选项提供了指定我们想要做的高级别修改类型的方法,对于输入删除,此选项的值是删除
。
输入删除实际上是您可以做的最直接的更改,因为唯一需要的信息是DN。
例如,如果我们想从我们的 DIT 中删除 ou=othergroup
条目,我们的 LDIF 文件只需要包含以下内容:
1dn: ou=othergroup,dc=example,dc=com
2changetype: delete
要处理更改,您可以使用上面用ldapmodify
的确切格式,如果我们将删除请求的文件称为rmothergroup.ldif
,我们会这样应用:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f rmothergroup.ldif
这将立即从系统中删除ou=othergroup
条目。
更改入口的属性
修改输入的属性是一个非常常见的变化,通过在输入的DN之后指定changetype: modify
来实现。 您可以对属性进行的修改类型大多反映了您可以对输入本身进行的修改。
添加一个属性到一个入口
例如,您可以使用在changetype: modify
之后的add:
命令添加属性,这应该指定您想要添加的属性,然后将属性的值设置为正常,因此基本格式将是:
1dn: entry_to_add_attribute
2changetype: modify
3add: attribute_type
4attribute_type: value_to_set
例如,要将一些电子邮件地址添加到我们的帐户中,我们可能会有一个看起来像这样的 LDIF 文件:
1dn: uid=sbrown20,ou=People,dc=example,dc=com
2changetype: modify
3add: mail
4mail: [email protected]
5
6dn: uid=jsmith1,ou=People,dc=example,dc=com
7changetype: modify
8add: mail
9mail: [email protected]
10mail: [email protected]
正如您从第二个输入中可以看到的,您可以同时指定多个添加项. 该邮件
属性允许多个值,因此这是允许的。
您可以将此处理为ldapmodify
作为正常情况,如果更改是在sbrownaddmail.ldif
文件中,您可以输入:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownaddmail.ldif
在输入中替换属性值
另一个常见的更改是修改一个属性的现有值,我们可以使用更改类型:更改
下的替换:
选项来完成。
它几乎与添加:
命令相同,但默认情况下,它会从输入中删除所有现有的属性,并用后来定义的值取而代之。
1dn: uid=sbrown20,ou=People,dc=example,dc=com
2changetype: modify
3replace: mail
4mail: [email protected]
请记住,这将取代输入中的邮件
的每一个实例。这对于每个输入可以定义一次以上的多值属性很重要(例如邮件
)。如果您只想取代一个属性的单个发生,则应使用属性删除:
选项(如下所述)与属性添加:
选项(如上所述)相结合。
如果这个更改被存储在名为sbrownchangemail.ldif
的文件中,我们可以通过键入代替Sally的电子邮件:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownchangemail.ldif
从入口中删除属性
如果您想从条目中删除属性,您可以使用删除:
命令。您将指定您想要删除的属性作为选项的值。 如果您想要删除属性的特定实例,您可以在下列行中指定特定关键值属性发生。
例如,这将删除约翰·史密斯的条目中的每个描述属性:
1dn: uid=jsmith1,ou=People,dc=example,dc=com
2changetype: modify
3delete: description
但是,这只会删除指定的电子邮件:
1dn: uid=jsmith1,ou=People,dc=example,dc=com
2changetype: modify
3delete: mail
4mail: [email protected]
由于我们早些时候给了John两个电子邮件地址,所以这个请求不应该改变另一个电子邮件地址。
如果这些更改是在名为jsmithrmdesc.ldif
和jsmithrmextramail.ldif
的文件中,我们可以通过键入应用它们:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif
2ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmextramail.ldif
指定多个属性变更
对于一个 LDIF 文件中的单个条目,您可以通过将它们分开以只包含 -
字符的行来指定多个属性变更。
例如,我们可以删除约翰剩余的电子邮件属性,将他的名字更改为约翰尼·史密斯
,并通过创建一个包含以下内容的文件来添加他的位置:
1dn: uid=jsmith1,ou=People,dc=example,dc=com
2changetype: modify
3delete: mail
4-
5replace: cn
6cn: Johnny Smith
7-
8add: l
9l: New York
要在一个命令中应用所有这些更改,我们会使用我们一直在使用的相同的ldapmodify
格式:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f multichange.ldif
重命名和移动入口
「changetype: modrdn」选项允许重命名或移动现有条目. 指定您要瞄准的 dn:
后,设置「changetype: modrdn」选项。
重命名入口
假设我们在最初输入系统时误写了Sally的用户名,因为它被用在输入的DN中,所以它不能简单地被changetype: modify
和replace:
选项取代,因为输入的RDN将是无效的。
1dn: uid=sbrown20,ou=People,dc=example,dc=com
2changetype: modrdn
3newrdn: uid=sbrown200
4deleteoldrdn: 0
我们可以用这个命令应用这个更改:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fixsallydn.ldif
这将使完整的入口看起来像这样的东西:
1dn: uid=sbrown200,ou=People,dc=example,dc=com
2objectClass: inetOrgPerson
3description: Sally Brown from engineering. Sally is responsibl
4 e for designing the blue prints and testing the structural int
5 egrity of the design.
6cn: Sally Brown
7sn: Brown
8uid: sbrown20
9uid: sbrown200
10mail: [email protected]
正如您所看到的,我们的 DN 已被调整为使用新属性/值对,该属性已被添加到输入中以使此成为可能。
在上面的例子中,您可能已经注意到两件事:第一,我们将名为deleteoldrdn
的选项设置为0
。第二,结果的输入有uid: sbrown20
和uid: sbrown200
。
设置deleteoldrdn
为0
会导致LDAP将在DN中使用的旧属性与新属性一起。
让我们假装我们再次犯了一个错误,而莎莉的实际用户名是sbrown2
。我们可以将deleteoldrdn
设置为1
,以删除当前在DN中使用的sbrown200
实例,从改名后的输入中。
1dn: uid=sbrown200,ou=People,dc=example,dc=com
2changetype: modrdn
3newrdn: uid=sbrown2
4deleteoldrdn: 1
5
6dn: uid=sbrown2,ou=People,dc=example,dc=com
7changetype: modify
8delete: uid
9uid: sbrown20
将文件应用如下:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fix2sallydn.ldif
此组合不会随着更改添加新的用户名(‘sbrown200’将被删除),而第二次输入修改将删除用户名的原始值(‘sbrown20’)。
移动一个入口
如果您需要将条目移动到一个新的位置,则对「changetype: modrdn」的额外设置是「newsuperior:」选项. 使用此选项时,您可以指定DIT上的一个新的位置,以便将条目移动到。
例如,如果我们想将Sally移动到ou=superusers
的条目下,我们可以添加这个条目,然后通过键入移动到它:
1dn: ou=superusers,dc=example,dc=com
2changetype: add
3objectClass: organizationalUnit
4ou: superusers
5
6dn: uid=sbrown2,ou=People,dc=example,dc=com
7changetype: modrdn
8newrdn: uid=sbrown2
9deleteoldrdn: 0
10newsuperior: ou=superusers,dc=example,dc=com
假设这是存储在一个名为mksuperuser.ldif
的文件中,我们可以应用这样的更改:
1ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f mksuperuser.ldif
这意味着一个动作,而不是一份副本。
在这种情况下,我们不希望真正改变输入的RDN,所以我们将newrdn:
值设置为当前的值。
一边:将二进制数据添加到输入中
本节与上面的信息分开,因为它可能适合创建条目或定义额外属性的条目。
LDAP 具有存储某些属性的二进制数据的能力.例如,inetOrgPerson
类允许一个名为jpegPhoto
的属性,可以用来存储一个人的照片或用户图标。
若要将此类数据添加到 LDAP 输入中,必须使用特殊格式。 指定属性时,立即跟随 kolon,使用少于字符(<)和空格。
例如,如果您在/tmp
目录中有名为john.jpg
的文件,则可以将该文件添加到John的记录中,使用一个看起来像这样的LDIF文件:
1dn: uid=jsmith1,ou=People,dc=example,dc=com
2changetype: modify
3add: jpegPhoto
4jpegPhoto:< file:///tmp/john.jpg
密切关注 colon 的位置,小于字符,和空间. 如果你的文件位于磁盘上,可以使用file://
前缀. 路径将添加一个额外的削减,以表示根目录,如果你使用绝对路径。
这将以相同的方式工作与音频文件:
1dn: uid=jsmith1,ou=People,dc=example,dc=com
2changetype: modify
3add: audio
4audio:< file:///tmp/hellojohn.mp3
一旦您已处理 LDIF 文件,实际文件将在您的 LDAP 目录服务中加密,这很重要,因为添加大量这样的文件会影响您的服务的大小和性能。
当你需要使用ldapsearch
工具获取加密数据时,你需要添加t
旗,这将允许文件被写入/tmp
目录。
例如,我们可以使用这个命令将二进制数据写入临时文件:
1ldapsearch -LLL -x -H ldap:// -t -b "dc=example,dc=com" "uid=jsmith1"
搜索结果将是这样的:
1[label ldapsearch output]
2dn: uid=jsmith1,ou=People,dc=example,dc=com
3objectClass: inetOrgPerson
4sn: Smith
5uid: jsmith1
6cn: Johnny Smith
7l: New York
8audio:< file:///tmp/ldapsearch-audio-n5GRF6
如果我们去到 /tmp
目录,我们可以找到该文件. 它可以根据需要更名,并且应该在进入目录之前的确切状态。
在重复执行此操作时要小心,因为每次进行搜索时都会写出一个新文件. 您可以轻松地填充磁盘,而不会意识到如果您不注意。
结论
到目前为止,您应该对如何使用 LDIF 格式化文件和几个工具来操纵 LDAP 目录信息树中的条目有相当好的掌握。虽然某些 LDAP 客户端可能会使 LDIF 文件不必要用于日常操作,但 LDIF 文件可能是对 DIT 条目执行批量操作的最佳方法。