如何通过OpenLDAP实用程序管理和使用LDAP服务器

来自菜鸟教程
跳转至:导航、​搜索

介绍

如果您没有很好地掌握可用的工具以及 LDAP 所需的信息和方法,LDAP 系统似乎很难管理。 在本指南中,我们将演示如何使用 OpenLDAP 团队开发的 LDAP 工具与 LDAP 目录服务器进行交互。

先决条件

要开始使用,您应该可以访问安装和配置了 OpenLDAP 的系统。 您可以在此处 了解如何设置 OpenLDAP 服务器 。 您应该熟悉使用 LDAP 目录服务时使用的基本术语。 本指南可用于更熟悉这些主题。

安装工具

上述先决条件假设您已经可以访问 LDAP 系统,但您可能尚未安装本指南中讨论的 OpenLDAP 工具。

在 Ubuntu 或 Debian 系统上,您可以通过 apt 存储库安装这些工具。 更新您的本地包索引并通过键入以下内容进行安装:

sudo apt-get update
sudo apt-get install ldap-utils

在 CentOS 或 Fedora 上,您可以使用 yum 获取相应的文件。 通过键入以下命令安装它们:

sudo yum install openldap-clients

安装正确的软件包后,请继续下面的操作。

连接到 LDAP 实例

大多数 OpenLDAP 工具都非常灵活,牺牲了简洁的命令结构来与多个不同角色的系统进行交互。 因此,用户必须选择各种参数来表达连接到 LDAP 服务器所需的最低限度。

在本节中,我们将重点关注根据您希望执行的操作类型构建联系服务器所需的参数。 这里讨论的参数将用于各种工具,但我们将使用 ldapsearch 进行演示。

指定服务器

OpenLDAP 工具要求您为每个操作指定身份验证方法和服务器位置。 要指定服务器,请使用 -H 标志,后跟相关服务器的协议和网络位置。

对于基本的未加密通信,协议方案将是 ldap://,如下所示:

ldapsearch -H ldap://server_domain_or_IP . . .

如果是与本地服务器通信,可以省略服务器域名或IP地址(仍需指定方案)。

如果您使用 LDAP over SSL 连接到您的 LDAP 服务器,您将希望使用 ldaps:// 方案(请注意,这是一种已弃用的方法。 OpenLDAP 项目建议在普通 LDAP 端口上使用 STARTTLS 升级。 在此处 了解如何设置 ):

ldapsearch -H ldaps://server_domain_or_IP . . .

这些协议采用默认端口(传统 LDAP 为 389,基于 SSL 的 LDAP 为 636)。 如果您使用的是非标准端口,则需要在末尾添加一个冒号和端口号。

要通过 Linux IPC(进程间通信)连接到正在查询的服务器上的 LDAP 目录,可以使用 ldapi:// 协议。 这对于某些管理任务来说更加安全和必要:

ldapsearch -H ldapi:// . . .

由于 ldapi 方案需要本地连接,因此我们无需在此处指定服务器名称。 但是,如果您更改了 LDAP 服务器配置中的套接字文件位置,则需要将新的套接字位置指定为地址的一部分。

匿名绑定

LDAP 要求客户端标识自己,以便服务器可以确定授予请求的访问级别。 这通过使用称为“绑定”的 LDAP 机制来工作,该机制基本上只是将您的请求与已知安全实体相关联的术语。 LDAP 可以理解三种不同类型的身份验证。

客户端可以使用的最通用的身份验证类型是“匿名”绑定。 这几乎是缺乏身份验证。 LDAP 服务器可以将某些操作归类为任何人都可以访问(通常,默认情况下,面向公众的 DIT 配置为对匿名用户只读)。 如果您使用的是匿名绑定,那么您可以使用这些操作。

OpenLDAP 工具默认采用 SASL 身份验证(我们稍后会讨论),因此要允许匿名绑定,我们必须提供 -x 参数。 结合服务器规范,这看起来像这样:

ldapsearch -H ldap://server_domain_or_IP -x

如果你在不提供额外参数的情况下输入它,你应该得到如下内容:

带有匿名绑定的 ldapsearch 的输出

# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

这表示该工具没有找到我们搜索的内容。 由于我们没有提供查询参数,这是意料之中的,但它确实表明我们的匿名绑定已被服务器接受。

简单认证

