15. 安全最佳实践

AWX 以安全的方式部署,用于自动化典型环境。但是,管理某些操作系统环境、自动化和自动化平台可能需要一些额外的最佳实践来确保安全性。本文档描述了以安全方式自动化的最佳实践。

15.1. 了解 Ansible 和 AWX 的架构

Ansible 和 AWX 包含一个通用、声明式的自动化平台。这意味着,一旦 Ansible 剧本启动(通过 AWX 或直接在命令行上),提供给 Ansible 的剧本、清单和凭据将被视为事实来源。如果需要围绕特定剧本内容、作业定义或清单内容的外部验证制定策略,则必须在启动自动化之前(无论是通过 AWX Web UI 还是 AWX API)执行这些过程。

这些可以采用多种形式。使用源代码控制、分支和强制代码审查是 Ansible 自动化的最佳实践。有很多工具可以帮助您围绕以这种方式使用源代码控制创建流程。

在更高层面上,存在许多工具可以围绕任意工作流(包括自动化)创建审批和基于策略的操作;这些工具随后可以使用 AWX 的 API 来执行自动化。

我们建议所有 AWX 客户在安装时选择一个安全的默认管理员密码。有关更多信息,请参阅 更改 AWX 管理员密码

AWX 在某些知名端口上公开服务,例如端口 80 用于 HTTP 流量,端口 443 用于 HTTPS 流量。我们建议您不要在公共互联网上公开 AWX,从而大幅减少安装的攻击面。

15.2. 授予访问权限

授予对系统某些部分的访问权限会带来安全风险。请应用以下实践来帮助保护访问权限

15.2.1. 最小化管理员帐户

最小化对系统管理员帐户的访问对于维护安全系统至关重要。系统管理员/root 用户可以访问、编辑和破坏任何系统应用程序。将具有 root 访问权限的人员/帐户数量限制在尽可能小的群体中。不要将 sudo 授予 rootawx(awx 用户)给不受信任的用户。请注意,当通过 sudo 等机制限制管理员访问权限时,限制为一组特定命令可能仍然会提供广泛的访问权限。任何允许执行 shell 或任意 shell 命令的命令,或任何可以更改系统上文件的命令,从根本上等同于完全 root 访问权限。

在 AWX 上下文中,任何 AWX“系统管理员”或“超级用户”帐户都可以编辑、更改和更新 AWX 中的任何清单或自动化定义。将此限制为尽可能少的用户,仅用于低级 AWX 配置和灾难恢复。

15.2.2. 最小化本地系统访问

AWX 在与最佳实践一起使用时,除了管理目的外,不应该需要本地用户访问。非管理员用户不应访问 AWX 系统。

15.2.3. 从用户中删除对凭据的访问

如果自动化凭据仅存储在 AWX 中,则可以进一步保护它。诸如 OpenSSH 之类的服务可以配置为仅允许来自特定地址的连接上的凭据。自动化使用的凭据可以与系统管理员用于灾难恢复或其他临时管理的凭据不同,从而更轻松地进行审计。

15.2.4. 执行职责分离

不同的自动化部分可能需要以不同的级别访问系统。例如,您可能拥有应用补丁并执行安全基线检查的低级系统自动化,而更高级别的自动化则部署应用程序。通过为每个自动化部分使用不同的密钥或凭据,可以最大程度地减少任何一个密钥漏洞的影响,同时还可以轻松进行基线审计。

15.3. 可用资源

AWX 和其他地方存在多个资源来确保一个安全的平台。请考虑利用以下功能

15.3.1. 审计和日志记录功能

对于任何管理访问,审计和监视操作至关重要。

对于 AWX,这是通过内置的活动流支持完成的,该支持记录 AWX 中的所有更改,以及通过自动化日志。

最佳实践规定集中收集日志记录和审计,而不是在本地系统上查看它。建议将 AWX 配置为使用您环境中标准的任何 IDS 和/或日志记录/审计(Splunk)。AWX 包含针对 Elastic Stack、Splunk、Sumologic、Loggly 等的内置日志集成。有关更多信息,请参阅 日志记录和聚合

15.3.2. 现有安全功能

不要禁用 SELinux,也不要禁用 AWX 的现有多租户隔离。使用 AWX 的基于角色的访问控制 (RBAC) 来委托运行自动化所需的最低权限级别。使用 AWX 中的团队将权限分配给用户组,而不是单独分配给用户。请参阅 AWX 用户指南 中的 基于角色的访问控制

15.3.3. 外部帐户存储

在大型组织中维护仅在 AWX 中的完整用户集可能是一项耗时的任务,容易出错。AWX 支持通过 LDAPSAML 2.0 和某些 OAuth 提供程序 连接到外部帐户源。使用此功能可以消除在处理权限时出现的错误源。

15.3.4. Django 密码策略

AWX 管理员可以使用 Django 通过 AUTH_PASSWORD_VALIDATORS 在创建时设置密码策略以验证 AWX 用户密码。在位于 AWX 实例的 /etc/awx/conf.d 中的 custom.py 文件中,添加以下代码块示例

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 9,
        }
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

有关更多信息,请参阅 Django 中的密码管理 以及上面发布的示例。

确保重新启动 AWX 实例以使更改生效。有关详细信息,请参阅 启动、停止和重启 AWX