文档

22. 设置 LDAP 身份验证

注意

如果您要连接到的 LDAP 服务器具有自签名证书或由公司内部证书颁发机构 (CA) 签名的证书,则必须将 CA 证书添加到系统的受信任 CA 中。否则,连接到 LDAP 服务器将导致证书颁发者未被识别的错误。

管理员使用 LDAP 作为 Tower 用户帐户身份验证信息的来源。提供用户身份验证,但不提供用户权限和凭据的同步。可以同步组织成员资格(以及组织管理员)和团队成员资格。

在配置后,使用 LDAP 用户名和密码登录的用户会自动为其创建 Tower 帐户,并且可以自动将其放置到组织中,作为普通用户或组织管理员。

通过 LDAP 登录创建的用户无法更改其用户名、姓氏、名字或为自己设置本地密码。这也可调,以限制对其他字段名的编辑。

要为 Tower 配置 LDAP 集成

  1. 首先,在 LDAP 中创建一个用户,该用户有权读取整个 LDAP 结构。

  2. 测试您是否可以成功查询 LDAP 服务器,使用 ldapsearch 命令,这是一个可以在 Tower 系统的命令行以及其他 Linux 和 OSX 系统上安装的命令行工具。使用以下命令查询 ldap 服务器,其中 josieJosie4Cloud 被替换为适合您设置的属性

ldapsearch -x  -H ldap://win -D "CN=josie,CN=Users,DC=website,DC=com" -b "dc=website,dc=com" -w Josie4Cloud

这里 CN=josie,CN=users,DC=website,DC=com 是连接用户的可分辨名称。

注意

ldapsearch 实用程序不会与 Ansible Tower 自动预安装,但是,您可以从 openldap-clients 包安装它。

  1. 在 Ansible Tower 用户界面中,从设置 (settings) 菜单屏幕点击身份验证

Azure AD 选项卡最初默认显示。

  1. 选择LDAP 选项卡。

注意

您可以通过指定要配置的服务器来配置多个 LDAP 服务器(否则,将服务器保留在默认值)

_images/configure-tower-auth-ldap-servers.png

等效的 API 端点将显示重复的 AUTH_LDAP_*AUTH_LDAP_1_*AUTH_LDAP_2_*,…,AUTH_LDAP_5_* 表示服务器名称。

  1. LDAP 服务器 URI 字段中输入要连接到的 LDAP 服务器地址,使用与文本字段中显示的地址相同的格式。以下是一个示例

_images/configure-tower-auth-ldap-server-uri.png
  1. LDAP 绑定 DN 文本字段中输入可分辨名称,以指定 Tower 用于连接(绑定)到 LDAP 服务器的用户。以下使用示例 CN=josie,CN=users,DC=website,DC=com

_images/configure-tower-auth-ldap-bind-dn.png
  1. LDAP 绑定密码文本字段中输入用于绑定用户的密码。在本例中,密码为“passme”

_images/configure-tower-auth-ldap-bind-pwd.png
  1. 如果该名称存储在密钥 sAMAccountName 中,则LDAP 用户 DN 模板将填充为 (sAMAccountName=%(user)s)。Active Directory 将用户名存储到 sAMAccountName。类似地,对于 OpenLDAP,密钥为 uid - 因此该行变为 (uid=%(user)s)

  2. 点击从LDAP 组类型下拉菜单列表中选择组类型。

LDAP 组类型包括

  • PosixGroupType

  • GroupOfNamesType

  • GroupOfUniqueNamesType

  • ActiveDirectoryGroupType

  • OrganizationalRoleGroupType

  • MemberDNGroupType

  • NISGroupType

  • NestedGroupOfNamesType

  • NestedGroupOfUniqueNamesType

  • NestedActiveDirectoryGroupType

  • NestedOrganizationalRoleGroupType

  • NestedMemberDNGroupType

  • PosixUIDGroupType

Tower 支持的 LDAP 组类型利用底层的 django-auth-ldap 库

每个LDAP 组类型可能会接受不同的参数。Tower 公开了 LDAP_GROUP_TYPE_PARAMS 来解决这个问题。 LDAP_GROUP_TYPE_PARAMS 是一个字典,它将被 Tower 转换为 kwargs 并传递给所选的 LDAP 组类型类。任何 LDAP 组类型都使用两个常用参数; name_attrmember_attr。其中 name_attr 默认值为 cn,而 member_attr 默认值为 member