对 LDAP 服务器进行身份验证的第二种方法是使用简单绑定。 简单绑定使用 LDAP 服务器中的条目来验证请求。 条目的 DN(专有名称)用作身份验证的用户名。 在条目内部,一个属性定义了在请求期间必须提供的密码。

查找 DIT 根条目和 RootDN 绑定

要使用简单身份验证进行身份验证,您需要知道位于 DIT 层次结构顶部的父元素,称为根、基或后缀条目,所有其他条目都位于其下。 您还需要知道要绑定的 DN。

通常,在安装 LDAP 服务器期间,会设置初始 DIT,并使用管理条目(称为 rootDN)和密码进行配置。 开始时,这将是为绑定配置的唯一 DN。

如果您不知道您要连接的 LDAP 服务器的根条目,您可以在正常 LDAP DIT 之外查询一个特殊的“元”条目,以获取有关它所知道的 DIT 根条目的信息(这称为根 DSE) . 您可以通过键入以下内容查询此条目的 DIT 名称:

ldapsearch -H ldap://server_domain_or_IP -x -LLL -s base -b "" namingContexts

LDAP 服务器应该返回它知道的根条目,看起来像这样:

LDAP 根条目结果

dn:
namingContexts: dc=example,dc=com

突出显示的区域是 DIT 的根。 我们可以使用它来搜索要绑定的条目。 管理员条目通常使用 simpleSecurityObject objectClass 以获得在条目中设置密码的能力。 我们可以用它来搜索这个类的条目:

ldapsearch -H ldap://server_domain_or_IP -x -LLL -b "dc=example,dc=com" "(objectClass=simpleSecurityObject)" dn

这将为您提供使用此类的条目列表。 通常只有一个:

simpleSecurityObject 搜索结果

dn: cn=admin,dc=example,dc=com

这是我们可以绑定的 rootDN 帐户。 您应该在服务器安装期间为此帐户配置了密码。 如果您不知道密码,您可以按照本指南重置密码。

执行绑定

获得条目和密码后,您可以在请求期间执行简单绑定,以向 LDAP 服务器验证您自己的身份。

同样,我们必须指定 LDAP 服务器位置并提供 -x 标志以指示我们不希望使用 SASL 身份验证。 要执行实际绑定,我们需要使用 -D 标志来指定要绑定到的 DN,并使用 -w-W 命令提供密码。 -w 选项允许您提供密码作为命令的一部分,而 -W 选项将提示您输入密码。

绑定到 rootDN 的示例请求如下所示:

ldapsearch -H ldap://server_domain_or_IP -x -D "cn=admin,dc=example,dc=com" -W

我们应该得到与匿名绑定相同的结果,表明我们的凭据已被接受。 绑定到条目通常会为您提供通过匿名绑定无法获得的额外权限。 绑定到 rootDN 可以让您对整个 DIT 进行读/写访问,而不管访问控制如何。

SASL 身份验证

SASL 代表简单的身份验证和安全层。 它是一个将身份验证方法与协议挂钩的框架,以提供不依赖于特定实现的灵活身份验证系统。 您可以查看 维基百科页面 以了解可用的各种方法。

您的 LDAP 服务器可能只支持可能的 SASL 机制的一个子集。 要找出它允许的机制,您可以键入:

ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms

您看到的结果会因您用于连接的方案而异。 对于未加密的 ldap:// 方案,大多数系统将默认允许:

ldap://supportedSASLM机制

dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5

如果您使用的是 ldapi:// 方案,它使用安全的进程间通信,您可能会有一个扩展的选择列表:

ldapsearch -H ldapi:// -x -LLL -s base -b "" supportedSASLMechanisms

ldapi://supportedSASL机制

dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: EXTERNAL
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: LOGIN
supportedSASLMechanisms: PLAIN

配置大多数 SASL 身份验证方法可能需要一些时间,因此我们不会在这里详细介绍。 虽然 SASL 身份验证通常超出了本文的范围,但我们应该讨论一下我们看到可用于 ldapi:// 方案的 EXTERNAL 方法。

EXTERNAL 机制表明身份验证和安全性是通过与连接相关的其他方式来处理的。 例如,它可以与 SSL 一起使用来提供加密和身份验证。

最常见的是,您会看到它与 root 或 sudo 用户的 ldapi:// 界面一起使用。 由于 ldapi:// 使用 Unix 套接字,因此可以获取发起请求的用户,并用于对某些操作进行身份验证。 LDAP 用于配置的 DIT 使用此机制来验证 root 用户以读取和更改 LDAP。 这些请求看起来像这样:

