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=EXAMPLE 和 dc=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 工具来添加身份映射方案。
- 添加身份映射方案。例如:
# 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 的子树搜索结果。 - 重启实例:
# dsctl instance_name restart
注意
使用 dsconf 添加 SASL 映射会添加到列表末尾的映射,而不考虑其 ASCII 顺序。
9.10.3.2. 使用 Web 控制台配置 SASL 身份映射
添加 SASL 身份映射方案:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 SASL Settings & Mappings。菜单,然后选择
- 单击。
- 填写表单。例如:
- 点击。
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