{"name_attr": "cn", "member_attr": "member"}

要确定特定 LDAP 组类型需要什么参数。请参阅有关类 init 参数的 django_auth_ldap 文档。

  1. LDAP 要求组字段中输入组可分辨名称,以允许该组内的用户访问 Tower,使用与文本字段中显示的地址相同的格式。在本例中,使用:CN=Tower Users,OU=Users,DC=website,DC=com

_images/configure-tower-auth-ldap-req-group.png
  1. LDAP 拒绝组字段中输入组可分辨名称,以阻止该组内的用户访问 Tower,使用与文本字段中显示的地址相同的格式。在本例中,请保留该字段为空。

  2. 默认情况下,LDAP Start TLS 已禁用。若要启用 LDAP 连接在未使用 SSL 时启用 TLS,请将切换按钮切换至 ON

_images/configure-tower-auth-ldap-start-tls.png
  1. LDAP 用户搜索 字段中输入在身份验证期间搜索用户的路径,使用与文本字段中显示的相同格式。例如,使用

[
"OU=Users,DC=website,DC=com",
"SCOPE_SUBTREE",
"(cn=%(user)s)"
]

第一行指定在 LDAP 树中搜索用户的路径。在上面的示例中,从 DC=website,DC=com 开始递归搜索用户。

第二行指定搜索用户的范围

  • SCOPE_BASE:此值用于指示仅搜索基本 DN 处的条目,仅返回该条目。

  • SCOPE_ONELEVEL:此值用于指示搜索基本 DN 下的一级条目 - 但不包括基本 DN 也不包括基本 DN 下一级的所有条目。

  • SCOPE_SUBTREE:此值用于指示搜索指定基本 DN 下及包括指定基本 DN 的所有级别条目。

第三行指定存储用户名的位置。

_images/configure-tower-authen-ldap-user-search.png

注意

对于多个搜索查询,正确的语法为

[
  [
  "OU=Users,DC=northamerica,DC=acme,DC=com",
  "SCOPE_SUBTREE",
  "(sAMAccountName=%(user)s)"
  ],
  [
  "OU=Users,DC=apac,DC=corp,DC=com",
  "SCOPE_SUBTREE",
  "(sAMAccountName=%(user)s)"
  ],
  [
  "OU=Users,DC=emea,DC=corp,DC=com",
  "SCOPE_SUBTREE",
  "(sAMAccountName=%(user)s)"
  ]
]
  1. LDAP 组搜索 文本字段中,指定要搜索的组以及如何搜索它们。例如,使用

 [
"dc=example,dc=com",
"SCOPE_SUBTREE",
"(objectClass=group)"
 ]
  • 第一行指定应搜索组的 BASE DN。

  • 第二行指定范围,与用户指令的范围相同。

  • 第三行指定您正在使用的 LDAP 中组对象的 objectclass 是什么。

_images/configure-tower-authen-ldap-group-search.png
  1. LDAP 用户属性映射 文本字段中输入用户属性。例如,使用

{
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}

上面的示例从键 sn 检索用户姓氏。您可以使用相同的 LDAP 查询来确定用户存储在哪些键下。

_images/configure-tower-auth-ldap-user-attrb-map.png
  1. LDAP 用户组标志 文本字段中输入用户配置文件标志。例如,使用以下语法将 LDAP 用户设置为“超级用户”和“审计员”

{
"is_superuser": "cn=superusers,ou=groups,dc=website,dc=com",
"is_system_auditor": "cn=auditors,ou=groups,dc=website,dc=com"
}

上面的示例检索在其配置文件中被标记为超级用户或审计员的用户。

_images/configure-tower-auth-ldap-user-flags.png
  1. 有关完成映射字段的详细信息,请参阅 LDAP 组织和团队映射

  2. 完成后,单击 保存

输入这些值后,您现在可以使用 LDAP 成功进行身份验证。

注意

Tower 不会主动同步用户,而是在用户首次登录时创建用户。若要提高与 LDAP 身份验证相关的性能,请参阅《Ansible Tower 用户指南》中的 ug_ldap_auth_perf_tips