sudo ldapsearch -H ldapi:// -Y EXTERNAL . . .

这用于修改通常保存在以 cn=config 根条目开头的 DIT 中的 LDAP 配置。

设置 .ldaprc 文件

到目前为止,我们主要在命令行上指定连接信息。 但是,您可以通过将一些常见的连接值放在配置文件中来节省一些输入。

全局客户端配置文件位于 /etc/ldap/ldap.conf,但您主要希望将更改添加到位于主目录 ~/.ldaprc 中的用户配置文件。 在文本编辑器中创建并打开一个具有此名称的文件:

nano ~/.ldaprc

在里面,您可能想要配置的基本设置是 BASEURIBINDDN

  • BASE:默认的基本 DN,用于指定开始搜索的条目。 如果在命令行上提供了另一个搜索库,这将被覆盖(我们将在下一节中看到更多内容)。
  • URI:可以到达LDAP服务器的地址。 这应该包括一个方案(ldap 用于常规 LDAP,ldaps 用于 LDAP over SSL,ldapi 用于 LDAP over IPC 套接字)后跟服务器的名称和端口. 如果服务器位于同一台机器上,则可以不使用名称,如果服务器在所选方案的默认端口上运行,则可以不使用端口。
  • BINDDN:这指定要绑定到的默认 LDAP 条目。 这用于为您希望使用的访问权提供“帐户”信息。 您仍然需要在命令行上指定任何密码。

这将处理简单的身份验证信息。 如果您使用 SASL 身份验证,请查看 man ldap.conf 以查看配置 SASL 凭据的选项。

如果我们的 LDAP 的基本条目是 dc=example,dc=com,服务器位于本地计算机上,并且我们正在使用 cn=admin,dc=example,dc=com 绑定,我们可能有一个 ~/.ldaprc 文件,看起来像这样:

~/.ldaprc

BASE    dc=example,dc=com
URI     ldap://
BINDDN  cn=admin,dc=example,dc=com

使用它,我们可以通过指定非 SASL 身份验证并提供与管理员条目关联的密码来执行基本搜索。 这将提供我们指定的默认基本 DN 的完整子树搜索:

ldapsearch -x -w password

这有助于在您使用 LDAP 实用程序时缩短“样板”连接选项。 在本指南中,为了明确起见,我们将在命令中包含连接信息,但是在运行命令时,您可以删除您在配置文件中指定的任何部分。

使用 ldapsearch 查询 DIT 和查找条目

现在我们已经很好地处理了如何验证和指定 LDAP 服务器,我们可以开始更多地讨论您可以使用的实际工具。 对于我们的大多数示例,我们假设我们在托管 LDAP 服务器的同一台服务器上执行这些操作。 这意味着我们的主机规范在方案之后将是空白的。 我们还将假设服务器管理的 DIT 的基本条目是用于 dc=example,dc=com。 rootDN 将是 cn=admin,dc=example,dc=com。 让我们开始吧。

我们将从 ldapsearch 开始,因为到目前为止我们一直在我们的示例中使用它。 LDAP 系统针对搜索、读取和查找操作进行了优化。 如果您使用 LDAP 目录,您的大部分操作可能是搜索或查找。 ldapsearch 工具用于查询和显示 LDAP DIT 中的信息。

我们已经介绍了负责命名和连接到服务器的部分语法,如下所示:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -W

这为我们提供了连接和验证服务器上运行的 LDAP 实例所需的最低限度,但是,我们并没有真正搜索任何内容。 要了解更多信息,我们将不得不讨论搜索库和搜索范围的概念。

搜索库和范围

在 LDAP 中,搜索开始的地方称为 搜索库 。 这是 DIT 中的一个条目,操作将从该条目开始并充当锚点。 我们通过传递带有 -b 标志的条目名称来指定搜索库。

例如,要从我们的 dc=example,dc=com DIT 的根目录开始,我们可以将其用作搜索库,如下所示:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com"

此命令应在 dc=example,dc=com 条目下生成您绑定的用户有权访问的每个条目。 如果我们使用不同的条目,将得到树的另一部分。 例如,如果我们从 admin 条目开始,您可能只会得到 admin 条目本身:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "cn=admin,dc=example,dc=com"

cn=admin,dc=example,dc=com 的搜索库

