文档

21. 设置企业身份验证

本节介绍如何为以下企业系统设置身份验证

注意

有关 LDAP 身份验证,请参阅设置 LDAP 身份验证.

SAML、RADIUS 和 TACACS+ 用户被归类为“企业”用户。以下规则适用于企业用户

  • 企业用户只能通过从远程身份验证后端进行的第一次成功登录尝试创建。

  • 如果 Tower 中已创建具有相同名称的非企业用户,则无法创建/验证企业用户。

  • 如果启用了企业后端,则企业用户的 Tower 密码应始终为空,并且任何用户都无法设置。

  • 如果禁用了企业后端,则可以通过设置密码字段将企业用户转换为普通 Tower 用户。但是,此操作是不可逆的,因为转换后的 Tower 用户将不再被视为企业用户。

21.1. Azure Active Directory (AD)

要为 Microsoft Azure Active Directory (AD) 设置企业身份验证,您需要通过在 Azure 中的https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app注册您的组织拥有的应用程序来获取 OAuth2 密钥和秘密。每个密钥和秘密都必须属于唯一的应用程序,并且不能在不同的身份验证后端之间共享或重复使用。为了注册应用程序,您必须为其提供网页 URL,即在配置 Tower 用户界面中显示的回调 URL。

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

  1. 如果它不是默认视图,请选择**Azure AD** 选项卡。

_images/configure-tower-auth-azure-select.png
  1. **Azure AD OAuth2 回调 URL** 字段已预先填充且不可编辑。

注册应用程序后,Azure 会显示应用程序 ID 和对象 ID。

  1. 将 Azure 的应用程序 ID 复制并粘贴到**Azure AD OAuth2 密钥**字段中。

按照 Azure AD 文档连接您的应用程序到 Microsoft Azure Active Directory,向客户端提供密钥(仅显示一次)以进行身份验证。

  1. 将为您的 Azure AD 应用程序创建的实际秘密密钥复制并粘贴到配置 Tower - 身份验证屏幕的**Azure AD OAuth2 秘密**字段中。

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

  3. 完成后,点击**保存**。

  4. 要验证身份验证是否已正确配置,请退出 Ansible Tower,登录屏幕现在将显示 Microsoft Azure 徽标,允许使用这些凭据登录。

_images/configure-tower-auth-azure-logo.png

有关 Azure AD 中的应用程序注册基础知识,请参阅Azure AD 身份平台 (v2)概述。

21.2. LDAP 身份验证

请参阅设置 LDAP 身份验证部分。

21.3. RADIUS 身份验证设置

Ansible Tower 可以配置为以集中方式使用 RADIUS 作为身份验证信息的来源。

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

默认情况下,Azure AD 选项卡最初显示。

  1. 选择**Radius** 选项卡。

_images/configure-tower-auth-radius-select.png
  1. 在**Radius 服务器**字段中输入 Radius 服务器的主机或 IP。如果该字段为空,则禁用 Radius 身份验证。

  2. 在接下来的两个字段中输入端口和秘密信息。

  3. 完成后,点击**保存**。

21.4. SAML 身份验证设置

SAML 允许在身份提供者(IdP - 提供单点登录服务的服务器系统)和服务提供者(在本例中为 Ansible Tower)之间交换身份验证和授权数据。Ansible Tower 可以配置为与 SAML 交谈,以验证(创建/登录/注销)Tower 用户。用户团队和组织成员资格可以嵌入到 SAML 对 Tower 的响应中。

_images/configure-tower-auth-saml-topology.png

以下说明将 Ansible Tower 描述为服务提供者。要通过 RHSSO(keycloak)验证用户,请参阅Red Hat Single Sign On 与 Ansible Tower 集成博客。

要设置 SAML 身份验证

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

默认情况下,Azure AD 选项卡最初显示。

  1. 选择**SAML** 选项卡。

_images/configure-tower-auth-saml-select.png

以下步骤描述了**所有**字段及其用途。要使透明 SAML 登录正常工作,用户界面中标有星号 (*) 的字段是最小必需字段。

  1. **SAML 断言使用服务 (ACS) URL** 和 **SAML 服务提供者元数据 URL** 字段是预先填充的,并且不可编辑。联系身份提供者管理员,并提供这些字段中包含的信息。

  2. 将 **SAML 服务提供者实体 ID** 设置为与 Tower 基本 URL 相同。Tower 基本 URL 可以在“配置 Tower”屏幕的“系统”选项卡中找到,可以通过设置 settings 图标访问。通过 API,它可以在 /api/v2/settings/system 中的 TOWER_URL_BASE 变量下查看。实体 ID 可以设置为任何一个独立的 Tower 集群节点,但最佳实践是将其设置为服务提供者的 URL。确保基本 URL 与负载均衡器(如果使用)的 FQDN 相匹配。

