注意
如果您要连接到的 LDAP 服务器具有自签名证书或由公司内部证书颁发机构 (CA) 签名的证书,则必须将 CA 证书添加到系统的受信任 CA 中。否则,连接到 LDAP 服务器将导致证书颁发者未被识别的错误。
管理员使用 LDAP 作为 Tower 用户帐户身份验证信息的来源。提供用户身份验证,但不提供用户权限和凭据的同步。可以同步组织成员资格(以及组织管理员)和团队成员资格。
在配置后,使用 LDAP 用户名和密码登录的用户会自动为其创建 Tower 帐户,并且可以自动将其放置到组织中,作为普通用户或组织管理员。
通过 LDAP 登录创建的用户无法更改其用户名、姓氏、名字或为自己设置本地密码。这也可调,以限制对其他字段名的编辑。
要为 Tower 配置 LDAP 集成
首先,在 LDAP 中创建一个用户,该用户有权读取整个 LDAP 结构。
测试您是否可以成功查询 LDAP 服务器,使用 ldapsearch 命令,这是一个可以在 Tower 系统的命令行以及其他 Linux 和 OSX 系统上安装的命令行工具。使用以下命令查询 ldap 服务器,其中 josie 和 Josie4Cloud 被替换为适合您设置的属性
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 包安装它。
在 Ansible Tower 用户界面中,从设置 (
) 菜单屏幕点击身份验证。
Azure AD 选项卡最初默认显示。
选择LDAP 选项卡。
注意
您可以通过指定要配置的服务器来配置多个 LDAP 服务器(否则,将服务器保留在默认值)
等效的 API 端点将显示重复的 AUTH_LDAP_*:AUTH_LDAP_1_*,AUTH_LDAP_2_*,…,AUTH_LDAP_5_* 表示服务器名称。
在LDAP 服务器 URI 字段中输入要连接到的 LDAP 服务器地址,使用与文本字段中显示的地址相同的格式。以下是一个示例
在LDAP 绑定 DN 文本字段中输入可分辨名称,以指定 Tower 用于连接(绑定)到 LDAP 服务器的用户。以下使用示例 CN=josie,CN=users,DC=website,DC=com
在LDAP 绑定密码文本字段中输入用于绑定用户的密码。在本例中,密码为“passme”
如果该名称存储在密钥 sAMAccountName 中,则LDAP 用户 DN 模板将填充为 (sAMAccountName=%(user)s)。Active Directory 将用户名存储到 sAMAccountName。类似地,对于 OpenLDAP,密钥为 uid - 因此该行变为 (uid=%(user)s)。
点击从LDAP 组类型下拉菜单列表中选择组类型。
LDAP 组类型包括
PosixGroupType
GroupOfNamesType
GroupOfUniqueNamesType
ActiveDirectoryGroupType
OrganizationalRoleGroupType
MemberDNGroupType
NISGroupType
NestedGroupOfNamesType
NestedGroupOfUniqueNamesType
NestedActiveDirectoryGroupType
NestedOrganizationalRoleGroupType
NestedMemberDNGroupType
PosixUIDGroupTypeTower 支持的 LDAP 组类型利用底层的 django-auth-ldap 库。
每个LDAP 组类型可能会接受不同的参数。Tower 公开了
LDAP_GROUP_TYPE_PARAMS来解决这个问题。LDAP_GROUP_TYPE_PARAMS是一个字典,它将被 Tower 转换为 kwargs 并传递给所选的 LDAP 组类型类。任何 LDAP 组类型都使用两个常用参数;name_attr和member_attr。其中name_attr默认值为cn,而member_attr默认值为member{"name_attr": "cn", "member_attr": "member"}要确定特定 LDAP 组类型需要什么参数。请参阅有关类
init参数的 django_auth_ldap 文档。
在LDAP 要求组字段中输入组可分辨名称,以允许该组内的用户访问 Tower,使用与文本字段中显示的地址相同的格式。在本例中,使用:CN=Tower Users,OU=Users,DC=website,DC=com
在LDAP 拒绝组字段中输入组可分辨名称,以阻止该组内的用户访问 Tower,使用与文本字段中显示的地址相同的格式。在本例中,请保留该字段为空。
默认情况下,LDAP Start TLS 已禁用。若要启用 LDAP 连接在未使用 SSL 时启用 TLS,请将切换按钮切换至 ON。
在 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 的所有级别条目。
第三行指定存储用户名的位置。
注意
对于多个搜索查询,正确的语法为
[
[
"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)"
]
]
在 LDAP 组搜索 文本字段中,指定要搜索的组以及如何搜索它们。例如,使用
[
"dc=example,dc=com",
"SCOPE_SUBTREE",
"(objectClass=group)"
]
第一行指定应搜索组的 BASE DN。
第二行指定范围,与用户指令的范围相同。
第三行指定您正在使用的 LDAP 中组对象的 objectclass 是什么。
在 LDAP 用户属性映射 文本字段中输入用户属性。例如,使用
{
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}
上面的示例从键 sn 检索用户姓氏。您可以使用相同的 LDAP 查询来确定用户存储在哪些键下。
在 LDAP 用户组标志 文本字段中输入用户配置文件标志。例如,使用以下语法将 LDAP 用户设置为“超级用户”和“审计员”
{
"is_superuser": "cn=superusers,ou=groups,dc=website,dc=com",
"is_system_auditor": "cn=auditors,ou=groups,dc=website,dc=com"
}
上面的示例检索在其配置文件中被标记为超级用户或审计员的用户。
有关完成映射字段的详细信息,请参阅 LDAP 组织和团队映射。
完成后,单击 保存。
输入这些值后,您现在可以使用 LDAP 成功进行身份验证。
注意
Tower 不会主动同步用户,而是在用户首次登录时创建用户。若要提高与 LDAP 身份验证相关的性能,请参阅《Ansible Tower 用户指南》中的 ug_ldap_auth_perf_tips。
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 组织和团队映射。
若要启用 LDAP 日志记录,您必须在 Tower 设置配置窗口中将级别设置为 DEBUG
从左侧导航窗格中单击 设置 (
) 图标,然后选择 系统。
在系统配置页面中,单击 日志记录 选项卡。
向下滚动到页面底部,将 日志记录聚合器级别阈值 字段设置为 调试。
单击 保存 以保存您的更改。
接下来,您需要根据 LDAP 属性控制将哪些用户放置到哪些 Tower 组织中(将您的组织管理员/用户与 LDAP 组之间进行映射)。
键是组织名称。如果组织不存在,将创建组织。值是定义每个组织成员资格选项的字典。对于每个组织,可以指定哪些组自动成为该组织的用户,以及哪些组可以管理该组织。
如果为 None,则不会根据 LDAP 值更新组织管理员。
如果为 True,则 LDAP 中的所有用户将自动添加为该组织的管理员。
如果为 False,则不会将任何 LDAP 用户自动添加为该组织的管理员。
如果为字符串或字符串列表,则指定将添加为组织管理员的组 DN(如果它们与任何指定的组匹配)。
如果为 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 组之间的映射。键是团队名称(如果不存在,将创建)。值是每个团队成员资格选项的字典,其中每个字典可以包含以下参数
如果组织和团队名称的组合不存在,则将创建该团队。如果组织不存在,则首先创建组织。
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
}
}