如何使用LDIF文件更改OpenLDAP系统
介绍
LDAP 是一种用于管理目录服务并与之交互的协议。 OpenLDAP 项目提供了一个符合 LDAP 的目录服务,可用于存储和提供目录数据的接口。
在本指南中,我们将讨论用于与 LDAP 目录通信的 LDIF 文件格式。 我们将讨论可用于处理这些文件并根据指定的命令修改 LDAP 目录信息树的工具。
先决条件
在开始本指南之前,您应该有权访问 OpenLDAP 服务器。 您可以在此处 了解如何设置 OpenLDAP 服务器 。 您应该熟悉使用 LDAP 目录服务时使用的基本术语。 本指南可用于更熟悉这些主题。
LDIF 格式
LDIF 或 LDAP 数据交换格式是一种用于表示 LDAP 数据和命令的文本格式。 使用 LDAP 系统时,您可能会使用 LDIF 格式来指定您的数据以及您希望对 LDAP DIT 进行的更改。
LDIF 旨在能够描述 LDAP 系统中的任何条目,以及必须进行的任何修改。 因此,语法非常精确,最初看起来有些复杂。 使用 LDIF,LDAP 更改可以简单地写入具有任意名称的文件中,然后使用可用的管理命令之一输入 LDAP 系统。
LDIF 使用基本的键值系统工作,每行一个语句。 键位于一行的左侧,后跟一个冒号 (:) 和一个空格。 空格对于正确读取行很重要。 然后在右侧分配该值。 这种格式适用于 LDAP 的重属性语法,但也可用于发出命令并提供有关如何解释内容的说明。
通过以单个空格开始额外的行,可以使用多行来为属性提供长值。 LDAP 将在处理条目时加入这些。
向 DIT 添加条目
在 LDIF 文件中指定新条目有两种主要方法。 满足您需求的最佳方法取决于您需要协调的其他更改的类型。 您选择的方法将规定您必须使用哪些工具和参数将更改应用到 LDAP DIT(目录信息树)。
列出要添加到 DIT 的条目
定义要添加到 LDAP 的新条目的最基本方法是简单地完整列出条目,就像它们通常使用 LDAP 工具显示的一样。 这从将创建条目的 DN(可分辨名称)开始,在 dn:
指示符之后:
dn: ou=newgroup,dc=example,dc=com
在上一行中,我们引用了一些键值对来为我们的新条目构建 DN。 设置属性值时,必须使用冒号和空格。 当 引用 属性/值时,应使用等号代替。
在将条目添加到 DIT 的最简单的 LDIF 格式中,条目的其余部分只需在 DN 定义下使用此格式写出。 必须设置必要的 objectClass 声明和属性以构造有效条目。 例如,要创建一个组织单元来包含我们组织的员工的条目,我们可以使用:
dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People
您可以在单个文件中添加多个条目。 每个条目必须由至少一个完全空白的行分隔:
dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=othergroup,dc=example,dc=com objectClass: organizationalUnit ou: othergroup
如您所见,此 LDIF 格式几乎完全反映了您在查询 LDAP 树以查找包含此信息的条目时所看到的格式。 您几乎可以只写您希望条目包含的内容。
使用“Changetype: Add”创建新条目
如果您在同一个 LDIF 文件中进行其他修改,我们将研究的第二种格式效果很好。 OpenLDAP 提供了可以处理添加和修改的工具,因此如果我们正在修改同一文件中的其他条目,我们可以将新条目标记为添加,以便正确处理它们。
这看起来很像上面的方法,但是我们在 DN 规范下面直接添加了 changetype: add
。 例如,我们可以使用这样的 LDIF 将 John Smith 条目添加到已经包含 ou=People,dc=example,dc=com
结构的 DIT:
dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: add objectClass: inetOrgPerson description: John Smith from Accounting. John is the project manager of the building project, so contact him with any que stions. cn: John Smith sn: Smith uid: jsmith1
到目前为止,这基本上是我们用来描述条目的格式,除了 DN 规范之后的附加行。 在这里,我们告诉 LDAP 我们所做的更改是创建条目。 由于我们使用的是 changetype
选项,因此可以通过 ldapmodify
工具毫无问题地处理此条目,从而允许我们将其他类型的修改放在同一个 LDIF 文件中。 changetype
选项必须紧跟在 DN 规范之后。
上面要注意的另一件事是对 description
属性使用多行值。 由于后面的行以空格开头,因此它们将在删除空格的情况下连接起来。 我们示例中的第一行包含一个额外的空格,但这是句子本身的一部分,将“项目”和“经理”这两个词分开。
与上一节一样,同一文件中的每个附加条目都由空行分隔。 注释可以通过以 #
字符开始的行来使用。 注释必须存在于自己的行中。 例如,如果我们想在同一个 LDIF 文件中添加 Sally,我们可以像这样分隔两个条目:
# Add John Smith to the organization dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: add objectClass: inetOrgPerson description: John Smith from Accounting. John is the project manager of the building project, so contact him with any qu estions. cn: John Smith sn: Smith uid: jsmith1 # Add Sally Brown to the organization dn: uid=sbrown20,ou=People,dc=example,dc=com changetype: add objectClass: inetOrgPerson description: Sally Brown from engineering. Sally is responsibl e for designing the blue prints and testing the structural int egrity of the design. cn: Sally Brown sn: Brown uid: sbrown20
处理条目添加
现在我们知道如何构造 LDIF 文件来添加新条目,我们需要使用 LDAP 工具实际处理这些文件以将它们添加到 DIT。 您使用的工具和/或参数将取决于您在上面选择的形式。
如果您使用简单输入格式(没有 changetype
设置),您可以使用 ldapadd
命令或带有 -a
标志的 ldapmodify
命令,它指定了一个条目添加。 您将需要使用 SASL 方法对 LDAP 实例进行身份验证(这超出了本指南的范围),或者绑定到 DIT 中的管理帐户并提供所需的密码。
例如,如果我们将简单条目部分的条目存储在一个名为 newgroups.ldif
的文件中,我们需要处理该文件并添加新条目的命令将如下所示:
ldapadd -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif
您还可以使用 ldapmodify -a
组合获得相同的结果:
ldapmodify -a -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif
如果您使用 second 格式,并带有 changetype
声明,您将需要使用不带 -a
标志的 ldapmodify
命令。 由于此命令和格式适用于大多数其他修改,因此它可能更容易用于大多数更改。 如果我们将两个新添加的用户存储在一个名为 newusers.ldif
的文件中,我们可以通过键入以下内容将其添加到现有的 DIT 中:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newusers.ldif
这将允许您随意添加条目到您的 DIT。 您可以轻松地将许多条目存储在单个 LDIF 文件中,并在单个命令中填充您的 DIT。
从 DIT 中删除条目
在上一节中,我们第一次看到了 changetype
选项。 此选项提供了指定我们希望进行的高级修改类型的方法。 对于条目删除,此选项的值为“delete”。
条目删除实际上是您可以执行的最直接的更改,因为唯一需要的信息是 DN。
例如,如果我们想从 DIT 中删除 ou=othergroup
条目,我们的 LDIF 文件只需要包含以下内容:
dn: ou=othergroup,dc=example,dc=com changetype: delete
要处理更改,您可以使用上面 ldapmodify
使用的确切格式。 如果我们用删除请求 rmothergroup.ldif
调用文件,我们会这样应用它:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f rmothergroup.ldif
这将立即从系统中删除 ou=othergroup
条目。
修改条目的属性
修改条目的属性是一种非常常见的更改,可以通过在条目的 DN 之后指定 changetype: modify
来实现。 您可以对属性进行的修改类型主要反映了您可以对条目本身进行的修改。 因此,请求的属性更改类型的详细信息随后使用附加指令指定。
向条目添加属性
例如,您可以在 changetype: modify
之后使用 add:
命令添加属性。 这应该指定您要添加的属性。 然后,您将像正常一样设置属性的值。 所以基本格式是:
dn: entry_to_add_attribute changetype: modify add: attribute_type attribute_type: value_to_set
例如,要向我们的帐户添加一些电子邮件地址,我们可以有一个如下所示的 LDIF 文件:
dn: uid=sbrown20,ou=People,dc=example,dc=com changetype: modify add: mail mail: sbrown@example.com dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: modify add: mail mail: jsmith1@example.com mail: johnsmith@example.com
从第二个条目可以看出,您可以同时指定多个添加。 mail
属性允许多个值,因此这是允许的。
您可以像往常一样使用 ldapmodify
进行处理。 如果更改在文件 sbrownaddmail.ldif
中,您可以键入:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownaddmail.ldif
替换条目中属性的值
另一个常见的更改是修改属性的现有值。 我们可以使用 changetype: modify
下面的 replace:
选项来做到这一点。
这与 add:
命令的操作方式几乎相同,但默认情况下,会从条目中删除每个现有的属性出现,并将其替换为之后定义的值。 例如,如果我们注意到上一个 add:
命令的电子邮件不正确,我们可以使用 replace
命令修改它,如下所示:
dn: uid=sbrown20,ou=People,dc=example,dc=com changetype: modify replace: mail mail: sbrown2@example.com
请记住,这将替换条目中 mail
的 every 实例。 这对于每个条目可以多次定义的多值属性(如 mail
)很重要。 如果您希望仅替换单个出现的属性,则应将属性 delete:
选项(如下所述)与属性 add:
选项(如上所述)结合使用。
如果此更改存储在名为 sbrownchangemail.ldif
的文件中,我们可以通过键入以下内容替换 Sally 的电子邮件:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownchangemail.ldif
从条目中删除属性
如果要从条目中删除属性,可以使用 delete:
命令。 您将指定要删除的属性作为选项的值。 如果要删除属性的特定实例,可以在以下行中指定特定的键值属性出现。 否则,条目中该属性的每次出现都将被删除。
例如,这将删除 John Smith 条目中的每个描述属性:
dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: modify delete: description
但是,这只会删除指定的电子邮件:
dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: modify delete: mail mail: jsmith1@example.com
由于我们之前给了 John 两个电子邮件地址,因此此请求应保持另一个电子邮件地址不变。
如果这些更改位于名为 jsmithrmdesc.ldif
和 jsmithrmextramail.ldif
的文件中,我们可以通过键入以下内容应用它们:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmextramail.ldif
指定多个属性更改
这是讨论同时指定多个属性更改的好时机。 对于 LDIF 文件中的单个条目,您可以指定多个属性更改,方法是用仅填充 -
字符的行分隔它们。 在分隔符之后,必须指定属性更改类型,并且必须给出所需的属性。
例如,我们可以删除 John 的剩余电子邮件属性,将他的名字更改为“Johnny Smith”,并通过创建一个包含以下内容的文件来添加他的位置:
dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: modify delete: mail - replace: cn cn: Johnny Smith - add: l l: New York
要在一个命令中应用所有这些更改,我们将使用我们一直使用的相同 ldapmodify
格式:
ldapmodify -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 将无效。 如果她的真实用户名是 sbrown200
,我们可以更改条目的 DN,同时创建任何必要的属性,使用这样的 LDIF 文件:
dn: uid=sbrown20,ou=People,dc=example,dc=com changetype: modrdn newrdn: uid=sbrown200 deleteoldrdn: 0
我们可以使用以下命令应用此更改:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fixsallydn.ldif
这将使完整的条目看起来像这样:
dn: uid=sbrown200,ou=People,dc=example,dc=com objectClass: inetOrgPerson description: Sally Brown from engineering. Sally is responsibl e for designing the blue prints and testing the structural int egrity of the design. cn: Sally Brown sn: Brown uid: sbrown20 uid: sbrown200 mail: sbrown2@example.com
如您所见,我们的 DN 已调整为使用新的属性/值对。 该属性已添加到条目中以使其成为可能。
您可能已经注意到上面示例中的两件事。 首先,我们将一个名为 deleteoldrdn
的选项设置为“0”。 其次,生成的条目同时具有 uid: sbrown20
和 uid: sbrown200
。
更改条目的 DN 时必须设置 deleteoldrdn
选项。 将 deleteoldrdn
设置为“0”会导致 LDAP 将 DN 中使用的旧属性与条目中的新属性一起保留。 有时这是您想要的,但通常您希望在 DN 更改后从条目中完全删除旧属性。 您可以改为将 deleteoldrdn
设置为“1”。
假设我们又犯了一个错误,Sally 的实际用户名是 sbrown2
。 我们可以将deleteoldrdn
设置为“1”,将DN中当前使用的sbrown200
实例从重命名后的条目中删除。 我们将继续添加一个额外的 changetype: modify
和 delete:
对,以摆脱另一个流浪用户名 sbrown20
,因为我们在第一次重命名时保留了它:
dn: uid=sbrown200,ou=People,dc=example,dc=com changetype: modrdn newrdn: uid=sbrown2 deleteoldrdn: 1 dn: uid=sbrown2,ou=People,dc=example,dc=com changetype: modify delete: uid uid: sbrown20
像这样应用文件:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fix2sallydn.ldif
此组合不会随更改添加新的用户名(sbrown200
将被删除),第二次条目修改将删除用户名的原始值(sbrown20
)。
移动条目
如果您需要将条目移动到新位置,changetype: modrdn
的附加设置是 newsuperior:
选项。 使用此选项时,您可以在 DIT 上指定一个新位置以将条目移动到。 这将在更改期间将该条目置于指定的父 DN 下。
例如,如果我们想将 Sally 移动到 ou=superusers
条目下,我们可以添加这个条目,然后通过键入以下命令将她移动到其中:
dn: ou=superusers,dc=example,dc=com changetype: add objectClass: organizationalUnit ou: superusers dn: uid=sbrown2,ou=People,dc=example,dc=com changetype: modrdn newrdn: uid=sbrown2 deleteoldrdn: 0 newsuperior: ou=superusers,dc=example,dc=com
假设它存储在一个名为 mksuperuser.ldif
的文件中,我们可以像这样应用更改:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f mksuperuser.ldif
这导致移动而不是复制。
在这种情况下,我们不希望实际更改条目的 RDN,因此我们将 newrdn:
的值设置为它当前的值。 如果我们愿意,我们也可以在移动过程中轻松重命名。 在这种情况下,newsuperior:
设置是第二个更改中唯一实际影响条目状态的行。
旁白:将二进制数据添加到条目
本节与上述信息是分开的,因为它可能适合关于创建条目或定义附加属性的部分。
LDAP 能够为某些属性存储二进制数据。 例如,inetOrgPerson
类允许一个名为 jpegPhoto
的属性,该属性可用于存储人的照片或用户图标。 此 objectClass 的另一个可以使用二进制数据的属性是 audio
属性。
要将此类数据添加到 LDAP 条目,您必须使用特殊格式。 指定属性时,紧跟在冒号之后,使用小于字符 (<) 和空格。 之后,包括相关文件的路径。
例如,如果您在 /tmp
目录中有一个名为 john.jpg
的文件,您可以使用如下所示的 LDIF 文件将该文件添加到 John 的条目中:
dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: modify add: jpegPhoto jpegPhoto:< file:///tmp/john.jpg
密切注意冒号、小于字符和空格的位置。 如果您的文件位于磁盘上,则可以使用 file://
前缀。 如果您使用的是绝对路径,该路径将添加一个额外的斜杠以指示根目录。
这与音频文件的工作方式相同:
dn: uid=jsmith1,ou=People,dc=example,dc=com changetype: modify add: audio audio:< file:///tmp/hellojohn.mp3
处理完 LDIF 文件后,实际文件将在 LDAP 目录服务中进行编码。 记住这一点很重要,因为添加大量这样的文件会对服务的大小和性能产生影响。
当您需要使用 ldapsearch
工具检索编码数据时,您需要添加 -t
标志,这将允许将文件写入 /tmp
目录。 生成的文件名将显示在结果中。
例如,我们可以使用此命令将二进制数据写入临时文件:
ldapsearch -LLL -x -H ldap:// -t -b "dc=example,dc=com" "uid=jsmith1"
搜索结果将如下所示:
ldapsearch 输出
dn: uid=jsmith1,ou=People,dc=example,dc=com objectClass: inetOrgPerson sn: Smith uid: jsmith1 cn: Johnny Smith l: New York audio:< file:///tmp/ldapsearch-audio-n5GRF6
如果我们去 /tmp
目录,我们可以找到该文件。 它可以根据需要重命名,并且应该处于将其输入目录之前的确切状态。
重复执行此操作时要小心,因为每次执行搜索时都会写出一个新文件。 如果您不注意,您可能会在不知不觉中轻松填满磁盘。
结论
到目前为止,您应该对如何使用 LDIF 格式文件和一些工具来操作 LDAP 目录信息树中的条目有了相当好的了解。 虽然某些 LDAP 客户端可能使 LDIF 文件对日常操作来说是不必要的,但 LDIF 文件可能是对 DIT 条目执行批处理操作的最佳方式。 了解如何使用这些方法修改条目以进行管理、设置初始目录服务以及修复可能阻止客户端正确访问您的数据的问题时,也很重要。