注意

Tower 基本 URL 在集群中的每个节点上都不同。通常,负载均衡器会位于多个 Tower 集群节点的前面,以提供单个入口点,即 Tower 集群 FQDN。SAML 服务提供者必须能够建立出站连接并路由到 SAML 服务提供者实体 ID 中设置的 Tower 集群节点或 Tower 集群 FQDN。

在此示例中,服务提供者是 Tower 集群,因此,ID 设置为 Tower 集群 FQDN。

_images/configure-tower-auth-saml-spentityid.png
  1. 为 Ansible 集群创建服务器证书。通常,当配置 Ansible 集群时,Tower 节点将被配置为仅处理 HTTP 流量,而负载均衡器将是 SSL 终止点。在这种情况下,负载均衡器需要 SSL 证书,而单个 Tower 集群节点不需要。SSL 可以在每个 Tower 节点上启用或禁用,但在使用 SSL 终止的负载均衡器时应该禁用。建议使用非到期自签名证书,以避免定期更新证书。这样,即使有人忘记更新证书,身份验证也不会失败。

注意

**SAML 服务提供者公钥证书** 字段应包含整个证书,包括“—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–“。

如果您使用的是带有证书的 CA 捆绑包,请将整个捆绑包包含在此字段中。

_images/configure-tower-auth-saml-cert.png

作为公钥证书的示例

-----BEGIN CERTIFICATE——
... cert text ...
-----END CERTIFICATE——
  1. 为 Tower 创建一个可选的私钥,供其用作服务提供者 (SP),并在 **SAML 服务提供者私钥** 字段中输入它。

作为私钥的示例

-----BEGIN PRIVATE KEY--
... key text ...
-----END PRIVATE KEY——
  1. 在 **SAML 服务提供者组织信息** 字段中,在 SSO 过程中向 IdP 提供有关 Tower 集群的一些详细信息。

{
  "en-US": {
    "url": "http://www.example.com",
    "displayname": "Example",
    "name": "example"
  }
}

例如

_images/configure-tower-auth-saml-org-info.png

注意

这些字段是正确配置 Tower 中 SAML 所必需的。

  1. 在 **SAML 服务提供者技术联系人** 字段中向 IdP 提供技术联系人信息。不要删除此字段的内容。

{
"givenName": "Some User",
"emailAddress": "[email protected]"
}

例如

_images/configure-tower-auth-saml-techcontact-info.png
  1. 在 **SAML 服务提供者支持联系人** 字段中向 IdP 提供支持联系人信息。不要删除此字段的内容。

{
"givenName": "Some User",
"emailAddress": "[email protected]"
}

例如

_images/configure-tower-auth-saml-suppcontact-info.png
  1. 在 **SAML 启用的身份提供者** 字段中,提供有关如何连接到每个列出的身份提供者的信息。Tower 在以下示例中期望以下 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 属性发送到 Tower 节点,则将其设置为 name_id,或者它可以是用户名属性,或者是一个自定义的唯一标识符。

  • entity_id - 身份提供者管理员提供的实体 ID。管理员为 Tower 创建 SAML 配置文件,并生成一个唯一的 URL。

  • url - 当 SSO 激活时,Tower 将用户重定向到的单点登录 (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 是某些身份提供者用来告诉服务提供者 (Tower 集群) 唯一用户标识符是什么的特殊属性。如果使用它,请将 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"
  }
}
_images/configure-tower-auth-saml-idps.png

警告

attr_username 必须引用每个帐户的唯一属性。例如,如果 attr_username 引用 User.email 并且 SAML 用户与另一个用户(包括非 SAML 用户)共享相同的电子邮件,则重复的电子邮件帐户将被合并。请注意,这种行为对系统管理员用户也适用,因此,使用与系统管理员用户相同的电子邮件地址进行 SAML 登录将使用系统管理员权限登录。为了将来参考,您可以根据 SAML 映射删除(或添加)管理员权限,如后续步骤所述。

注意

IdP 使用众所周知的 SAML urn 提供电子邮件、姓氏和名字。IdP 使用自定义 SAML 属性来标识用户,这是一个 Tower 无法读取的属性。相反,Tower 可以理解唯一的标识符名称,即 URN。使用 SAML“Name”属性中列出的 URN 作为用户属性,如以下示例所示。

