使用 Ansible 降低网络漏洞
使用 Ansible 降低网络漏洞
网络也并非免疫
就像 Windows 和 Linux 服务器一样,网络设备也可能受到其操作系统中发现的漏洞的攻击。许多 IT 组织没有一个全面的策略来缓解跨越多个团队(网络、服务器、存储等)的安全漏洞。由于大多数网络操作仍然是手动进行的,因此需要快速可靠地在由数百台网络设备组成的多个平台上进行缓解变得极其重要。
在思科的2018 年 3 月 Cisco IOS 和 IOS XE 软件安全公告捆绑版中,详细介绍了 22 个漏洞。虽然 Red Hat 不会报告或跟踪各个网络供应商的 CVE,但Red Hat Ansible Engine 可用于根据网络供应商提供的说明快速自动化 CVE 的缓解。
在这篇博文中,我们将逐步介绍CVE-2018-0171,其标题为“Cisco IOS 和 IOS XE 软件智能安装远程代码执行漏洞”。思科将此 CVE 标记为严重,并提供以下标题摘要
"...Cisco IOS 软件和 Cisco IOS XE 软件的智能安装功能中存在漏洞,可能允许未经身份验证的远程攻击者触发受影响设备的重新加载,从而导致拒绝服务 (DoS) 状况,或在受影响设备上执行任意代码。"
从网络收集信息
用户利用 Ansible 模块访问设备、检索信息、执行命令和使用特定关键字处理系统。CVE 首先需要的就是收集清单。要缓解 CVE,需要网络平台和特定版本的代码。CVE-2018-0171 影响 IOS 和 IOS-XE 网络操作系统,Ansible 可以轻松获取此信息。让我们使用ios_facts 模块,它返回键值对以供后续任务使用。例如:ansible_net_model
返回模型,而 ansible_net_image
返回设备正在运行的映像文件。有关完整列表,请参阅 ios_facts 模块文档页面。
- name: gather facts for ios platforms ios_facts: gather_subset: all - name: output facts to terminal window debug: msg: > Device {{ansible_net_hostname}}, model {{ansible_net_model}}, running {{ansible_net_version}}
执行 playbook 时,我们会得到如下所示的输出
ok: [rtr1] => { "msg": "Device rtr1, model CSR1000V, running 16.05.02\n" } ok: [rtr2] => { "msg": "Device rtr2, model CSR1000V, running 16.05.02\n" } ok: [switch] => { "msg": "Device c3850-1, model WS-C3850-24T, running 16.06.01\n" }
这使我们能够快速获取有关网络的有用信息,并根据思科安全公告对其进行检查。在GitHub network-automation 项目上的演示中,我们展示了如何使用网络信息快速构建漂亮的 HTML 报告。
漏洞 CVE-2018-0171 指定,要查看设备是否易受攻击,我们必须运行show vstack config
命令。在我的网络中,我有三台运行 IOS-XE 的设备,两台是 CSR1000V 设备,一台是 3850 设备。这两台 CSR 设备没有此命令,而 3850 交换机有。为了使我的 playbook 足够健壮以处理命令不存在时的错误,我可以使用ignore_errors
参数。否则,当目标网络节点无法使用该命令时,playbook 将失败并退出。或者,我可以通过使用限制仅在交换机上运行 playbook。对于此示例,让我们假设我们正在运行具有show vstack config
命令的 Cisco 3850。
- name: run show vstack config ios_command: commands: - show vstack config register: showvstack
在上面的 playbook 中,我使用了register: showvstack
。showvstack
是一个用户定义的术语(我选择的,它不是保留的)。通过注册它,我可以在 playbook 的后面使用show vstack config
的输出。我们可以使用 debug 模块查看showvstack
变量以查看其格式
ok: [switch] => { "showvstack": { "changed": false, "failed": false, "stdout": [ "Capability: Director | Client\n Oper Mode: Disabled\n Role: NA\n Vstack Director IP address: 0.0.0.0\n\n *** Following configurations will be effective only on director ***\n Vstack default management vlan: 1\n Vstack start-up management vlan: 1\n Vstack management Vlans: none\n Join Window Details:\n\t Window: Open (default)\n\t Operation Mode: auto (default)\n Vstack Backup Details:\n\t Mode: On (default)\n\t Repository:" ], <<rest of output removed for brevity>>
有一个 stdout 和一个 stdout_lines。要详细了解常见的返回值,请参阅文档。接下来,我们将使用我最喜欢的模块,即assert 模块。这使我们能够检查给定的表达式是否为真,如果它们不为真,则使任务失败。思科提供了两个输出,我们需要在show vstack config
命令的结果中检查这两个输出
switch1# show vstack config Role: Client (SmartInstall enabled)
或
switch2# show vstack config Capability: Client Oper Mode: Enabled Role: Client
我们可以使用 assert 模块检查我们保存在showvstack
变量中的文本
- name: Check to make sure Cisco's Smart Install Client Feature is not enabled (1/2) assert: that: - "'SmartInstall enabled' not in showvstack.stdout" - "'Role' not in showvstack.stdout" - "'Client' not in showvstack.stdout"
在 assert 模块中添加的每一行都意味着存在一个隐式 AND,这意味着所有三个都需要为真才能使任务通过。
类似地,我们可以检查第二个语句
- name: Check to make sure Cisco's Smart Install Client Feature is not enabled (1/1) assert: that: - "'Oper Mode' not in showvstack.stdout" - "'Enabled' not in showvstack.stdout" - "'Role' not in showvstack.stdout" - "'Client' not in showvstack.stdout"
对于此特定 CVE,它列出了没有可用的解决方法。在某些 CVE 中,我们可以使用 ios_command 或 ios_config 模块根据供应商提供的说明来缓解 CVE。对于此特定 CVE,它链接到有关如何使用命令 no vstack 禁用 vstack 的文档,可以使用 ios_command 模块发送该命令。它还建议对于较旧的版本,请阻止 TCP 端口 4786 上的流量,可以使用 ios_config 模块推送该流量。由于 CVE 上没有提供解决方法,因此网络运营商需要根据其环境做出明智的决定。或者,对于CVE-2018-0150,提供了一个解决方法,并且 ios_config 可以简单地发送no username cisco
来缓解 CVE。
Red Hat Ansible Engine 和 Red Hat Ansible Tower 可用于帮助网络运营商和管理员扩展重复性任务,例如检查这些数十个 CVE 并确保其网络免受漏洞的侵害。在服务器端,当系统管理员使用Red Hat Insights时,他们可以自动生成 playbook以帮助 Red Hat Enterprise Linux 缓解漏洞并主动识别对安全、性能和稳定性的威胁。Ansible 可以成为在整个 IT 基础架构中执行任务的通用方式。