9.10. 设置 SASL 身份映射

简单身份验证和安全层 (SASL)是 LDAP 和身份验证方法(如 GSS-API)之间的抽象层,它允许任何与 SASL 交互的协议利用任何可以使用 SASL 的验证机制。简单地说,SASL 是一个中间的,它可让您更轻松地使用不同机制对应用程序进行身份验证。SASL 还可以用于在客户端和服务器之间建立加密的会话。
SASL 框架允许不同的机制向服务器验证用户,具体取决于客户端和服务器应用程序中启用了哪些机制。SASL 也为加密(安全)会话创建一个层。使用 GSS-API,Directory 服务器使用 Kerberos 票据来验证会话和加密数据。

9.10.1. 关于 SASL 身份映射

在处理 SASL 绑定请求时,服务器匹配或映射,用于使用存储在服务器中的 LDAP 条目向目录服务器进行身份验证的 SASL 身份验证 ID。使用 Kerberos 时,SASL 用户 ID 通常格式为 userid@REALM,如 scarter@EXAMPLE.COM。此 ID 必须转换为用户的目录服务器条目的 DN,如 uid=scarter,ou=body,dc=example,dc=com
如果身份验证 ID 与个人的 LDAP 条目明确对应,则可以配置目录服务器,以自动将身份验证 ID 自动映射到条目 DN。目录服务器具有一些预配置的默认映射,它们处理大多数常见配置,并可创建自定义映射。默认情况下,在绑定尝试期间,如果没有启用 SASL 映射回退,则只应用第一个匹配的映射规则。有关 SASL 映射回退的详情,请参阅 第 9.10.4 节 “启用 SASL 映射 Fallback”
务必配置 SASL 映射,以便只有一个映射规则与身份验证字符串匹配。
SASL 映射由容器条目下的条目配置:
dn: cn=sasl,cn=config
objectClass: top
objectClass: nsContainer
cn: sasl
SASL 身份映射条目是此条目的子项:
dn: cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsContainer
cn: mapping
映射条目由以下属性定义:
  • nsSaslMapRegexString :用于映射提供的 authid 元素的正则表达式。
  • nsSaslMapFilterTemplate :应用 nsSaslMapRegexString 元素的模板来创建 DN。
  • nsSaslMapBaseDNTemplate :提供搜索基础或特定条目 DN,以匹配构建的 DN。
  • 可选: nsSaslMapPriority: 设置此 SASL 映射的优先级。如果使用优先级值,如果 cn=config 中启用了 nsslapd-sasl-mapping-fallback。详情请查看 第 9.10.4.1 节 “设置 SASL 映射优先级”
例如:
dn: cn=mymap,cn=mapping,cn=sasl,cn=config
objectclass:top
objectclass:nsSaslMapping
cn: mymap
nsSaslMapRegexString: \(.*\)@\(.*\)\.\(.*\)
nsSaslMapFilterTemplate: (objectclass=inetOrgPerson)
nsSaslMapBaseDNTemplate: uid=\1,ou=people,dc=\2,dc=\3
nsSaslMapRegexString 属性设置形式 \1\2\3 用于绑定 ID 的变量,用于在搜索过程中填充到模板属性的绑定 ID。本例为 ou=People,dc=example,dc=com 子树中的任何用户设置 SASL 身份映射,它们属于 inetOrgPerson 对象类。
当目录服务器收到一个 SASL 绑定请求,mconnors@EXAMPLE.COM 为用户 ID (authid),正则表达式会填充基本 DN 模板,带有 uid=mconnors,ou=people,dc=EXAMPLE,dc=COM 作为用户 ID,并从此进行身份验证。
注意
dc 值不区分大小写,因此 dc=EXAMPLEdc=example 相同。
目录服务器也可以使用更包含的映射方案,例如:
dn: cn=example map,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: example map
nsSaslMapRegexString: \(.*\)
nsSaslMapBaseDNTemplate: ou=People,dc=example,dc=com
nsSaslMapFilterTemplate: (cn=\1)
这与任何用户 ID 匹配,并将其映射到 ou=People,dc=example,dc=com 子树下的条目,该子树满足过滤器 cn=userId
通过在 nsSaslMapRegexString 属性中指定域,可以将映射限制为单个域。例如:
dn: cn=example map,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: example map
nsSaslMapRegexString: \(.*\)@US.EXAMPLE.COM   
nsSaslMapBaseDNTemplate: ou=People,dc=example,dc=com
nsSaslMapFilterTemplate: (cn=\1)
此映射与之前的映射相同,但它只适用于从 US.EXAMPLE.COM 域验证的用户。(在 第 9.11.2.1 节 “关于主体和 Realms” 中描述了域)。
当服务器连接到另一个服务器时,如在复制或链过程中,的默认映射不会正确映射身份。这是因为,一个服务器的主体(SASL 身份)与进行身份验证的服务器上的主体(SASL 身份)不匹配,因此它与映射条目不匹配。
要允许服务器使用 SASL 进行服务器身份验证,为特定服务器主体创建映射到特定用户条目的映射。例如,此映射将 ldap1.example.com 服务器与 cn=replication 管理器cn=config 条目匹配。映射条目本身是在第二个服务器上创建的,如 ldap2.example.com
dn: cn=z,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: z
nsSaslMapRegexString: ldap/ldap1.example.com@EXAMPLE.COM
nsSaslMapBaseDNTemplate: cn=replication manager,cn=config
nsSaslMapFilterTemplate: (objectclass=*)
有时,域名称不包含在 SASL GSS-API 配置中的主体名称中。可以创建与第一个映射相同的第二个映射,只需在主体名称中指定域。例如:
dn: cn=y,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: y
nsSaslMapRegexString: ldap/ldap1.example.com
nsSaslMapBaseDNTemplate: cn=replication manager,cn=config
nsSaslMapFilterTemplate: (objectclass=*)
由于未指定 realm,因此第二个映射更为通用(表示,它可能与第一个条目匹配更多条目)。最佳实践是首先通过更常规映射处理更具体的映射和逐步进度。
如果没有使用 nsSaslMapPriority 参数为 SASL 映射设置优先级,则无法指定处理映射的顺序。但是,可以控制如何处理 SASL 映射:名称。目录服务器以反向 ASCII 顺序处理 SASL 映射。在过去两个示例中,首先处理 cn=z 映射(第一个示例)。如果没有匹配项,服务器会处理 cn=y 映射(第二个示例)。
注意
在静默安装过程中创建实例时,可以添加 SASL 映射,方法是在 LDIF 文件中指定映射并使用 ConfigFile 指令添加 LDIF 文件。安装指南 中描述了使用静默安装。

9.10.2. 目录服务器的默认 SASL 映射

目录服务器具有预定义的 SASL 映射规则,用于处理一些最常见的用法。

Kerberos UID 映射

这匹配使用两个部分域的 Kerberos 主体,如用户@example.com。然后 realm 用于定义搜索基础,并且用户 ID (authid)定义过滤器。搜索基础为 dc=example,dc=com,以及 (uid=user) 的过滤器。

dn: cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: Kerberos uid mapping
nsSaslMapRegexString: \(.*\)@\(.*\)\.\(.*\)
nsSaslMapBaseDNTemplate: dc=\2,dc=\3
nsSaslMapFilterTemplate: (uid=\1)

RFC 2829 DN Syntax

此映射与作为有效 DN (在 RFC 2829 中定义)的 authid 匹配,前缀为 dn:authid 直接映射到指定的 DN。

dn: cn=rfc 2829 dn syntax,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: rfc 2829 dn syntax
nsSaslMapRegexString: ^dn:\(.*\)
nsSaslMapBaseDNTemplate: \1
nsSaslMapFilterTemplate: (objectclass=*)

RFC 2829 U Syntax

映射会匹配 UID 前缀为 u:authid 。前缀后指定的值定义了 (uid=value) 的过滤器。搜索基础被硬编码为 默认用户Root 数据库的后缀。

dn: cn=rfc 2829 u syntax,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: rfc 2829 u syntax
nsSaslMapRegexString: ^u:\(.*\)
nsSaslMapBaseDNTemplate: dc=example,dc=com
nsSaslMapFilterTemplate: (uid=\1)

UID 映射

此映射与 authid 匹配,这是不匹配其他默认映射规则的普通字符串。它使用这个值来定义 (uid=value) 的过滤器。搜索基础被硬编码为 默认用户Root 数据库的后缀。

dn: cn=uid mapping,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: uid mapping
nsSaslMapRegexString: ^[^:@]+$
nsSaslMapBaseDNTemplate: dc=example,dc=com
nsSaslMapFilterTemplate: (uid=&)

9.10.3. 配置 SASL 身份映射

(简单身份验证和安全层)SASL 身份映射可以从 Directory 服务器或命令行进行配置。要使 SASL 身份映射可用于 SASL 身份验证,映射必须返回一个,且只能返回匹配的条目,并且必须在主机上配置 Kerberos 条目。

9.10.3.1. 使用命令行配置 SASL 身份映射

要从命令行配置 SASL 身份映射,请使用 dsconf 工具来添加身份映射方案。
  1. 添加身份映射方案。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com sasl create --cn "example_map" --nsSaslMapRegexString "\(.*\)" --nsSaslMapBaseDNTemplate "ou=People,dc=example,dc=com" --nsSaslMapFilterTemplate "(cn=\1)" --nsSaslMapPriority 50
    Successfully created example_map
    这与任何用户的通用名称匹配,并根据过滤器 cn=userId 将其映射到带有 base ou=People,dc=example,dc=com 的子树搜索结果。
  2. 重启实例:
    # dsctl instance_name restart
注意
使用 dsconf 添加 SASL 映射会添加到列表末尾的映射,而不考虑其 ASCII 顺序。

9.10.3.2. 使用 Web 控制台配置 SASL 身份映射

添加 SASL 身份映射方案:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 SASL Settings & Mappings
  4. 单击 Create New Mapping
  5. 填写表单。例如:
  6. 点击 Save

9.10.4. 启用 SASL 映射 Fallback

使用默认设置,Directory 服务器只验证第一个匹配的 SASL 映射。如果这个第一个匹配映射失败,绑定操作会失败,且不会验证进一步匹配的映射。
但是,您可以通过启用 nsslapd-sasl-mapping-fallback 参数,将目录服务器配置为验证所有匹配的映射:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-sasl-mapping-fallback=on
Successfully replaced "nsslapd-sasl-mapping-fallback"
如果启用了回退,且只返回一个用户身份,绑定会成功。如果没有用户,或者返回多个用户,绑定会失败。

9.10.4.1. 设置 SASL 映射优先级

如果您使用 nsslapd-sasl-mapping-fallback 属性启用了 SASL 映射回退,您可以选择在映射配置中设置 nsSaslMapPriority 属性来优先排序它们。nsSaslMapPriority 属性支持从 1 (最高优先级) 到 100 (最低优先级) 的值。默认值为 100
例如,要为 cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config 映射设置最高优先级:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config
changetype: modify
replace: nsSaslMapPriority
nsSaslMapPriority: 1