# extended LDIF
#
# LDAPv3
# base <cn=admin,dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# admin, example.com
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9ejN2UmHoRjdha09tQY96TC9IN0kxYUVCSjhLeXBsc3A=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

我们在这些示例中指定了基础,但我们可以通过指定搜索范围来进一步塑造工具查找结果的方式。 此选项由 -s 选项设置,可以是以下任何一项:

  • sub:如果没有指定其他搜索范围,则默认搜索范围。 这将搜索基本条目本身以及沿树向下的所有后代。 这是最大的范围。
  • base:这只搜索搜索库本身。 它用于返回搜索库中指定的条目,并且更好地定义为查找而不是搜索。
  • one:仅搜索搜索库的直接后代/子代(搜索库下方的单个层次结构级别)。 这不包括搜索库本身,也不包括任何这些条目下的子树。
  • children:这与 sub 范围的功能相同,但它不包括搜索库本身在结果中(搜索下面的每个条目,但不包括搜索库)。

使用 -s 标志和 -b 标志,我们可以开始塑造我们希望工具查看的 DIT 区域。 例如,我们可以通过使用 one 范围来查看基础条目的所有第一级子项,如下所示:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -s one -LLL dn

我们在末尾添加了 -LLL dn 以对输出进行一点过滤。 我们将在本文后面进一步讨论这个问题。 如果我们在树中添加了更多条目,则可能会返回如下结果:

输出

dn: cn=admin,dc=example,dc=com

dn: ou=groups,dc=example,dc=com

dn: ou=people,dc=example,dc=com

如果我们想查看 ou=people 条目下的所有内容,我们可以将其设置为搜索库并使用 children 范围:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "ou=people,dc=example,dc=com" -s children -LLL dn

通过调整搜索基础和搜索范围,您可以只对您感兴趣的 DIT 部分进行操作。 这将使您的查询通过仅搜索树的一部分来更好地执行,并且它只会返回您感兴趣的条目。

删除无关输出

在继续之前,让我们先谈谈如何移除 ldapsearch 产生的一些额外输出。

大部分额外输出由 -L 标志控制。 您可以使用零到三个 -L 标志,具体取决于您希望看到的输出级别。 添加的 -L 标志越多,抑制的信息就越多。 在学习或故障排除时避免抑制任何输出可能是一个好主意,但在正常操作期间,使用所有三个级别可能会带来更好的体验。

如果您使用 SASL 身份验证,例如在修改 cn=config DIT 时,您可以额外使用 -Q 标志。 这将启用 SASL 安静模式,这将删除任何与 SASL 相关的输出。 使用 -Y EXTERNAL 方法时这很好,但如果您使用提示输入凭据的机制,请小心,因为这也会被抑制(导致身份验证失败)。

搜索过滤器和输出属性过滤器

要实际执行搜索而不是简单地输出整个搜索范围,您需要指定搜索过滤器。

这些可以放在行尾,并采用属性类型、比较运算符和值的形式。 通常,它们在引号内指定以防止 shell 解释。 括号用于指示一个过滤器与另一个过滤器的界限。 这些在简单的单属性搜索中是可选的,但在更复杂的复合过滤器中是必需的。 我们将在这里使用它们来更好地指示搜索过滤器的位置。

例如,我们可以查看 dc=example,dc=com DIT 中是否存在用户名 (uid) 属性设置为“jsmith”的条目。 这会在搜索范围内搜索每个条目以查找设置为该值的属性:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=jsmith)"

我们在上面的示例中使用了相等运算符,它测试属性值的精确匹配。 还有各种其他运算符,它们的功能与您期望的一样。 例如,要搜索 包含 属性的条目,而不关心值集,您可以使用“存在”运算符,它只是比较右侧带有通配符的等号. 我们可以通过键入以下内容来搜索包含密码的条目:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(userPassword=*)"

一些有用的搜索过滤器是:

  • Equality:使用 = 运算符来匹配精确的属性值。
  • Presence:使用 =* 检查属性是否存在,而不考虑其值。
  • 大于或等于:使用>=运算符检查大于或等于给定值的值。
  • 小于或等于:使用 <= 运算符检查小于或等于给定值的值。
  • Substring:将 = 与字符串和 * 通配符用作字符串的一部分。 用于指定您要查找的部分值。
  • Proximity:使用 ~= 运算符大致匹配右侧的内容。 LDAP 服务器并不总是支持这一点(在这种情况下,将执行相等或子字符串搜索)。