_images/configure-tower-auth-saml-idps-urn.png
  1. 可以选择提供 **SAML 组织映射**。有关更多详细信息,请参阅 组织和团队映射

  2. 可以将 Tower 配置为查找包含团队和组织成员资格的特定属性,以便在用户登录 Tower 时将其与用户关联。属性名称在 **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>

以下是相应的 Tower 配置。

{
  "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>" },它定义了从 Tower 团队到 Tower 组织的映射。这是必需的,因为同一个命名的团队可能在 Tower 中的多个组织中存在。没有这种映射,在 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"
}

用户身份验证后,Tower 将按预期创建组织和团队别名。

  1. 可以选择在 **SAML 团队映射** 字段中提供团队成员资格映射。有关更多详细信息,请参阅 组织和团队映射

  2. 可以选择在 **SAML 安全配置** 字段中提供安全设置。此字段等同于 API 中的 SOCIAL_AUTH_SAML_SECURITY_CONFIG 字段。有关更多详细信息,请参阅 OneLogin 的 SAML Python 工具包

Tower 在用户通过 SAML 登录时使用 python-social-auth 库。该库依赖于 python-saml 库来提供以下两个可选字段的设置:**SAML 服务提供者额外配置数据** 和 **SAML IDP 到 EXTRA_DATA 属性映射**。

  1. **SAML 服务提供者额外配置数据** 字段等同于 API 中的 SOCIAL_AUTH_SAML_SP_EXTRA。有关有效的服务提供者额外 (SP_EXTRA) 参数的信息,请参阅 python-saml 库文档

  1. **SAML IDP 到 EXTRA_DATA 属性映射** 字段等同于 API 中的 SOCIAL_AUTH_SAML_EXTRA_DATA。有关更多信息,请参阅 Python 的 SAML 高级设置 文档。

  1. 完成后,点击**保存**。

  2. 要验证身份验证是否已正确配置,请将 **SAML 服务提供者元数据 URL** 中找到的自动生成的 URL 加载到浏览器中。它应该输出 XML 输出,否则,它配置不正确。

    或者,退出 Ansible Tower,登录屏幕现在将显示 SAML 徽标,以表明它是一种登录 Ansible Tower 的备用方法。

    _images/configure-tower-auth-saml-logo.png

21.4.1. 透明 SAML 登录

要使透明登录正常工作,您必须首先让 IdP 启动的登录正常工作。为此

  1. 将 IdP 上的 RelayState 设置为 IdP 定义在 SAML Enabled Identity Providers 字段中的键,如前所述。在上面给出的示例中,RelayState 需要是 myidponelogin

  2. 一旦配置完成,在 Ansible Tower 用户界面中的“设置”(settings)菜单的“系统”窗口中,使用**登录重定向覆盖 URL**字段指定未登录用户重定向到的 URL,而不是默认的 Tower 登录页面。对于透明 SAML 登录,此字段应设置为/sso/login/saml/?idp=<name-of-your-idp>,如示例所示。

_images/configure-tower-system-login-redirect-url.png

注意

以上是一个典型的 IdP 格式示例,但可能不适合您的特定情况。您可能需要联系您的 IdP 以获取正确的透明重定向 URL,因为该 URL 并非所有 IdP 都相同。

  1. 配置透明 SAML 登录后,要使用本地凭据或其他 SSO 登录,请直接访问https://<your-tower-server>/login。这将提供标准的 Tower 登录页面,包括 SSO 身份验证按钮,并允许您使用任何配置的方法登录。

21.5. TACACS+ 身份验证设置

终端访问控制器访问控制系统 Plus (TACACS+) 是一种协议,用于通过集中式服务器处理网络访问控制的远程身份验证和相关服务。特别是,TACACS+ 提供身份验证、授权和记账 (AAA) 服务,您可以在其中配置 Ansible Tower 以用作身份验证来源。

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

默认情况下,Azure AD 选项卡最初显示。

  1. 选择**TACACs+**选项卡。

_images/configure-tower-auth-tacacs-select.png
  1. 在以下字段中输入信息

  • **TACACS+ 服务器**: 提供要进行身份验证的 TACACS+ 服务器的主机名或 IP 地址。如果此字段为空,则 TACACS+ 身份验证将被禁用。

  • **TACACS+ 端口**: TACACS+ 默认使用端口 49,该端口已预先填充。

  • **TACACS+ 密钥**: TACACS+ 身份验证服务器的密钥。

  • **TACACS+ 身份验证会话超时**: 会话超时值(以秒为单位)。默认值为 5 秒。

  • **TACACS+ 身份验证协议**: TACACS+ 客户端使用的协议。选项为**ascii**或**pap**。

_images/configure-tower-auth-tacacs.png
  1. 完成后,点击**保存**。