我们希望听到您的声音!帮助我们深入了解 Ansible 生态系统的现状。
参与 2024 年 Ansible 项目调查

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 子系统性能更高

diagram of module code execution

由 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 设置为 libsshparamiko

如果配置参数的值设置为 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)