您还可以通过将搜索过滤器包装在一组以“!”为前缀的括号中来否定大多数搜索。 否定符号。 例如,要搜索所有组织单位条目,我们可以使用此过滤器:

"(ou=*)"

要搜索所有 而非 组织单位条目的条目,我们可以使用此过滤器:

"(!(ou=*)"

否定修饰符反转后面的搜索过滤器的含义。

按照过滤器规范,我们还可以添加属性输出过滤器。 这只是您希望从每个匹配条目中显示的属性列表。 默认情况下,每个匹配条目都会显示您的凭据具有读取权限的每个属性。 设置属性输出过滤器允许您准确指定您希望看到的输出类型。

例如,我们可以搜索所有具有用户 ID 的条目,但只显示每个条目关联的 通用名称 ,方法是键入:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=*)" cn

这可能会生成一个如下所示的列表:

输出

dn: uid=bwright,ou=People,dc=example,dc=com
cn: Brian Wright

dn: uid=jsmith1,ou=People,dc=example,dc=com
cn: Johnny Smith

dn: uid=sbrown2,ou=People,dc=example,dc=com
cn: Sally Brown

如果我们还想查看它们的条目描述,我们可以将其添加到要显示的属性列表中:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=*)" cn description

相反,它会显示如下内容:

输出

dn: uid=bwright,ou=People,dc=example,dc=com
cn: Brian Wright
description: Brian Wright from Marketing.  Brian takes care of marketing, pres
 s, and community.  Ask him for help if you need any help with outreach.

dn: uid=jsmith1,ou=People,dc=example,dc=com
cn: Johnny Smith
description: Johnny Smith from Accounting.  Johnny is in charge of the company
  books and hiring within the Accounting department.

dn: uid=sbrown2,ou=People,dc=example,dc=com
cn: Sally Brown
description: Sally Brown from engineering.  Sally is responsible for designing
  the blue prints and testing the structural integrity of the design.

如果没有给出属性过滤器,则返回所有属性。 这可以用“*”字符明确表示。 要返回操作属性(每个条目在后台管理的特殊元数据属性),您可以使用特殊的“+”符号。 例如,要查看我们的 rootDN 的操作属性,我们可以输入:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -b "dc=example,dc=com" -LLL "(cn=admin)" "+"

结果看起来像这样:

输出

dn: cn=admin,dc=example,dc=com
structuralObjectClass: organizationalRole
entryUUID: cdc718a0-8c3c-1034-8646-e30b83a2e38d
creatorsName: cn=admin,dc=example,dc=com
createTimestamp: 20150511151904Z
entryCSN: 20150514191233.782384Z#000000#000#000000
modifiersName: cn=admin,dc=example,dc=com
modifyTimestamp: 20150514191233Z
entryDN: cn=admin,dc=example,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

化合物检索

复合搜索涉及组合两个或多个单独的搜索过滤器以获得更精确的结果。 搜索过滤器通过将它们包装在另一组括号中来组合,其中关系运算符作为第一项。 这比解释更容易证明。

关系运算符是用作逻辑与的“&”字符和“|” 字符,表示逻辑或。 它们在过滤器之前,它们在外部括号中定义其关系。

因此,要在我们的域中搜索同时具有描述和电子邮件地址的条目,我们可以构建一个如下过滤器:

"(&(description=*)(mail=*@example.com))"

对于要返回的条目,它必须定义这两个属性。

如果任一子过滤器为真,OR 符号将返回结果。 如果我们想输出我们有联系信息的条目,我们可以尝试这样的过滤器:

"(|(telephoneNumber=*)(mail=*)(street=*))"

在这里,我们看到运算符可以应用于两个以上的子过滤器。 我们还可以根据需要嵌套这些逻辑结构以创建相当复杂的模式。

使用 ldapmodify 和 Variations 更改或创建 LDAP 条目

到目前为止,我们只关注 ldapsearch 命令,它对于在 LDAP DIT 中查找、搜索和显示条目和条目段很有用。 这将满足大多数用户的只读要求,但如果我们想更改 DIT 中的对象,我们需要一个不同的工具。

ldapmodify 命令通过使用 LDIF 文件来操作 DIT。 您可以通过查看 本指南 了解有关 LDIF 文件的更多信息以及如何使用这些文件修改或添加条目的详细信息。

