Ansible 网络的新 LibSSH 连接插件取代 Paramiko,并添加 FIPS 模式启用
Ansible 网络的新 LibSSH 连接插件取代 Paramiko,并添加 FIPS 模式启用
随着 Red Hat Ansible Automation Platform 随着不断增长的客户群扩展其影响力,安全性继续成为组织整体战略的重要方面。Red Hat 定期审查和增强基础代码库以遵循更好的安全实践。作为这项工作的一部分,我们正在通过一个新开发的 Ansible SSH 连接插件(使用 libssh 库)引入 FIPS 140-2 就绪 启用。
Ansible 网络 SSH 连接基础
由于大多数网络设备不支持或对本地执行第三方软件的能力有限,因此与 Linux 主机不同,Ansible 网络模块不会复制到远程主机;相反,它们在控制节点本身运行。因此,Ansible 网络无法使用与 Linux 主机一起使用的典型 Ansible SSH 连接插件。此外,由于这种行为,底层 SSH 子系统的性能至关重要。新的 LibSSH 连接插件不仅启用了 FIPS 就绪,而且还设计为 比现有的 Paramiko SSH 子系统性能更高。
由 ansible.netcommon 集合(特别是 ansible.netcommon.network_cli
)提供的顶级 network_cli
连接插件提供到网络设备的基于 SSH 的连接。它依次调用依赖于 paramiko python 库的 ansible.builtin.paramiko_ssh
连接插件来初始化控制节点和远程主机之间的会话。之后,它创建一个伪终端 (PTY) 以将命令从控制节点发送到网络设备并接收响应。
为什么要替换 Paramiko?
替换 paramiko 库的主要原因是它不保证 FIPS 就绪,从而限制了 Ansible 网络在强制启用 FIPS 模式环境中的运行能力。Paramiko 也不是速度最快的连接插件,因此也可以对其进行增强。因此,现在可以轻松地将新的 ansible.netcommon.libssh
连接插件替换为 paramiko。ansible.netcommon
集合现在默认包含此插件,并且可以在代码库变得更加稳定之前用于测试目的(目前处于 技术预览 状态)。
与上述连接流程进行比较,由 ansible.netcommon
集合(特别是 ansible.netcommon.network_cli
)提供的顶级 network_cli
连接插件仍然提供到网络设备的基于 SSH 的连接。它依次调用依赖于 ansible-pylibssh
python 库 的 ansible.netcommon.libssh
连接插件来初始化控制节点和远程主机之间的会话。此 python 库本质上是 libssh C 库 之上的 Cython 包装器。然后,它使用 python 通过 SSH 创建伪终端 (PTY)。
切换 Ansible 剧本来使用 LibSSH
在 ansible.netcommon
集合版本 1.0.0 中,添加了 ansible.netcommon.network_cli
连接插件中的一个新的配置参数,该参数允许将 ssh_type
设置为 libssh
或 paramiko
。
如果配置参数的值设置为 libssh
,则它将使用 ansible.netcommon.libssh
连接插件,该插件又使用支持 FIPS 就绪的 ansible-pylibssh
python 库。如果该值设置为 paramiko
,则它将继续使用依赖于 paramiko
python 库的默认 ansible.builtin.paramiko
连接插件。
同样,默认值设置为 paramiko
,但未来计划将默认值更改为 libssh
。
安装和配置 LibSSH
为了利用 LibSSH 插件,您必须首先通过以下命令从 PyPI 安装 ansible-pylibssh
python 库
pip install ansible-pylibssh
注释
- 当前的 PyPI 安装方法将正确版本的
LibSSH
库及其依赖项捆绑为 特定于平台的轮子,这些轮子在运行时不依赖于任何操作系统级库。 - 未来的计划包括为
ansible-pylibssh
库创建、发布和维护独立的 RPM 和 DEB 软件包,这些软件包可以使用众所周知的 Linux 软件包管理器进行安装。这些将在控制节点上安装所需的系统libssh
版本及其依赖项。仅供参考,Red Hat Enterprise Linux 8.1 及更高版本包含正确的libssh
软件包版本及其依赖项。 - 目前使用 Ansible 连接网络设备是使用 LibSSH 的主要用例。连接到其他类型的端点(例如 Linux)将在以后的日期正式启用。
在 Ansible 剧本中使用 LibSSH
方法 1:ssh_type
配置参数可以设置为在项目的活动 ansible.cfg
文件中使用 libssh
,如下所示
[persistent_connection] ssh_type = libssh
方法 2:设置 ANSIBLE_NETWORK_CLI_SSH_TYPE
环境变量,如下所示
$export ANSIBLE_NETWORK_CLI_SSH_TYPE=libssh
方法 3:在剧本的 Play 级别(如下例所示)将 ansible_network_cli_ssh_type
参数设置为 libssh
。
注释:此设置可以在单个任务级别进行,但前提是尚未建立到远程网络设备的连接。也就是说,如果第一个任务使用 paramiko
,则 Play 中的所有后续任务都必须使用 paramiko
,即使在任何后续任务中指定了 libssh
。
故障排除 LibSSH 连接
要快速验证 libssh 传输是否设置正确,您可以使用带添加的详细标志 (-vvvv) 的 ansible-playbook
命令行运行以下剧本。在运行之前,请确保正确设置了清单文件。
此示例剧本使用 cisco.ios
集合,并且必须首先从 Ansible Galaxy 或 Ansible Automation Platform 安装到您的 Ansible 控制节点上。
- hosts: "changeme" gather_facts: no connection: ansible.netcommon.network_cli vars: ansible_network_os: cisco.ios.ios ansible_user: "changeme" ansible_password: "changeme" ansible_network_cli_ssh_type: libssh tasks: - name: run show version command ansible.netcommon.cli_command: command: show version - name: run show interface command ansible.netcommon.cli_command: command: show interfaces
https://gist.github.com/ganeshrn/78149adca85c809b69ed1b5f5262844c
在输出详细日志中,您应该看到控制台上显示了“ssh 类型设置为 libssh”行,这确认配置设置正确。
后续步骤和资源
- 通过将配置设置为使用 ansible-pylibssh 库来开始测试您的 Ansible 网络剧本。
- 在 ansible-pylibssh 库方面,帮助对现有剧本进行性能分析,以针对 paramiko 库进行比较。
- 参与 ansible-pylibssh 项目 (https://github.com/ansible/pylibssh)