9.4. 选择适当的验证方法

有关安全策略的基本决定是用户如何访问该目录。匿名用户访问该目录,或者每个用户都需要使用用户名和密码登录目录(验证)?
目录服务器提供以下身份验证方法:
目录对于所有用户使用相同的验证机制,无论用户还是 LDAP 感知型应用程序。
有关防止客户端或一组客户端验证的详情,请参考 第 9.5 节 “设计帐户锁定策略”

9.4.1. 匿名和未验证的访问

匿名访问提供了目录最简单的访问形式。它使数据可供 目录的任何用户使用,无论它们是否通过身份验证。
但是,匿名访问不允许管理员跟踪谁正在执行哪种搜索类型,而只有某人正在执行搜索。通过匿名访问,连接到目录的任何人都可以访问这些数据。
因此,管理员可能试图阻止特定用户或组访问某些类型的目录数据,但如果允许匿名访问数据,则用户仍然可以通过匿名绑定到目录来访问数据。
匿名访问可能会被限制。通常目录管理员仅允许匿名访问读、搜索和比较特权(不适用于写入、添加、删除或自我写入)。通常,管理员限制对包含通用信息(如姓名、电话号码和电子邮件地址)的属性子集的访问。不允许匿名访问更多的敏感数据,如政府身份号(如美国的社交安全号)、主页电话号码和地址以及 salary 信息。
如果需要通过更严格的规则访问目录数据,也可以完全禁用匿名访问。
当用户试图使用用户名绑定但没有用户密码属性时,未经身份验证的 绑定是。例如:
ldapsearch -x -D "cn=jsmith,ou=people,dc=example,dc=com" -b "dc=example,dc=com" "(cn=joe)"
如果用户没有尝试提供密码,目录服务器会授予匿名访问权限。未经身份验证的绑定不需要绑定 DN 为现有条目。
与匿名绑定一样,可以通过限制数据库访问来禁用未经身份验证的绑定来提高安全性。禁用未经身份验证的绑定具有另一个优点:可用于防止客户端的绑定失败。编写较差的应用程序可能会认为它成功通过目录的验证,因为它收到了一个绑定成功的信息,但实际情况是它传递密码失败,只是以未经身份验证绑定的形式进行了简单连接。

9.4.2. 简单绑定和安全绑定

如果不允许匿名访问,用户必须对该目录进行身份验证,然后才能访问目录的内容。借助简单的密码身份验证,客户端通过发送可重复使用的密码向服务器进行身份验证。
例如,客户端使用绑定操作(其提供可区分名称和一组凭证)向 目录进行身份验证。服务器在目录中查找与客户端 DN 对应的条目,并检查客户端给出的密码是否与以该条目存储的值匹配。如果存在,服务器会验证客户端。如果没有,身份验证操作会失败,客户端会收到错误消息。
绑定 DN 通常与一个人的条目对应。但是,有些目录管理员发现,绑定作为组织条目而不是一个人很有用。目录需要绑定的条目是允许 userPassword 属性的对象类。这样可确保目录识别绑定 DN 和密码。
大多数 LDAP 客户端从用户隐藏绑定 DN,因为用户可能会发现要记住的 DN 字符的长字符串。当客户端尝试从用户隐藏绑定 DN 时,它使用绑定算法,例如:
  1. 用户输入唯一标识符,如用户 ID (例如 fchen)。
  2. LDAP 客户端应用搜索该标识符的目录,并返回相关的可分名称(如 uid=fchen,ou=people,dc=example,dc=com)。
  3. LDAP 客户端应用使用检索到的区分名称和用户提供的密码绑定到目录。
简单的密码身份验证提供了一种简单的方法来验证用户,但它需要安全使用额外的安全性。考虑将其用于组织内部网的情况。要通过外部网与业务合作伙伴之间的连接,或用于通过 Internet 与客户进行传输,最好需要安全(加密)连接。
注意
简单密码验证的缺陷是以纯文本形式发送密码。如果未授权用户正在侦听,这可能会破坏目录的安全性,因为该用户能够模仿授权用户。
nsslapd-require-secure-binds 配置属性需要使用 TLS 或 Start TLS 在安全连接中进行简单的密码身份验证。这会有效地加密纯文本密码,使其不能被黑客嗅探。
当使用 TLS 或 Start TLS 操作在 Directory 服务器和客户端应用程序之间建立安全连接时,客户端通过不以纯文本传输密码来执行一个简单的绑定,并带有额外的保护级别。nsslapd-require-secure-binds 配置属性需要通过安全连接进行简单的密码身份验证,即 TLS 或 Start TLS。此设置还支持其他安全连接,如 SASL 身份验证或基于证书的验证。
有关安全连接的详情请参考 第 9.9 节 “保护服务器连接”

9.4.3. 基于证书的身份验证

另一种形式的目录身份验证涉及使用数字证书绑定到目录。当用户首次访问密码时,该目录会提示用户输入密码。但是,密码不会与 目录中存储的密码不匹配,而是会打开用户的证书数据库。
如果用户提供正确的密码,目录客户端应用程序会从证书数据库获取身份验证信息。然后,客户端应用程序和目录使用此信息通过将用户的证书映射到目录 DN 来识别用户。目录允许或拒绝访问此身份验证过程中确定的目录 DN。
有关证书和 TLS 的更多信息,请参阅 管理指南