ldapmodify 的基本格式与我们在本指南中一直使用的 ldapsearch 语法非常匹配。 例如,您仍然需要使用 -H 标志指定服务器,使用 -Y 标志进行 SASL 身份验证或 -x-D 进行身份验证,和 -[W|w] 标志用于简单的身份验证。

从 LDIF 文件应用更改

提供这些样板选项后,最常见的操作是读入 LDIF 文件并将其应用于 DIT。 这可以通过 -f 选项来完成(如果您不使用 -f 选项,则必须在命令行上使用 LDIF 格式输入更改)。 您需要使用上面链接的指南中描述的语法自己创建 LDIF 文件:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif

这将读取 LDIF 文件并应用其中指定的更改。 对于 ldapmodify 命令,每个 LDIF 更改都应指定一个 changetypeldapmodify 命令是 DIT 操作命令的最通用形式。

如果您的 LDIF 文件正在添加新条目并且 没有 为每个条目包含 changetype: add,则可以将 -a 标志与 ldapmodify 一起使用,或者简单地使用ldapadd 命令,它基本上是这种行为的别名。 例如,一个 包含changetype 的 LDIF 文件如下所示:

带有更改类型的 LDIF

dn: ou=newgroup,dc=example,dc=com
changetype: add
objectClass: organizationalUnit
ou: newgroup

要处理这个文件,你可以简单地使用 ldapmodify

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif

但是,文件也可以构造为 而没有changetype,如下所示:

没有更改类型的 LDIF

dn: ou=newgroup,dc=example,dc=com
objectClass: organizationalUnit
ou: newgroup

在这种情况下,要将此条目添加到 DIT,您需要将 -a 标志与 ldapmodify 一起使用,或者使用 ldapadd 命令。 任何一个:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -a -f /path/to/file.ldif

或这个:

ldapadd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif

类似的命令可用于条目删除 (ldapdelete) 和移动 LDAP 条目 (ldapmodrdn)。 使用这些命令,您无需分别在文件中明确指定 changetype: deletechangetype: modrdn。 对于其中的每一个,由您决定使用哪种格式(是在 LDIF 文件中还是在命令行中指定更改)。

测试更改和处理错误

如果要对任何 LDIF 文件进行试运行,可以使用 -n-v 标志。 这将告诉您在不修改实际 DIT 的情况下将执行哪些更改:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -n -v -f /path/to/file.ldif

通常,如果在处理 LDIF 文件时发生错误,操作会立即停止。 这通常是最安全的做法,因为通常情况下,文件后面的更改请求将在假设早期更改已正确应用的情况下修改 DIT。

但是,如果您希望命令继续通过文件,跳过导致错误的更改,您可以使用 -c 标志。 您可能还想使用 -S 标志指向可以写入错误的文件,以便您可以修复有问题的请求并重新运行它们:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -c -S /path/to/error_file -f /path/to/file.ldif

这样,您将有一个日志(完整的注释表明有问题的条目)在操作后进行评估。

各种其他 LDAP 命令

我们已经介绍过的命令执行您将在日常基础上使用的最常见的 LDAP 操作。 还有一些其他命令很有用。

ldappasswd

如果您的某些 LDAP 条目有密码,则可以使用 ldappasswd 命令修改条目。 这通过使用相关帐户或管理帐户进行身份验证,然后提供新密码(以及可选的旧密码)来实现。

旧密码应使用 -a 标志(旧密码作为下一项在线给出)、-A 标志(提示输入旧密码)或-t 标志(旧密码从下一项给出的文件中读取)。 这对于某些 LDAP 实现是可选的,但对于其他实现是必需的,因此最好包含。

新密码应使用 -s 标志(新密码作为下一项在线给出)、-S 标志(提示输入新密码)或-T 标志(从下一项给出的文件中读取新密码)。

所以一个典型的变化可能是这样的:

ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w oldpassword -a oldpassword -s newpassword

如果没有给出条目,则用于绑定的条目将被更改。 如果您要绑定到管理条目,则可以通过在命令后提供其他条目来更改您具有写入权限的其他条目。

ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w adminpassword -a oldpassword -s newpassword "uid=user,dc=example,dc=com"

要了解有关更改和重置密码的更多信息,请查看 本指南

呱呱坠地

ldapwhoami 命令可以告诉您身份验证后 LDAP 服务器如何看待您。

如果您使用匿名或简单身份验证,结果可能不会太有用(分别是“匿名”或您要绑定的条目)。 但是,对于 SASL 身份验证,这可以深入了解您的身份验证机制是如何被看到的。

