22. 设置 LDAP 身份验证
本章介绍如何将 LDAP 身份验证与 AWX 集成。
注意
如果您要连接到的 LDAP 服务器具有自签名证书或由公司内部证书颁发机构 (CA) 签名的证书,则必须将 CA 证书添加到系统的受信任 CA 中。否则,连接到 LDAP 服务器将导致证书颁发者无法识别的错误。
管理员使用 LDAP 作为 AWX 用户帐户身份验证信息来源。提供用户身份验证,但不提供用户权限和凭据的同步。可以同步组织成员资格(以及组织管理员)和团队成员资格。
如果这样配置,则使用 LDAP 用户名和密码登录的用户会自动为其创建 AWX 帐户,并且可以自动将其放置到组织中,作为普通用户或组织管理员。
在用户界面中本地创建的用户优先于那些首次使用其他身份验证解决方案登录到控制器的用户。如果要使用其他身份验证方法(例如 LDAP)重新使用本地用户,则必须删除该用户。
通过 LDAP 登录创建的用户无法更改其用户名、名字、姓氏或为自己设置本地密码。您还可以配置此选项以限制其他字段名称的编辑。
要为 AWX 配置 LDAP 集成
首先,在 LDAP 中创建一个用户,该用户有权读取整个 LDAP 结构。
测试是否可以成功查询 LDAP 服务器,使用
ldapsearch
命令,这是一个可以在 AWX 命令行以及其他 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
实用程序不会自动与 AWX 预安装,但是,您可以从 openldap-clients
包中安装它。
在 AWX 用户界面中,从左侧导航栏中点击**设置**,然后点击从身份验证选项列表中选择**LDAP 设置**。
每个 LDAP 服务器不需要多个 LDAP 配置,但您可以在此页面上配置多个 LDAP 服务器,否则,将服务器保留为**默认**
等效的 API 端点将显示重复的
AUTH_LDAP_*
:AUTH_LDAP_1_*
、AUTH_LDAP_2_*
、…、AUTH_LDAP_5_*
以表示服务器名称。
要输入或修改要连接到的 LDAP 服务器地址,请点击**编辑**,然后使用与文本字段中预填充的地址相同的格式在**LDAP 服务器 URI**字段中输入。
注意
可以通过空格或逗号分隔每个地址来指定多个 LDAP 服务器。点击 图标以符合正确的语法和规则。
在**LDAP 绑定密码**文本字段中输入用于绑定用户的密码。在此示例中,密码为“passme”
从**LDAP 组类型**下拉菜单列表中点击选择组类型。
LDAP 组类型包括
PosixGroupType
GroupOfNamesType
GroupOfUniqueNamesType
ActiveDirectoryGroupType
OrganizationalRoleGroupType
MemberDNGroupType
NISGroupType
NestedGroupOfNamesType
NestedGroupOfUniqueNamesType
NestedActiveDirectoryGroupType
NestedOrganizationalRoleGroupType
NestedMemberDNGroupType
PosixUIDGroupType
通过利用底层的 django-auth-ldap 库 支持的 LDAP 组类型。要指定所选组类型的参数,请参阅下面的 步骤 15。
默认情况下,**LDAP Start TLS** 已禁用。要启用 LDAP 连接未使用 SSL/TLS 时的 TLS,请将切换按钮切换到**开启**。
在**LDAP 绑定 DN**文本字段中输入可分辨名称以指定 AWX 用于连接(绑定)到 LDAP 服务器的用户。下面使用示例
CN=josie,CN=users,DC=website,DC=com
如果该名称存储在密钥
sAMAccountName
中,则**LDAP 用户 DN 模板**将填充为(sAMAccountName=%(user)s)
。Active Directory 将用户名存储到sAMAccountName
中。类似地,对于 OpenLDAP,密钥为uid
,因此该行变为(uid=%(user)s)
。在**LDAP 要求组**字段中输入组可分辨名称,以允许该组内的用户访问 AWX,使用与文本字段中显示的格式相同的格式,
CN=awx Users,OU=Users,DC=website,DC=com
。
在**LDAP 拒绝组**字段中输入组可分辨名称,以阻止该组内的用户访问 AWX,使用与文本字段中显示的格式相同的格式。在此示例中,请保留该字段为空白。
在**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 下和包括在内的所有级别上的所有条目。
第三行指定存储用户名的密钥名称。
注意
对于多个搜索查询,正确的语法为
[
[
"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)"
]
第一行指定应搜索组的基本 DN。
第二行指定范围,与用户指令的范围相同。
第三行指定您正在使用的 LDAP 中组对象的
objectclass
是什么。
在**LDAP 用户属性映射**文本字段中输入用户属性。在此示例中,使用
{
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}
上面的示例从密钥 sn
检索用户的姓氏。您可以使用相同的 LDAP 查询来确定用户存储在哪些密钥下。
根据所选的**LDAP 组类型**,**LDAP 组类型参数**字段中提供了不同的参数来解决此问题。
LDAP_GROUP_TYPE_PARAMS
是一个字典,它将由 AWX 转换为 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 用户标志按组**文本字段中输入用户配置文件标志。在此示例中,使用以下语法将 LDAP 用户设置为“超级用户”和“审计员”
{
"is_superuser": "cn=superusers,ou=groups,dc=website,dc=com",
"is_system_auditor": "cn=auditors,ou=groups,dc=website,dc=com"
}
上面的示例检索其配置文件中标记为超级用户或审计员的用户。
有关完成映射字段的详细信息,请参阅 LDAP 组织和团队映射。
完成后,点击**保存**。
输入此表单上的这些值后,您现在可以使用 LDAP 成功进行身份验证。
注意
AWX 不会主动同步用户,但会在其初始登录期间创建用户。要提高与 LDAP 身份验证相关的性能,请参阅本章末尾的 LDAP 身份验证性能提示。
22.1. LDAP 组织和团队映射
您可以根据 LDAP 属性控制将哪些用户放置到哪些组织中(映射组织管理员/用户和 LDAP 组之间的关系)。
键是组织名称。如果不存在,将创建组织。值是定义每个组织成员资格选项的字典。对于每个组织,都可以指定哪些组是组织的自动用户,以及哪些组可以管理组织。
- admins:None、True/False、字符串或字符串列表/元组。
如果为None,则组织管理员不会根据 LDAP 值更新。
如果为True,则 LDAP 中的所有用户将自动添加为组织的管理员。
如果为False,则不会自动将任何 LDAP 用户添加为组织的管理员。
如果为字符串或字符串列表,则指定将添加到组织的组 DN(s),如果它们与任何指定的组匹配。
- 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(s)。如果用户是这些组中的任何一个的成员,则将其添加为团队成员。
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
}
}
22.2. 启用 LDAP 日志记录
要启用 LDAP 的日志记录,您必须在“设置”配置窗口中将级别设置为DEBUG
单击左侧导航窗格中的设置,然后单击以从系统选项列表中选择日志记录设置。
单击编辑。
将日志聚合器级别阈值字段设置为调试。
单击保存以保存更改。
22.3. 引用
如果查询的对象在其数据库中不可用,Active Directory 会使用“引用”。已注意到这在 django LDAP 客户端中无法正常工作,并且大多数情况下,禁用引用会有所帮助。通过将以下行添加到/etc/awx/conf.d/custom.py
文件中来禁用 LDAP 引用
AUTH_LDAP_GLOBAL_OPTIONS = { ldap.OPT_REFERRALS: False, }
22.4. LDAP 身份验证性能提示
当 LDAP 用户进行身份验证时,默认情况下,所有与用户相关的属性将在每次登录时更新到数据库中。在某些环境中,由于性能问题,可以跳过此操作。要避免这种情况,您可以禁用选项AUTH_LDAP_ALWAYS_UPDATE_USER。
警告
如果将此选项设置为 False,则不会更新 LDAP 用户属性的任何更改。属性仅在首次创建用户时更新。