Documentation

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 是连接的用户的可辨识名称。

注解

Ansible Tower 不会自动预安装 ldapsearch 工具程序,您可以从 openldap-clients 软件包中安装它。

  1. 在 Ansible Tower 用户界面中,从 Settings (settings) 菜单屏幕中点击 Authentication

在默认情况下,最初会显示 Azure AD 标签页。

  1. 选择 LDAP 选项卡。

注解

您可以通过指定要配置的服务器来配置多个 LDAP 服务器(否则,使服务器保留为 Default):

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

等同的 API 端点将显示 AUTH_LDAP_* 重复:AUTH_LDAP_1_*AUTH_LDAP_2_*、......、AUTH_LDAP_5_* 用于表示服务器的名称。

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

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

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

_images/configure-tower-auth-ldap-bind-pwd.png
  1. 如果该名称存储在键 sAMAccountName 中,则**LDAP User DN Template** 使用 (sAMAccountName=%(user)s) 填充。Active Directory 将用户名保存到 sAMAccountName。同样,对于 OpenLDAP,键是 uid,行变为 (uid=%(user)s)

  2. 点击以从 LDAP Group Type 下拉菜单中选择组类型。

LDAP 组类型包括:

  • PosixGroupType

  • GroupOfNamesType

  • GroupOfUniqueNamesType

  • ActiveDirectoryGroupType

  • OrganizationalRoleGroupType

  • MemberDNGroupType

  • NISGroupType

  • NestedGroupOfNamesType

  • NestedGroupOfUniqueNamesType

  • NestedActiveDirectoryGroupType

  • NestedOrganizationalRoleGroupType

  • NestedMemberDNGroupType

  • PosixUIDGroupType

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

每个 LDAP Group Type 都可能采用不同的参数。因此 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 Require Group 字段中输入组可辨识名称以允许该组中的用户访问 Tower,使用的格式与文本字段中显示的格式相同。在本例中,请使用:CN=Tower Users,OU=Users,DC=website,DC=com

_images/configure-tower-auth-ldap-req-group.png
  1. LDAP Deny Group 字段中输入组可辨识名称以防止该组中的用户访问 Tower,使用的格式与文本字段中显示的格式相同。在本例中,将该字段留空。

  2. LDAP Start TLS 默认禁用。当 LDAP 连接未使用 SSL 时,若要启用 TLS,请点击切换到 ON

_images/configure-tower-auth-ldap-start-tls.png
  1. LDAP USER SEARCH 字段中输入在身份验证时搜索用户的位置,使用的格式与文本字段中显示的格式相同。在本例中,使用:

[
"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。

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

_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 Group Search 文本字段中,指定应当搜索哪些组以及如何搜索它们。在本例中,使用:

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

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

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

_images/configure-tower-authen-ldap-group-search.png
  1. LDAP User Attribute Map 文本字段中输入用户属性。在本例中,使用:

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

上面的示例按姓从键 sn 中检索用户。您可以对用户使用相同的 LDAP 查询,以找出他们存储在哪些键下。

_images/configure-tower-auth-ldap-user-attrb-map.png
  1. LDAP User Flags by Group 文本字段中输入用户配置集标志。在本例中,使用以下语法将 LDAP 用户设置为“Superusers”和“Auditors”:

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

上例检索在其配置集中标记为 superusers 或 auditor 的用户。

_images/configure-tower-auth-ldap-user-flags.png
  1. 如需完成映射字段的详情,请参阅 LDAP 机构和团队映射

  2. 完成后请点击 Save

使用此表单上输入的这些值,您现在可以通过 LDAP 进行成功身份验证。

注解

Tower 不会主动同步用户,而是在首次登录过程中创建用户。要提高与 LDAP 身份验证关联的性能请参阅 :ref:中的`ug_ldap_auth_perf_tips` Ansible Tower User Guide

22.1. 引用

当查询对象不存在于数据库中时,Active Directory 将使用“引用(referral)”。此项不适用于 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 (settings) 图标并选择 System

  2. 从系统配置页面中,点击 Logging 选项卡。

  3. 滚动到底部,将 Logging Aggregator Level Threshold 字段设置为 Debug

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

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。如果用户是这些组中任意组的成员,则用户将添加为团队成员。

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
}
}