例如,如果我们使用 -Y EXTERNAL SASL 机制和 sudocn=config DIT 执行操作,我们可以检查 ldapwhoami 以查看身份验证 DN :

sudo ldapwhoami -H ldapi:// -Y EXTERNAL -Q

ldapwhoami 输出

dn:gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth

这不是我们 DIT 中的实际条目,它只是将 SASL 身份验证转换为 LDAP 可以理解的格式的方式。 不过,查看身份验证 DN 可用于创建映射和访问限制,因此最好了解如何获取此信息。

ldapurl

ldapurl 工具允许您通过指定查询中涉及的各种组件来构造 LDAP URL。 LDAP URL 是一种您可以通过标准化 URL 从 LDAP 服务器请求资源的方式。 这些是未经身份验证的连接并且是只读的。 许多 LDAP 解决方案不再支持 LDAP URL 来请求资源,因此它们的使用可能会受到限制,具体取决于您使用的软件。

标准 LDAP URL 使用以下语法进行格式化:

ldap://host:port/base_dn?attr_to_return?search_scope?filter?extension

组件如下:

  • base_dn:开始搜索的基本 DN。
  • attr_to_return:您感兴趣的匹配实体的属性。 这些应该用逗号分隔。
  • search_scope:搜索范围。 基数、子数、一数或子数。
  • filter:用于选择应返回的条目的搜索过滤器。
  • extension: 您希望指定的 LDAP 扩展。 我们不会在这里介绍这些。

每个项目在 URL 中用问号分隔。 您不必提供您不使用的项目,但由于项目类型由其在字符串中的位置标识,因此您必须将该项目的“槽”留空,这将在您留下多个问号一排。 您可以在添加信息后立即停止 URL(末尾不需要问号来表示未使用的“插槽”)。

例如,一个 URL 可能如下所示:

ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)

如果您要将其输入 ldapurl 工具,您将使用 -H 标志并将 URL 放在引号中:

ldapurl -H "ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)"

该命令会像这样将其分开:

ldapurl 输出

scheme: ldap
host: localhost
port: 389
dn: dc=chilidonuts,dc=tk
selector: dn
selector: ou
scope: sub
filter: (ou=*)

您还可以使用这些标志来反转该过程并将 LDAP URL 拼凑在一起。 这些镜像 LDAP URL 的各种组件:

  • -S:URL 方案(ldapldapsldapi)。 ldap 方案是默认方案。
  • -h:LDAP 服务器名称或地址
  • -p:LDAP 服务器端口。 默认值将取决于方案。
  • -b:开始查询的基本DN
  • -a:要返回的以逗号分隔的属性列表
  • -s:要使用的搜索范围(base、sub、children 或 one)
  • -f:用于选择要返回的条目的 LDAP 过滤器
  • -e:要指定的 LDAP 扩展

使用这些,您可以键入如下内容:

ldapurl -h localhost -b "dc=example,dc=com" -a dn,ou -s sub -f "(ou=*)"

该命令将返回构造的 URL,如下所示:

ldapurl 输出

ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)

您可以使用它来构建可与能够使用此格式进行通信的 LDAP 客户端一起使用的 URL。

ldap比较

ldapcompare 工具可用于将条目的属性与值进行比较。 这用于执行简单的断言检查以验证数据。

该过程涉及绑定,就像您通常会根据要查询的数据一样,提供条目 DN 和要检查的断言。 断言是通过指定一个属性然后是一个值来给出的,用一个或两个冒号分隔。 对于简单的字符串值,应使用单个冒号。 双冒号表示已给出 base64 编码值。

因此,您可以断言 John 是“powerusers”组的成员,如下所示:

ldapcompare -H ldap:// -x "ou=powerusers,ou=groups,dc=example,dc=com" "member:uid=john,ou=people,dc=example,dc=com"

如果他在组中,它将返回 TRUE。 如果不是,该命令将返回 FALSE。 如果用于绑定的 DN 没有足够的权限来读取相关属性,它将返回 UNDEFINED

通过在执行请求的操作之前检查组成员身份,这可以用作授权系统的基础。

结论

您现在应该对如何使用一些 LDAP 实用程序来连接、管理和使用您的 LDAP 服务器有了一个很好的了解。 其他客户端可能会为您的 LDAP 系统提供更有用的界面以进行日常管理,但这些工具可以帮助您了解基本知识并提供对 DIT 数据和结构的良好低级访问。