21. 设置企业身份验证
本节介绍如何为以下企业系统设置身份验证
注意
对于 LDAP 身份验证,请参阅 设置 LDAP 身份验证。
Azure、RADIUS、SAML 和 TACACS+ 用户被归类为“企业”用户。以下规则适用于企业用户
企业用户只能通过从远程身份验证后端首次成功登录尝试创建。
如果在 AWX 中已创建了具有相同名称的非企业用户,则无法创建/身份验证企业用户。
如果启用了企业后端,企业用户的 AWX 密码应始终为空,任何用户都无法设置。
如果企业后端被禁用,则可以通过设置密码字段将企业用户转换为普通 AWX 用户。但是,此操作不可逆,因为转换后的 AWX 用户将不再被视为企业用户。
21.1. Azure AD 设置
要为 Microsoft Azure Active Directory (AD) 设置企业身份验证,您需要通过在 Azure 上的 https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app 注册您组织拥有的应用程序来获取 OAuth2 密钥和秘密。每个密钥和秘密都必须属于唯一的应用程序,并且不能在不同的身份验证后端之间共享或重复使用。为了注册应用程序,您必须为其提供网页 URL,即“设置身份验证”屏幕中显示的回调 URL。
从左侧导航栏中单击“设置”。
在“设置”窗口的左侧,从身份验证选项列表中单击“Azure AD 设置”。
“Azure AD OAuth2 回调 URL”字段已预先填充且不可编辑。注册应用程序后,Azure 将显示应用程序 ID 和对象 ID。
单击“编辑”,并将 Azure 的应用程序 ID 复制粘贴到“Azure AD OAuth2 密钥”字段中。
按照 Azure AD 的文档将您的应用程序连接到 Microsoft Azure Active Directory,将密钥(仅显示一次)提供给客户端进行身份验证。
将为您的 Azure AD 应用程序创建的实际秘密密钥复制粘贴到“设置 - 身份验证”屏幕的“Azure AD OAuth2 秘密”字段中。
有关完成映射字段的详细信息,请参阅 组织和团队映射。
完成后,单击“保存”。
要验证身份验证是否已正确配置,请退出 AWX,登录屏幕现在将显示 Microsoft Azure 徽标以允许使用这些凭据登录。
有关在 Azure AD 中注册应用程序的基础知识,请参阅 Azure AD 身份平台 (v2) 概述。
21.2. LDAP 身份验证
请参阅 设置 LDAP 身份验证 部分。
21.3. RADIUS 设置
AWX 可以配置为以 RADIUS 为中心源来使用身份验证信息。
从左侧导航栏中单击“设置”。
在“设置”窗口的左侧,从身份验证选项列表中单击“RADIUS 设置”。
单击“编辑”,并在“Radius 服务器”字段中输入 Radius 服务器的主机或 IP。如果此字段为空,则 RADIUS 身份验证将被禁用。
在接下来的两个字段中输入端口和密钥信息。
完成后,单击“保存”。
21.4. SAML 设置
SAML 允许在身份提供者 (IdP - 提供单点登录服务的服务器系统) 和服务提供者(在本例中为 AWX)之间交换身份验证和授权数据。AWX 可以配置为与 SAML 交谈以对 AWX 用户进行身份验证(创建/登录/注销)。用户团队和组织成员身份可以嵌入到对 AWX 的 SAML 响应中。
以下说明描述 AWX 作为服务提供者。
要设置 SAML 身份验证
从左侧导航栏中单击“设置”。
在“设置”窗口的左侧,从身份验证选项列表中单击“SAML 设置”。
“SAML 断言使用服务 (ACS) URL”和“SAML 服务提供者元数据 URL”字段已预先填充且不可编辑。请联系身份提供者管理员并提供这些字段中包含的信息。
单击“编辑”,并将“SAML 服务提供者实体 ID”设置为与“系统杂项设置”屏幕中“服务的基 URL”字段相同,方法是单击左侧导航栏中的“设置”。通过 API,可以在
/api/v2/settings/system
中的TOWER_URL_BASE
变量下查看它。实体 ID 可以设置为任何一个单独的 AWX 集群节点,但最佳实践是将其设置为服务提供者的 URL。确保基 URL 与负载均衡器(如果使用)的 FQDN 相匹配。
注意
基 URL 对于集群中的每个节点都不同。通常,负载均衡器会位于多个 AWX 集群节点的前面,以提供单个入口点,即 AWX 集群 FQDN。SAML 服务提供者必须能够建立出站连接并路由到在 SAML 服务提供者实体 ID 中设置的 AWX 集群节点或 AWX 集群 FQDN。例如,要将负载均衡器指向 AWX 集群,可以使用如下结构的 FQDN:awx.example.com。
在此示例中,服务提供者是 AWX 集群,因此,ID 设置为 AWX 集群 FQDN。
为 Ansible 集群创建一个服务器证书。通常,当配置 Ansible 集群时,AWX 节点将配置为仅处理 HTTP 流量,而负载均衡器将是 SSL 终止点。在这种情况下,负载均衡器需要 SSL 证书,而各个 AWX 集群节点不需要。可以为每个 AWX 节点启用或禁用 SSL,但在使用 SSL 终止的负载均衡器时应将其禁用。建议使用非过期的自签名证书以避免定期更新证书。这样,如果有人忘记更新证书,身份验证就不会失败。
注意
“SAML 服务提供者公钥”字段应包含整个证书,包括“—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”。
如果您在证书中使用 CA 捆绑包,请将整个捆绑包包含在此字段中。
以下是对公钥的示例
-----BEGIN CERTIFICATE——
... cert text ...
-----END CERTIFICATE——
创建可选的私钥供 AWX 用作服务提供者 (SP),并将它输入“SAML 服务提供者私钥”字段中。
以下是对私钥的示例
-----BEGIN PRIVATE KEY--
... key text ...
-----END PRIVATE KEY——
在 SSO 过程中,在“SAML 服务提供者组织信息”字段中向 IdP 提供有关 AWX 集群的一些详细信息。
{
"en-US": {
"url": "http://www.example.com",
"displayname": "Example",
"name": "example"
}
}
例如
注意
这些字段是正确配置 AWX 中的 SAML 所必需的。
在“SAML 服务提供者技术联系人”字段中向 IdP 提供技术联系信息。不要删除此字段的内容。
{
"givenName": "Some User",
"emailAddress": "[email protected]"
}
例如
在“SAML 服务提供者支持联系人”字段中向 IdP 提供支持联系信息。不要删除此字段的内容。
{
"givenName": "Some User",
"emailAddress": "[email protected]"
}
例如
在“已启用的 SAML 身份提供者”字段中,提供有关如何连接到每个列出的身份提供者的信息。AWX 在以下示例中期望以下 SAML 属性
Username(urn:oid:0.9.2342.19200300.100.1.1)
Email(urn:oid:0.9.2342.19200300.100.1.3)
FirstName(urn:oid:2.5.4.42)
LastName(urn:oid:2.5.4.4)
如果不知道这些属性,请将现有的 SAML 属性映射到 lastname、firstname、email 和 username。
为每个 IDp 配置所需的密钥
attr_user_permanent_id
- 用户的唯一标识符。可以将其配置为与从 IdP 发送的任何属性匹配。通常,如果将SAML:nameid
属性发送到 AWX 节点,则将其设置为name_id
,或者它可以是用户名属性,或者是一个自定义的唯一标识符。
entity_id
- 身份提供者管理员提供的实体 ID。管理员为 AWX 创建 SAML 配置文件,它会生成唯一的 URL。
url
- 当启用 SSO 时,AWX 将用户重定向到的单点登录 (SSO) URL。
x509_cert
- 由 IdP 管理员提供的证书,从身份提供者上创建的 SAML 配置文件中生成。删除--BEGIN CERTIFICATE--
和--END CERTIFICATE--
头部,然后将证书作为单个不间断字符串输入。支持多个 SAML IdP。某些 IdP 可能会使用与默认 OID 不同的属性名称提供用户数据 (https://github.com/omab/python-social-auth/blob/master/social/backends/saml.py)。SAML
NameID
是某些身份提供者用来告知服务提供者 (AWX 集群) 唯一用户标识符是什么的特殊属性。如果使用它,请将attr_user_permanent_id
设置为name_id
,如示例所示。其他属性名称可能会被覆盖,以适用于每个 IdP,如下所示。
{
"myidp": {
"entity_id": "https://idp.example.com",
"url": "https://myidp.example.com/sso",
"x509cert": ""
},
"onelogin": {
"entity_id": "https://app.onelogin.com/saml/metadata/123456",
"url": "https://example.onelogin.com/trust/saml2/http-post/sso/123456",
"x509cert": "",
"attr_user_permanent_id": "name_id",
"attr_first_name": "User.FirstName",
"attr_last_name": "User.LastName",
"attr_username": "User.email",
"attr_email": "User.email"
}
}
警告
不要创建与其他用户(包括非 SAML 用户)具有相同电子邮件的 SAML 用户。这样做会导致帐户合并。请注意,系统管理员用户也存在相同的行为,因此使用与系统管理员用户相同的电子邮件地址进行 SAML 登录将以系统管理员权限登录。为了将来参考,您可以根据 SAML 映射删除(或添加)管理员权限,如后续步骤中所述。
注意
IdP 使用众所周知的 SAML urn 提供电子邮件、姓氏和名字。IdP 使用自定义 SAML 属性来识别用户,这是一个 AWX 无法读取的属性。相反,AWX 可以理解唯一的标识符名称,即 URN。如以下示例所示,请在用户属性中使用 SAML“名称”属性中列出的 URN。
可以选择提供 **SAML 组织映射**。有关更多详细信息,请参阅 组织和团队映射。
可以配置 AWX 以查找包含团队和组织成员资格的特定属性,以便在用户登录 AWX 时将其与用户关联。属性名称在 **SAML 组织属性映射** 和 **SAML 团队属性映射** 字段中定义。
示例 SAML 组织属性映射
以下是一个示例 SAML 属性,该属性将用户组织成员资格嵌入到属性 member-of 中。
<saml2:AttributeStatement>
<saml2:Attribute FriendlyName="member-of" Name="member-of"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml2:AttributeValue>Engineering</saml2:AttributeValue>
<saml2:AttributeValue>IT</saml2:AttributeValue>
<saml2:AttributeValue>HR</saml2:AttributeValue>
<saml2:AttributeValue>Sales</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute FriendlyName="admin-of" Name="admin-of"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml2:AttributeValue>Engineering</saml2:AttributeValue>
</saml2:Attribute>
</saml2:AttributeStatement>
以下是相应的 AWX 配置。
{
"saml_attr": "member-of",
"saml_admin_attr": "admin-of",
"remove": true,
"remove_admins": false
}
saml_attr
:是可以在其中找到组织数组的 SAML 属性名称,并且 remove
设置为 **True** 以在将用户添加到组织列表之前将其从所有组织中删除。要将用户保留在他们所在的任何组织中,同时将其添加到 SAML 属性中的组织,请将 remove
设置为 **False**。
saml_admin_attr
:类似于 saml_attr
属性,但不是传达组织成员资格,而是传达管理员组织权限。
示例 SAML 团队属性映射
以下是一个包含团队成员资格列表的 SAML 属性的另一个示例。
<saml:AttributeStatement>
<saml:Attribute
xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
x500:Encoding="LDAP"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
FriendlyName="eduPersonAffiliation">
<saml:AttributeValue
xsi:type="xs:string">member</saml:AttributeValue>
<saml:AttributeValue
xsi:type="xs:string">staff</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
{
"saml_attr": "eduPersonAffiliation",
"remove": true,
"team_org_map": [
{
"team": "member",
"organization": "Default1"
},
{
"team": "staff",
"organization": "Default2"
}
]
}
saml_attr
:可以在其中找到团队数组的 SAML 属性名称。remove
:将remove
设置为 **True** 以在将用户添加到团队列表之前将其从所有团队中删除。要将用户保留在他们所在的任何团队中,同时将其添加到 SAML 属性中的团队,请将remove
设置为 **False**。team_org_map
:一个字典数组,形式为{ "team": "<AWX Team Name>", "organization": "<AWX Org Name>" }
,它定义了从 AWX 团队到 AWX 组织的映射。这是必需的,因为相同名称的团队可以在 AWX 中的多个组织中存在。如果没有此映射,将无法确定 SAML 属性中列出的团队所属的组织。
您可以在 **SAML 团队属性映射** 中创建一个别名来覆盖团队和组织。当 SAML 后端发送出复杂的组名时,此选项非常方便,例如以下示例
{
"remove": false,
"team_org_map": [
{
"team": "internal:unix:domain:admins",
"organization": "Default",
"team_alias": "Administrators"
},
{
"team": "Domain Users",
"organization_alias": "OrgAlias",
"organization": "Default"
}
],
"saml_attr": "member-of"
}
用户身份验证后,AWX 会按照预期创建组织和团队别名。
可以选择在 **SAML 团队映射** 字段中提供团队成员资格映射。有关更多详细信息,请参阅 组织和团队映射。
可以选择在 **SAML 安全配置** 字段中提供安全设置。此字段等效于 API 中的
SOCIAL_AUTH_SAML_SECURITY_CONFIG
字段。有关更多详细信息,请参阅 OneLogin 的 SAML Python 工具包。
当用户通过 SAML 登录时,AWX 使用 python-social-auth
库。此库依赖于 python-saml
库来提供以下两个可选字段的设置:**SAML 服务提供者额外配置数据** 和 **SAML IdP 到 EXTRA_DATA 属性映射**。
**SAML 服务提供者额外配置数据** 字段等效于 API 中的
SOCIAL_AUTH_SAML_SP_EXTRA
。请参阅 python-saml 库文档 以了解有效的服务提供者额外 (SP_EXTRA
) 参数。
**SAML IdP 到 EXTRA_DATA 属性映射** 字段等效于 API 中的
SOCIAL_AUTH_SAML_EXTRA_DATA
。有关更多信息,请参阅 Python 的 SAML 高级设置 文档。
**SAML 用户标记属性映射** 字段允许您将 SAML 角色和属性映射到特殊的用户标记。以下属性在此字段中有效
is_superuser_role
:指定一个或多个 SAML 角色,这些角色将授予用户超级用户标记。is_superuser_attr
:指定一个 SAML 属性,该属性将授予用户超级用户标记。is_superuser_value
:指定is_superuser_attr
所需的一个或多个值,该值是用户成为超级用户所必需的。remove_superusers
:一个布尔值,指示是否应该为用户删除超级用户标记。默认为true
。(有关更多详细信息,请参见下文)is_system_auditor_role
:指定一个或多个 SAML 角色,这些角色将授予用户系统审计员标记。is_system_auditor_attr
:指定一个 SAML 属性,该属性将授予用户系统审计员标记。is_system_auditor_value
:指定is_system_auditor_attr
所需的一个或多个值,该值是用户成为系统审计员所必需的。remove_system_auditors
:一个布尔值,指示是否应该为用户删除 system_auditor 标记。默认为true
。(有关更多详细信息,请参见下文)
role
和 value
字段是列表,并且是 或 逻辑。因此,如果您指定两个角色:[“Role 1”、“Role 2”] 并且 SAML 用户拥有任一角色,逻辑将认为他们拥有标记所需的该角色。这与 value
字段相同,如果您指定:[“Value 1”、“Value 2”] 并且 SAML 用户的属性拥有任一值,逻辑将认为他们的属性值已匹配。
如果为 superuser
或 system_auditor
都指定了 role
和 attr
,则 attr
的设置将优先于 role
。系统管理员和系统审计员角色在 SAML 用户登录时进行评估。如果您通过 UI 授予 SAML 用户这些角色之一,而不是通过 SAML 设置,则在用户下次登录时会从用户身上删除这些角色,除非 remove
标记设置为 false。如果 remove
标记为 false
,则 SAML 适配器将永远不允许从用户身上删除相应的标记。下表描述了逻辑的工作方式。
拥有一个或多个角色 |
拥有 Attr |
拥有一个或多个 Attr 值 |
Remove 标记 |
以前标记 |
已标记 |
---|---|---|---|---|---|
否 |
否 |
N/A |
是 |
否 |
否 |
否 |
否 |
N/A |
否 |
否 |
否 |
否 |
否 |
N/A |
是 |
是 |
否 |
否 |
否 |
N/A |
否 |
是 |
是 |
是 |
否 |
N/A |
是 |
否 |
是 |
是 |
否 |
N/A |
否 |
否 |
是 |
是 |
否 |
N/A |
是 |
是 |
是 |
是 |
否 |
N/A |
否 |
是 |
是 |
否 |
是 |
是 |
是 |
否 |
是 |
否 |
是 |
是 |
否 |
否 |
是 |
否 |
是 |
是 |
是 |
是 |
是 |
否 |
是 |
是 |
否 |
是 |
是 |
否 |
是 |
否 |
是 |
否 |
否 |
否 |
是 |
否 |
否 |
否 |
否 |
否 |
是 |
否 |
是 |
是 |
否 |
否 |
是 |
否 |
否 |
是 |
是 |
否 |
是 |
未设置 |
是 |
否 |
是 |
否 |
是 |
未设置 |
否 |
否 |
是 |
否 |
是 |
未设置 |
是 |
是 |
是 |
否 |
是 |
未设置 |
否 |
是 |
是 |
是 |
是 |
是 |
是 |
否 |
是 |
是 |
是 |
是 |
否 |
否 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
是 |
否 |
是 |
是 |
是 |
是 |
否 |
是 |
否 |
否 |
是 |
是 |
否 |
否 |
否 |
否 |
是 |
是 |
否 |
是 |
是 |
否 |
是 |
是 |
否 |
否 |
是 |
是 |
是 |
是 |
未设置 |
是 |
否 |
是 |
是 |
是 |
未设置 |
否 |
否 |
是 |
是 |
是 |
未设置 |
是 |
是 |
是 |
是 |
是 |
未设置 |
否 |
是 |
是 |
每次 SAML 用户向 AWX 进行身份验证时,都会执行这些检查并根据需要更改用户标记。如果在 UI 中为 SAML 用户设置了 System Administrator
或 System Auditor
,则 SAML 适配器将根据以上规则覆盖 UI 设置。如果您希望在 SAML 用户登录时不删除 SAML 用户的用户标记,可以将 remove_
标记设置为 false
。如果将 remove 标记设置为 false
,则通过 UI、API 或 SAML 适配器设置为 true
的用户标记将不会被删除。但是,如果用户没有该标记,并且以上规则确定应该添加该标记,则即使该标记为 false
,它也会被添加。
示例
{
"is_superuser_attr": "blueGroups",
"is_superuser_role": ["is_superuser"],
"is_superuser_value": ["cn=My-Sys-Admins,ou=memberlist,ou=mygroups,o=myco.com"],
"is_system_auditor_attr": "blueGroups",
"is_system_auditor_role": ["is_system_auditor"],
"is_system_auditor_value": ["cn=My-Auditors,ou=memberlist,ou=mygroups,o=myco.com"]
}
完成后,单击“保存”。
要验证身份验证是否配置正确,请将 **SAML 服务提供者元数据 URL** 中找到的自动生成的 URL 加载到浏览器中。它应该输出 XML 输出,否则表示配置不正确。
或者,退出 AWX,登录屏幕现在将显示 SAML 徽标,以指示它作为登录 AWX 的替代方法。
21.4.1. 透明 SAML 登录
要使透明登录正常工作,您必须首先使 IdP 发起的登录正常工作。要实现此目的
将 IdP 上的
RelayState
设置为之前描述的SAML Enabled Identity Providers
字段中 IdP 定义的键。在以上给出的示例中,RelayState
需要是myidp
或onelogin
。一旦此功能正常工作,请通过 **设置** 菜单的杂项身份验证设置窗口中的 **登录重定向覆盖 URL** 字段,将未登录用户的重定向 URL 指定为默认 AWX 登录页面以外的某个位置,该设置窗口可从左侧导航栏访问。这应该设置为
/sso/login/saml/?idp=<name-of-your-idp>
以实现透明 SAML 登录,如示例所示。
注意
以上是典型 IdP 格式的示例,但可能不适合您的特定情况。您可能需要联系您的 IdP 以获取正确的透明重定向 URL,因为该 URL 并非所有 IdP 都相同。
配置透明 SAML 登录后,要使用本地凭据或其他 SSO 登录,请直接访问
https://<your-awx-server>/login
。这将提供标准的 AWX 登录页面,包括 SSO 身份验证按钮,并允许您使用任何已配置的方法登录。
21.4.2. 启用 SAML 的日志记录
您可以以与启用 LDAP 的日志记录相同的方式启用 SAML 适配器的日志记录消息。请参阅 启用 LDAP 的日志记录 部分。
21.5. TACACS+ 设置
终端访问控制器访问控制系统 Plus (TACACS+) 是一种协议,它通过集中式服务器处理网络访问控制的远程身份验证和相关服务。特别是,TACACS+ 提供身份验证、授权和计费 (AAA) 服务,您可以在其中配置 AWX 以使用它作为身份验证来源。
注意
此功能已弃用,将在将来的版本中删除。
从左侧导航栏中单击“设置”。
在设置窗口的左侧,从身份验证选项列表中单击 **TACACs+ 设置**。
单击 **编辑** 并输入以下字段的信息
**TACACS+ 服务器**:提供要进行身份验证的 TACACS+ 服务器的主机名或 IP 地址。如果此字段留空,则 TACACS+ 身份验证将被禁用。
**TACACS+ 端口**:TACACS+ 默认使用端口 49,该端口已预先填充。
**TACACS+ 密钥**:TACACS+ 身份验证服务器的密钥。
**TACACS+ 身份验证会话超时**:以秒为单位的会话超时值。默认值为 5 秒。
**TACACS+ 身份验证协议**:TACACS+ 客户端使用的协议。选项为 **ascii** 或 **pap**。
完成后,单击“保存”。
21.6. 通用 OIDC 设置
与 SAML 类似,OpenID Connect (OIDC) 使用 OAuth 2.0 框架。它允许第三方应用程序验证身份并获取基本最终用户信息。OIDC 和 SAML 之间的主要区别在于 SAML 具有服务提供商 (SP) 到 IdP 的信任关系,而 OIDC 与用于获取安全令牌的通道 (HTTPS) 建立信任关系。要获取设置 AWX 与 OIDC 相需的凭据,请参阅您选择的具有 OIDC 支持的身份提供商 (IdP) 的文档。
要在 AWX 中配置 OIDC
从左侧导航栏中单击“设置”。
在设置窗口的左侧,从身份验证选项列表中单击 **通用 OIDC 设置**。
单击 **编辑** 并输入以下字段的信息
**OIDC 密钥**:来自您的第三方 IdP 的客户端 ID。
**OIDC 密钥**:来自您的 IdP 的客户端密钥。
**OIDC 提供商 URL**:您 OIDC 提供商的 URL。
**验证 OIDC 提供商证书**:使用切换按钮启用/禁用 OIDC 提供商 SSL 证书验证。
以下示例显示与 GitHub 作为通用 IdP 关联的特定值
完成后,单击“保存”。
注意
目前不支持 OIDC 的团队和组织映射。OIDC 适配器仅进行身份验证,而不进行授权。换句话说,它只能够验证该用户是否是他们自称的那个人,而不是授权该用户可以做什么。配置通用 OIDC 会创建附加了 ID/密钥的用户 ID,以区分来自两个不同来源的相同用户 ID,因此被视为不同的用户。因此,一个将获得仅包含用户名 ID,而第二个将是 username-<random number>
。
要验证身份验证是否配置正确,请退出 AWX,登录屏幕现在将显示 OIDC 徽标,以指示它作为登录 AWX 的替代方法。