本文档介绍了 Ansible Tower 如何以安全的方式处理密钥和连接。
Ansible Tower 管理三组密钥
本地 Ansible Tower 用户的用户名密码
用于 Ansible Tower 操作的密钥(数据库密码、消息总线密码等)
用于自动化的密钥(SSH 密钥、云凭据、外部密码库凭据等)
Ansible Tower 使用 SHA256 哈希通过 PBKDF2 算法对本地 Ansible Tower 用户密码进行哈希处理。通过外部帐户机制(LDAP、SAML、OAuth 等)进行身份验证的用户没有存储任何密码或密钥。
Ansible Tower 包含以下用于操作的密钥
/etc/tower/SECRET_KEY
用于在数据库中加密自动化密钥的密钥(见下文)。如果 SECRET_KEY 发生变化或未知,则数据库中的任何加密字段都无法访问。
/etc/tower/tower.{cert,key}
Ansible Tower Web 服务的 SSL 证书和密钥。默认情况下会安装自签名证书/密钥;客户可以提供本地适用的证书和密钥。
数据库密码在 /etc/tower/conf.d/postgres.py 中,消息总线密码在 /etc/tower/conf.d/channels.py 中
连接到 Ansible Tower 组件服务的密码
这些密钥都以未加密的形式存储在 Ansible Tower 服务器上,因为它们都需要在 Ansible Tower 服务启动时以自动化的方式读取。所有密钥都受到 Unix 权限保护,并且仅限 root 和 Ansible Tower 服务用户 awx 访问。
如果需要隐藏这些密钥,则读取这些密钥的文件是解释性 Python。这些文件可以在每次服务重启时调整,以通过其他机制检索这些密钥。这样做是客户提供的修改,可能需要在每次升级时重新应用。Red Hat 支持和 Red Hat 咨询拥有此类修改的示例。
注意
如果密钥系统出现故障,Tower 将无法获取信息,并且可能会以在服务恢复后可恢复的方式失败。强烈建议在该系统上使用一些冗余。
如果由于任何原因,您认为为您生成的 SECRET_KEY
已被泄露,需要重新生成,则可以运行安装程序中的工具,该工具的行为类似于 Tower 备份和还原工具。要生成新的密钥
在执行任何其他操作之前备份您的 Tower 数据库! 按照本指南的 备份和还原 Tower 部分中描述的步骤操作。
使用您的安装清单(与运行备份/还原相同的清单),运行 setup.sh -k
。
先前密钥的备份副本将保存在 /etc/tower/
中。
Ansible Tower 在数据库中存储各种用于自动化或由自动化产生的密钥。这些密钥包括
所有凭据类型的全部密钥字段(密码、密钥、身份验证令牌、密钥云凭据)
Ansible Tower 设置中定义的外部服务的密钥令牌和密码
“密码”类型调查字段条目
为了加密密钥字段,Tower 使用 AES 在 CBC 模式下使用 256 位密钥进行加密,PKCS7 填充,以及使用 SHA256 进行 HMAC 验证。加密/解密过程从 SECRET_KEY(如上所述)、模型字段的字段名称以及数据库分配的自动递增记录 ID 推导出 AES-256 位加密密钥。因此,如果密钥生成过程中使用的任何属性发生变化,Tower 将无法正确解密密钥。Ansible Tower 的设计使得 SECRET_KEY 永远无法在 Ansible Tower 启动的剧本中读取,这些密钥永远无法被 Tower 用户读取,并且任何密钥字段值都无法通过 Ansible Tower REST API 获取。如果剧本中使用密钥值,我们建议在任务中使用 no_log,以防意外记录。
Ansible Tower 在内部运行过程中会连接以下服务
PostgreSQL 数据库
Redis 键值存储
与 Redis 的连接通过本地 Unix 套接字,仅限于 awx 服务用户访问。
与 PostgreSQL 数据库的连接通过 TCP 协议使用密码身份验证,可以通过 localhost 或者远程连接(外部数据库)。此连接可以使用 PostgreSQL 内置的 SSL/TLS 支持,如安装程序支持中默认配置的那样。SSL/TLS 协议由默认的 OpenSSL 配置进行配置。
Ansible Tower 通过 nginx 提供的标准 HTTP/HTTPS 协议在标准端口上访问。默认情况下会安装自签名证书/密钥;客户可以提供本地适用的证书和密钥。SSL/TLS 算法支持在 /etc/nginx/nginx.conf 配置文件中配置。默认情况下使用“中间”配置文件,客户可以对其进行配置。客户更改必须在每次更新后重新应用。
Ansible Tower 还会连接受管机器和服务,以进行自动化操作。所有与受管机器的连接均通过标准安全机制(如 SSH、WinRM、SSL/TLS 等)完成,每个机制都继承自该功能的系统配置(如系统 OpenSSL 配置)。