介绍
如果您没有很好地掌握可用的工具以及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通过SSL连接到您的LDAP服务器,而不是将要使用的
ldaps://
方案(注意,这是一个方法已过时OpenLDAP项目建议使用STARTTLS正常的LDAP端口,而不是升级。了解如何设置此
位置 ):
ldapsearch -H ldaps://server_domain_or_IP . . .
这些协议假设(默认端口
389
对常规LDAP和
636
通过SSL的LDAP)。如果使用非标准端口,则需要将其添加到冒号和端口号的末尾。 要连接到您从不是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层次结构顶部的父元素,称为根,基或Stapling条目,在其下放置所有其他条目。您还需要知道要绑定的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的根。我们可以使用它来搜索要绑定的条目。 admin条目通常使用
simpleSecurityObject
对象类,以获得在入门设置密码的功能。我们可以用这个来搜索这个类的入口:
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:// supportedSASLMechanisms
dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
如果您使用的是
ldapi://
它使用安全的进程间通信方案,你可能有选择的扩展列表:
ldapsearch -H ldapi:// -x -LLL -s base -b "" supportedSASLMechanisms
ldapi:// supportedSASLMechanisms
dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: EXTERNAL
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: LOGIN
supportedSASLMechanisms: PLAIN
配置大多数SASL认证方法可能需要一些时间,因此我们不会在这里涵盖大部分细节。虽然SASL认证通常是本文的讨论范围之内,我们应该谈谈
EXTERNAL
,我们看到可以使用的方法
ldapi://
方案。 该
EXTERNAL
机制表明认证和安全是由与连接相关联的一些其它手段来处理。例如,它可以与SSL一起使用以提供加密和认证。 最常见的,你会看到它与所使用的
ldapi://
与根或接口
sudo
用户。 因为
ldapi://
使用Unix套接字,能够获得用户发起的请求,并用于某些操作进行认证。 LDAP用于配置的DIT使用此机制来验证root用户读取和更改LDAP。这些请求看起来像这样:
sudo ldapsearch -H ldapi:// -Y EXTERNAL . . .
这用于修改通常保持在一个DIT起动用LDAP配置
cn=config
根条目。
设置.ldaprc文件
到目前为止,我们已经在命令行上主要指定了连接信息。但是,您可以通过将一些常见的连接值放在配置文件中来保存自己一些输入。 全局客户端配置文件位于/etc/ldap/ldap.conf
,但你主要是想在其中添加修改位于你的主目录用户的配置文件
~/.ldaprc
。在文本编辑器中使用此名称创建并打开一个文件:
nano ~/.ldaprc
在里面,你可能要配置的基本设置是
BASE
,
URI
,并
BINDDN
:
BASE
:用来指定搜索应该启动项的默认基准DN。如果在命令行中提供另一个搜索库,这将被覆盖(我们将在下一部分中了解更多)。URI
:LDAP服务器可到达的地址。 这应该包括一个方案(ldap
定期LDAP,ldaps
为LDAP通过SSL和ldapi
其次是服务器的名称和端口LDAP在一个IPC插座)。如果服务器位于同一台计算机上,则名称可以关闭,如果服务器在所选方案的默认端口上运行,则可以关闭端口。BINDDN
:指定默认的LDAP项绑定到。这用于提供您要使用的访问的“帐户”信息。您仍然需要在命令行上指定任何密码。
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
用户已经绑定到了访问入口。如果我们使用不同的条目,将获得树的另一部分。例如,如果我们从管理员条目开始,您只能获取管理员条目本身:
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
标志。 您可以使用0-3个
-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=*)"
一些有用的搜索过滤器是:
- 平等 :使用
=
运算符来匹配一个确切的属性值。 - 存在 :使用
=*
检查属性的存在而不考虑其价值。 - 大于或等于 :使用
>=
操作者检查值大于或等于给定值。 - 小于或等于 :采用
<=
运算符少检查值小于或等于给定值。 - 子 :使用
=
用细绳和*
通配符作为一个字符串的一部分。用于指定要查找的值的一部分。 - 接近 :使用
~=
运算符来匹配左右是什么在右边。这不总是由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
复合搜索
复合搜索涉及组合两个或更多个单独的搜索过滤器以获得更精确的结果。通过将关系运算符作为第一项将它们包装在另一组括号中来组合搜索过滤器。这比解释更容易演示。 关系运算符是作为逻辑AND的“&”字符,并且“|”字符,表示逻辑或。这些在过滤器之前,它们的关系在外部括号中定义。 因此,为了搜索在我们的域中具有描述和电子邮件地址的条目,我们可以构造如下的过滤器:"(&(description=*)(mail=*@example.com))"
对于要返回的条目,必须同时定义这两个属性。 如果任一子过滤器为真,则OR符号将返回结果。如果我们想输出我们有联系信息的条目,我们可以尝试这样的过滤器:
"(|(telephoneNumber=*)(mail=*)(street=*))"
这里,我们看到运算符可以应用于两个以上的子过滤器。我们也可以根据需要嵌套这些逻辑结构以创建相当复杂的模式。
使用ldapmodify和变更来更改或创建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变化应该有一个
changetype
指定。 该
ldapmodify
命令是DIT操作命令的最普遍的形式。 如果您的LDIF文件添加新条目
,并且
不包括
changetype: add
每个条目,您可以使用
-a
标志用
ldapmodify
,或者干脆使用
ldapadd
命令,基本上别名此行为。 例如,一个LDIF文件,其中
包含
changetype
是这样的:
LDIF与changetype
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: delete
和
changetype: 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实现是可选的,但是由其他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
该ldapwhoami
LDAP服务器进行身份验证后,如何看待你的命令可以告诉你。 如果您使用匿名或简单身份验证,结果可能不会太有用(“匿名”或完全是您绑定的条目)。然而,对于SASL认证,这可以提供洞察如何看到您的认证机制。 举例来说,如果我们使用
-Y EXTERNAL
SASL机制与
sudo
要在执行操作
cn=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扩展。我们不会在这里覆盖这些。
ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)
If you were to feed this into the
ldapurl
tool, you'd use the
-H
flag and put the URL in quotes:
ldapurl -H "ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)"
The command would break it apart like this:
ldapurl output
scheme: ldap
host: localhost
port: 389
dn: dc=chilidonuts,dc=tk
selector: dn
selector: ou
scope: sub
filter: (ou=*)
You can also use these flags to reverse the process and cobble together an LDAP URL. These mirror the various components of the LDAP URL:
-S
: The URL scheme (ldap
,ldaps
, orldapi
). Theldap
scheme is default.-h
: The LDAP server name or address-p
: The LDAP server port. The default value will depend on the scheme.-b
: The base DN to start the query-a
: A comma-separated list of attributes to return-s
: The search scope to use (base, sub, children, or one)-f
: The LDAP filter to select the entries to return-e
: The LDAP extensions to specify
ldapurl -h localhost -b "dc=example,dc=com" -a dn,ou -s sub -f "(ou=*)"
The command would return the constructed URL, which would look like this:
ldapurl output
ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)
You can use this to construct URLs that can be used with an LDAP client capable of communicating using this format.
ldapcompare
Theldapcompare
tool can be used to compare an entry's attribute to a value. This is used to perform simple assertion checks to validate data. The process involves binding as you normally would depending on the data being queried, providing the entry DN and the assertion to check. The assertion is given by specifying an attribute and then a value, separated by one or two colons. For simple string values, a single colon should be used. A double colon indicates a base64 encoded value has been given. So you can assert that John is a member of the "powerusers" group with something like this:
ldapcompare -H ldap:// -x "ou=powerusers,ou=groups,dc=example,dc=com" "member:uid=john,ou=people,dc=example,dc=com"
If he is in the group, it will return
TRUE
. If not, the command will return
FALSE
. If the DN being used to bind doesn't have sufficient privileges to read the attribute in question, it will return
UNDEFINED
. This could be used as the basis for an authorization system by checking group membership prior to performing requested actions.