9.4.4. 代理身份验证

代理身份验证是一种特殊的身份验证形式,因为请求访问该目录的用户没有绑定到自己的 DN,而是使用 proxy DN
代理 DN 是一个实体,它有权执行用户请求的操作。将代理权限授予个人或应用程序时,他们被授予将任何 DN 指定为代理 DN 的权利,但目录管理器 DN 除外。
代理正确的一个主要优点是,可以启用 LDAP 应用程序,使用单一线程与单一绑定来服务对目录服务器的请求。客户端应用使用代理 DN 绑定到 Directory 服务器,而不是为每个用户绑定和验证。
代理 DN 在由客户端应用程序提交的 LDAP 操作中指定。例如:
ldapmodify -D "cn=Directory Manager" -W -x -D "cn=directory manager" -W -p 389 -h server.example.com -x -Y "cn=joe,dc=example,dc=com" -f mods.ldif
ldapmodify 命令为 manager 条目(cn=Directory Manager)提供名为 Joe (cn=joe)的权限,以在 mods.ldif 文件中应用修改。管理器不需要提供 Joe 的密码才能进行此更改。
注意
代理机制非常强大,必须完全使用。代理权限在 ACL 的范围内授予,无法限制哪些人被代理右边的输入模拟。也就是说,当用户被授予代理权限时,该用户能够为目标中的任何用户进行代理;无法将代理权限限制为仅限特定用户。
例如,如果实体具有对 dc=example,dc=com 树的代理权限,则该实体可以执行任何操作。因此,请确保在 DIT 的最低可能级别上设置代理 ACI。
有关此主题的更多信息,请参阅《 管理指南》中的"管理访问控制"一章中的"Proxied Authorization ACI 示例"一节

9.4.5. 直通身份验证

传递身份验证 时,任何身份验证请求从一个服务器转发到另一个服务。
例如,每当实例的所有配置信息都存储在另一个目录实例中时,Directory 服务器都会通过身份验证来进行 User Directory 服务器连接配置目录服务器。使用 PTA 插件处理目录服务器到目录服务器传递身份验证。

图 9.1. 简单的传递身份验证过程

简单的传递身份验证过程
对于 Unix 和 Linux 用户,许多系统已经有身份验证机制。最常用的验证框架之一就是 可插拔验证模块 (PAM)。由于许多网络已经有现有的身份验证服务,因此管理员可能希望继续使用这些服务。可将 PAM 模块配置为告知 Directory 服务器为 LDAP 客户端使用现有身份验证存储。
Red Hat Directory Server 中的 PAM 直通身份验证使用 PAM 传递身份验证插件,这使得目录服务器能够与 PAM 服务通信来验证 LDAP 客户端。

图 9.2. PAM 直通身份验证过程

PAM 直通身份验证过程
使用 PAM 传递身份验证时,当用户尝试绑定到 Directory 服务器时,凭证会转发到 PAM 服务。如果凭据与 PAM 服务中的信息匹配,用户可以成功绑定到 Directory 服务器,且所有 Directory 服务器访问控制限制和帐户设置都就位。
注意
目录服务器可以配置为使用 PAM,但无法使用它来 设置 PAM 以使用目录服务器进行身份验证。要使 PAM 使用 Directory 服务器实例进行身份验证,必须正确配置 pam_ldap 模块。有关 pam_ldap 的常规配置信息,请查看 man page (如 http://linux.die.net/man/5/pam_ldap)。
PAM 服务可使用 系统安全服务守护进程 (SSSD)等系统工具进行配置。SSSD 可以使用各种不同的身份提供程序,包括 Active Directory、Red Hat Directory Server 或其他目录,如 OpenLDAP 或本地系统设置。要使用 SSSD,只需将 PAM Pass-through Authentication 插件指向 SSSD 使用的 PAM 文件,默认为 /etc/pam.d/system-auth

9.4.6. 无密码验证

身份验证尝试评估,首先,用户帐户是否能够进行身份验证。帐户必须处于活跃状态,它不能被锁定,且必须根据适用的密码策略具有有效的密码(也就是说无法过期或需要重置)。
有时,对一个用户是否应该允许进行验证的评估需要被执行,但用户不应该实际被绑定到目录服务器。例如,系统可能使用 PAM 管理系统帐户,而 PAM 则配置为使用 LDAP 目录作为其身份存储。但是,该系统使用的是无密码凭证,如 SSH 密钥或 RSA 令牌,并且这些凭据无法传递给目录服务器。
Red Hat Directory Server 支持 Account Usability Extension Control for ldapsearches。这个控制会返回有关帐户状态和生效的任何密码策略的信息(例如,需要重置、密码过期警告或密码过期警告,或在密码过期后保留的宽限期数量)- 所有在绑定尝试中返回的信息,但不以该用户身份进行身份验证并绑定到目录服务器。这允许客户端根据 Directory 服务器设置和信息来确定用户是否应该被允许,但实际的身份验证过程是在目录服务器之外执行的。
此控制可用于如 PAM 等系统级服务,以允许免密码登录,这样仍使用 Directory 服务器存储身份,甚至控制帐户状态。
注意
默认可由 Directory Manager 使用帐户长度扩展控制。要允许其他用户使用控制,请在支持的控制条目 oid=1.3.6.1.4.1.42.2.27.9.5.8,cn=features,cn=config 上设置适当的 ACI。