Red Hat Ansible Tower 认证方法总结
Red Hat Ansible Tower 认证方法总结
Red Hat Ansible Tower 3.4.0 添加了令牌认证作为一种新的认证方法,因此我想利用这篇文章总结各种企业认证方法以及每种方法的最佳使用场景。Ansible Tower 旨在帮助组织集中并控制其自动化,提供一个可视化仪表板以实现开箱即用的控制,同时提供 REST API 以更深入地与您的其他工具集成。我们支持多种认证方法,以便于将 Ansible Tower 集成到现有的工具和流程中,从而确保合适的人员能够访问 Ansible Tower 资源。在这篇博文中,我将介绍 Ansible Tower 的四种认证方法:会话、基本、OAuth2 令牌和单点登录 (SSO)。对于每种方法,我都会提供一些快速示例以及相关支持文档的链接,以便您可以轻松地将 Ansible Tower 集成到您的环境中。
会话认证
会话认证用于直接登录 Ansible Tower 的 API 或 UI。当用户希望长时间保持登录状态时(不仅仅是针对该 HTTP 请求),例如在浏览器(如 Chrome 或 Firefox)中浏览 UI 或 API 时,就会使用此方法。当用户登录时,会创建一个会话 cookie,这使得用户在导航到 Ansible Tower 中的不同页面时能够保持登录状态。
它是如何工作的?
使用 Curl 工具,让我们更深入地了解登录 Ansible Tower 时会发生什么。
-
GET 到
/api/login/
端点以获取csrftoken
cookie```bash curl -k -c - https://
/api/login/ localhost FALSE / FALSE 0 csrftoken AswSFn5p1qQvaX4KoRZN6A5yer0Pq0VG2cXMTzZnzuhaY0L4tiidYqwf5PXZckuj ```
-
POST 到
/api/login/
端点,包含用户名、密码和X-CSRFToken=<token-value>
bash curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ --referer https://<tower-host>/api/login/ \ -H 'X-CSRFToken: K580zVVm0rWX8pmNylz5ygTPamgUJxifrdJY0UDtMMoOis5Q1UOxRmV9918BUBIN' \ --data 'username=root&password=reverse' \ --cookie 'csrftoken=K580zVVm0rWX8pmNylz5ygTPamgUJxifrdJY0UDtMMoOis5Q1UOxRmV9918BUBIN' \ https://<tower-host>/api/login/ -k -D - -o /dev/null
当您在浏览器中登录 UI 或 API 时,所有这些操作都由 Ansible Tower 完成,并且仅应在浏览器中进行身份验证时使用。对于与 Ansible Tower 的程序化集成,您应该使用 OAuth 2 令牌,而不是上面描述的过程。
注意:可以通过设置 SESSION_COOKIE_AGE 设置来更改会话过期时间。
可浏览 API 示例
基本认证
基本认证是无状态的,因此必须通过 Authorization 标头将 base64 编码的 `username` 和 password
与每个请求一起发送。
使用场景:用于来自 curl、python 脚本或单个 API 请求的 API 调用。尽可能推荐使用 OAuth2 认证来访问 API。
curl 示例
curl -X GET -H 'Authorization: Basic dXNlcjpwYXNzd29yZA==’ https://<tower-host>/api/v2/credentials -k -L # the --user flag adds this Authorization header for us curl -X GET --user 'user:password' https://<tower-host>/api/v2/credentials -k -L
有关基本 HTTP 认证方案的更多信息,请参阅 RFC 7617。
注意:出于安全目的,可以禁用基本认证,请参阅 文档 以获取更多信息。
OAuth 2 令牌认证
OAuth(开放授权)是一种用于基于令牌的身份验证和授权的开放标准。OAuth 2 认证通常用于以编程方式与 Ansible Tower API 交互。与基本认证类似,OAuth 2 令牌通过 Authorization 标头与每个 API 请求一起提供。与基本认证不同,OAuth 2 令牌具有可配置的超时时间并且可以进行作用域限定。令牌具有可配置的过期时间,并且如果需要,管理员可以轻松地撤销单个用户或整个 Ansible Tower 系统的令牌。这可以通过 tower-manage revoke_oauth2_tokens
管理命令完成。这里有 更多信息 关于如何执行此操作。此外,可以将能够创建令牌的用户类型限制为在 Ansible Tower 中创建的用户,而不是从 SSO 创建的外部用户(请参阅下面的 SSO 部分)。有关如何执行此操作的更多信息,请参阅这些 文档 中的说明。
在 Ansible Tower 中获取 OAuth 2 访问令牌的不同方法
- 个人访问令牌 (PAT)
- 应用程序令牌:密码授予类型
- 应用程序令牌:隐式授予类型
- 应用程序令牌:授权码授予类型
首先,用户需要在 API 中或在 UI 中其用户的“令牌”选项卡中创建一个 OAuth 2 访问令牌。出于本文的目的,我们将使用个人访问令牌方法 (PAT) 来创建令牌。创建令牌后,用户可以设置作用域。令牌的过期时间也可以在系统范围内配置。
以下是 UI 中创建 PAT 的示例:\
令牌认证最适合于任何 Ansible Tower API 的编程使用,例如 Python 脚本或 curl 等工具。请参阅以下个人访问令牌 (PAT) 示例
Curl 示例
首先,创建一个不与应用程序关联的 OAuth 2 令牌;换句话说,是一个个人访问令牌。在本例中,我们将通过 API 使用 curl 来执行此操作。
curl -u user:password -k -X POST https://<tower-host>/api/v2/tokens/
现在,您可以使用该令牌对 Ansible Tower 资源(例如主机)执行 GET 请求。
curl -k -X POST \ -H “Content-Type: application/json” -H “Authorization: Bearer <oauth2-token-value>” \ https://<tower-host>/api/v2/hosts/
类似地,可以通过对要启动的作业模板执行 POST 请求来启动作业。
curl -k -X POST \ -H "Authorization: Bearer <oauth2-token-value>" \ -H "Content-Type: application/json" \ --data '{"limit" : "ansible"}' \ https://<tower>/api/v2/job_templates/14/launch/
Python 示例
Tower-CLI 是一款开源工具,可轻松使用 HTTP 请求访问 Ansible Tower 的 API。您可以通过在 tower-cli config
中设置 OAuth 2 令牌,或通过使用 tower-cli login
命令让它代表您获取 PAT,让 Tower-CLI 使用您的 OAuth 2 令牌对 Tower 进行身份验证。它易于使用,我建议您尝试一下。
pip install ansible-tower-cli tower-cli config tower tower-cli login
有关如何在集成外部应用程序的上下文中在 Ansible Tower 中使用 OAuth 2 的更多信息,请查看这些 文档。
如果您需要编写自定义请求,则可以使用 Python 库请求 编写 Python 脚本。以下是一个示例。
import requests oauth2_token_value = 'y1Q8ye4hPvT61aQq63Da6N1C25jiA' # your token value from Tower url = 'https://<tower-host>/api/v2/users/' payload = {} headers = {'Authorization': 'Bearer ' + oauth2_token_value,} # makes request to Tower user endpoint response = requests.request('GET', url, headers=headers, data=payload, allow_redirects=False, verify=False) # prints json returned from Tower with formatting print(json.dumps(response.json(), indent=4, sort_keys=True))
SSO 认证
单点登录 (SSO) 认证方法从根本上有所不同,因为用户的认证发生在 Ansible Tower 的外部。例如,使用 GitHub SSO,GitHub 是唯一的事实来源,它根据您提供给 Tower 的用户名和密码验证您的身份。
在 Ansible Tower 中配置 SSO 方法后,登录屏幕上将显示该 SSO 的按钮。如果您单击该按钮,它会将您重定向到身份提供程序(在本例中为 GitHub),您将在其中提供您的凭据。如果身份提供程序成功验证了您,则 Ansible Tower 将创建一个与您的 GitHub 用户关联的用户(如果这是您第一次通过此 SSO 方法登录),并让您登录。
- LDAP - Ansible Tower 外部的身份目录,可用于针对其检查认证凭据。可以通过 Ansible Tower 中的 LDAP SSO 配置 Active Directory。
- SAML - 允许 Ansible Tower 用户通过单点登录认证服务进行认证,从而使用户在团队使用的多个服务中保持一致的认证。SAML 在维护跨服务权限组方面特别有用。
- GitHub - 如果 Ansible Tower 用户位于系统管理员在 `/api/v2/settings/authentication/` 中指定的 Github 组织、团队或用户中,则允许他们使用其 GitHub 凭据进行认证。Ansible Tower 使用 OAuth 2 来验证用户与 GitHub 的凭据。
- Azure Active Directory - 允许 Ansible Tower 用户使用 Azure 凭据进行认证。Ansible Tower 使用 OAuth 2 对 Azure 进行身份验证,以验证您的凭据并获取用户组数据。
- RADIUS - 通常用于网络设备的身份验证协议。它可以最大程度地减少认证的网络流量,因为它很轻量级。
- Google OAuth - 允许 Ansible Tower 用户使用其 Google Cloud 进行认证。Ansible Tower 使用 OAuth 2 协议对 Google 进行身份验证,以针对 Google 组织中的身份检查您的用户名和密码凭据。
哪种认证适合我?
我已经向您展示了您可以在 Ansible Tower 中使用的四种认证类型。每种方法都有其优缺点,并且适用于某些使用场景。
- 会话认证(登录 UI 或可浏览 API):我正在使用 Ansible Tower 在浏览器中手动创建资源(清单、项目、作业模板)并启动作业。
- 基本认证:我正在使用 curl、HTTPie 或其他类似工具对 Ansible Tower 进行故障排除,并且尚未为我的用户设置 OAuth 2 令牌。
-
OAuth 2 令牌认证
- 授权码流程 - 我是与 Ansible Tower 交互的应用程序的用户
- 个人访问令牌 (PAT) - 我正在以编程方式自动化我的 Ansible Tower 使用。
- SSO:我正在大型组织内部使用 Ansible Tower,并希望使用中央身份提供程序,或者希望允许用户使用外部认证(如 Google SSO、Azure SSO、LDAP、SAML 或 GitHub)进行认证。
您现在具备了选择最有效的认证方法以满足您需求的知识!我希望本指南有助于阐明您使用 Ansible Tower 进行身份验证的选项。