22.1. 转介

Active Directory 在查询的对象在其数据库中不可用时使用“转介”。已注意到这在 django LDAP 客户端中无法正常工作,并且大多数情况下,禁用转介会有所帮助。通过将以下行添加到 /etc/tower/conf.d/custom.py 文件中,禁用 LDAP 转介

AUTH_LDAP_GLOBAL_OPTIONS = {
    ldap.OPT_REFERRALS: False,
}

注意

在 Ansible Tower 2.4.3 及更高版本中,默认情况下禁用“转介”。如果您运行的是早期版本的 Tower,则应考虑将此参数添加到您的配置文件中。

有关完成映射字段的详细信息,请参阅 LDAP 组织和团队映射

22.2. 启用 LDAP 日志记录

若要启用 LDAP 日志记录,您必须在 Tower 设置配置窗口中将级别设置为 DEBUG

  1. 从左侧导航窗格中单击 设置 (settings) 图标,然后选择 系统

  2. 在系统配置页面中,单击 日志记录 选项卡。

  3. 向下滚动到页面底部,将 日志记录聚合器级别阈值 字段设置为 调试

_images/settings-system-logging-debug.png
  1. 单击 保存 以保存您的更改。

22.3. LDAP 组织和团队映射

接下来,您需要根据 LDAP 属性控制将哪些用户放置到哪些 Tower 组织中(将您的组织管理员/用户与 LDAP 组之间进行映射)。

键是组织名称。如果组织不存在,将创建组织。值是定义每个组织成员资格选项的字典。对于每个组织,可以指定哪些组自动成为该组织的用户,以及哪些组可以管理该组织。

admins:None、True/False、字符串或字符串列表/元组。
  • 如果为 None,则不会根据 LDAP 值更新组织管理员。

  • 如果为 True,则 LDAP 中的所有用户将自动添加为该组织的管理员。

  • 如果为 False,则不会将任何 LDAP 用户自动添加为该组织的管理员。

  • 如果为字符串或字符串列表,则指定将添加为组织管理员的组 DN(如果它们与任何指定的组匹配)。

remove_admins:True/False。默认为 False
  • 如果为 True,则不是给定组成员的用户将从组织的管理员列表中删除。

users:None、True/False、字符串或字符串列表/元组。与 admins 相同的规则适用。

remove_users:True/False。默认为 False。与 remove_admins 相同的规则适用。

{
"LDAP Organization": {
  "admins": "cn=engineering_admins,ou=groups,dc=example,dc=com",
  "remove_admins": false,
  "users": [
    "cn=engineering,ou=groups,dc=example,dc=com",
    "cn=sales,ou=groups,dc=example,dc=com",
    "cn=it,ou=groups,dc=example,dc=com"
  ],
  "remove_users": false
},
"LDAP Organization 2": {
  "admins": [
    "cn=Administrators,cn=Builtin,dc=example,dc=com"
  ],
  "remove_admins": false,
  "users": true,
  "remove_users": false
}
}

团队成员(用户)与 LDAP 组之间的映射。键是团队名称(如果不存在,将创建)。值是每个团队成员资格选项的字典,其中每个字典可以包含以下参数

organization:字符串。团队所属的组织名称。

如果组织和团队名称的组合不存在,则将创建该团队。如果组织不存在,则首先创建组织。

users:None、True/False、字符串或字符串列表/元组。

  • 如果为 None,则不会更新团队成员。

  • 如果为 True/False,则所有 LDAP 用户将添加/删除为团队成员。

  • 如果为字符串或字符串列表,则指定组 DN。如果用户是这些组中的 ANY 的成员,则将用户添加为团队成员。

remove:True/False。默认为 False。如果为 True,则不是给定组成员的用户将从团队中删除。

{
"LDAP Engineering": {
  "organization": "LDAP Organization",
  "users": "cn=engineering,ou=groups,dc=example,dc=com",
  "remove": true
},
"LDAP IT": {
  "organization": "LDAP Organization",
  "users": "cn=it,ou=groups,dc=example,dc=com",
  "remove": true
},
"LDAP Sales": {
  "organization": "LDAP Organization",
  "users": "cn=sales,ou=groups,dc=example,dc=com",
  "remove": true
}
}