概述.
5月12日,全球突发的比特币勒索病毒(WannaCry)疯狂袭击公共和商业系统事件!英国各地超过40家医院遭到大范围网络黑客攻击,国家医疗服务系统(NHS)陷入一片混乱。中国多个高校校园网也集体沦陷。
WannaCry正是利用了过时的SMBv1协议中的一个漏洞,而SMBv1协议在Windows中默认是开启的。
虽然大多数企业都使用Linux服务器,但是仍然有很多企业中可能有成千上百台Windows服务器,如何实现快速批量关闭Windows服务器的SMBv1协议?
答案是Ansible!
Ansible核心模块win_regedit支持对Windows注册表key的添加、修改和删除,另一个核心模块win_reg_stat支持对注册表key的状态的检查。使用ansible playbook可实现批量对Windows服务器的管理配置操作。
Ansible如何管理Windows客户端请参考文档末尾的附录。
以下为关闭和检查SMBv1协议的Playbook示例:
以下为hosts的Inventory文件,客户端为Windows 2012 R2
Playbook执行结果如下:
以上Playbook的执行,发生了一个changed,表示在目标机器上发生了一次修改类的操作。
可以通过Windows注册表查看SMBv1协议的值:
从1.7版本开始,Ansible也开始支持Windows机器的管理。不过是通过本机的PowerShell来实现远程管理,而不是SSH。使用Python的 “winrm”模块来和远程Windows主机交互。
在管理的过程中,Ansible无需在远程Win主机上安装任何额外的软件,仍然使用 agentless(非c/s架构)。
Ansible需要管理Windows,需要在Ansible上安装winrm模块。
模块下载地址:http://github.com/diyan/pywinrm/archive/master.zip
该模块在安装的过程中可能还依赖一些其他的模块,如果在环境允许的情况下可以让Ansible管理端连接互联网自动下载依赖,否则需要手动下载。
安装方法如下:
为了Ansible能管理Windows机器,须开启并配置远程Windows机器上PowerShell。
推荐使用脚本自动化配置,脚本下载地址: https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
注:Windows 7和Server 2008 R2系统因为 Windows Management Framework3.0的BUG,必须安装 hotfixhttp://support.microsoft.com/kb/2842230 来避免内存溢出(OOM)和堆栈异常。新安装的 Server 2008 R2 系统没有升级到最新版本的均存在这个问题。Windows8.1 and Server 2012 R2 不受影响是因为他们自身默认使用的是 WindowsManagement Framework 4.0。
以下所有操作都必须使用administrator账号执行。
下载脚本后,将脚本拷贝至远程Windows机器上,运行方法有两种:
方法一:直接在脚本上点击右键,选择“使用PowerShell运行”
方法二:在PowerShell命令行里运行
注:可能有些机器的PowerShell在运行脚本的时候会出现以下错误:
这种情况是因为PowerShell的执行策略被设置为Restricted,该策略禁止运行任何脚本,将执行策略修改为RemoteSigned即可,检查及修改方法如下:
多数 Ansible Windows 模块需要PowerShell 3.0 或更高版本,同时也需要在其基础上运行安装脚本。需要注意的是 PowerShell3.0 只在 Windows 7 SP1,WindowsServer 2008 SP1,和更新的windows发布版才被支持。
如需更新到PowerShell 3.0,可以使用以下的连接来下载脚本进行更新:
https://github.com/cchurch/ansible/blob/devel/examples/scripts/upgrade_to_ps3.ps1
创建一个Inventory文件,内容如下:
参数说明:
ansible_ssh_user表示远程windows机器上的用户
ansible_ssh_pass表示ansible_ssh_user对应用户的密码
ansible_ssh_port表示连接PowerShell使用的端口,这里是5986
ansible_connection表示连接windows的类型,这里不能使用ssh
测试,使用ping模块测试连通性,windows使用的是win_ping
失败,因为使用的是自签名证书,所以需要添加以下参数来忽略错误:
再次测试,成功: