影刀RPA 网络安全自动化:漏洞扫描与补丁管理
什么情况用什么 → 怎么做 → 有什么坑
作者:林焱 | 飞行社出品
什么情况用什么
企业服务器越来越多,漏洞也越来越多。手动登录每台服务器跑yum update或apt upgrade,重复劳动到怀疑人生。
这套方案适合:
- 企业运维团队自动化漏洞扫描
- 自动化补丁管理(Windows/Linux)
- 安全合规审计(等保2.0、网络安全法)
核心工具:影刀RPA + Nessus/OpenVAS(漏洞扫描) + Ansible(补丁管理) + 合规报告生成
怎么做
第一步:自动化漏洞扫描(OpenVAS)
拼多多店群自动化报活动上架!
importrequestsimportjsonimporttimedefinit_openvas_client(openvas_url,username,password):""" 初始化OpenVAS客户端 OpenVAS是开源漏洞扫描工具 """try:# 1. 登录获取tokenlogin_url=f"{openvas_url}/login"login_data={"username":username,"password":password}response=requests.post(login_url,json=login_data,verify=False)result=response.json()if"token"inresult:print(f"OpenVAS登录成功")returnresult["token"]else:print(f"⚠️ OpenVAS登录失败:{result}")returnNoneexceptExceptionase:print(f"⚠️ OpenVAS连接失败:{e}")returnNonedefcreate_scan_task(openvas_url,token,target_ip,scan_config="Full and fast"):""" 创建扫描任务 target_ip: 目标IP或IP段(如 "192.168.1.0/24") scan_config: 扫描配置("Full and fast", "Full and very deep"等) """headers={"Authorization":f"Bearer{token}"}# 1. 创建目标(Target)target_data={"name":f"Auto Target{target_ip}","hosts":target_ip,"port_range":"T:1-65535,U:1-65535",# TCP+UDP全端口"alive_test":"Consider alive"}response=requests.post(f"{openvas_url}/targets",headers=headers,json=target_data,verify=False)target_id=response.json()["id"]print(f"目标已创建:{target_id}")# 2. 创建扫描任务(Task)task_data={"name":f"Auto Scan{target_ip}","config_id":get_config_id(openvas_url,headers,scan_config),"target_id":target_id}response=requests.post(f"{openvas_url}/tasks",headers=headers,json=task_data,verify=False)task_id=response.json()["id"]print(f"扫描任务已创建:{task_id}")returntask_iddefstart_scan_task(openvas_url,token,task_id):"""启动扫描任务"""headers={"Authorization":f"Bearer{token}"}response=requests.post(f"{openvas_url}/tasks/{task_id}/start",headers=headers,verify=False)ifresponse.status_code==202:print(f"扫描任务已启动:{task_id}")returnTrueelse:print(f"⚠️ 启动扫描任务失败:{response.text}")returnFalsedefget_scan_report(openvas_url,token,task_id):"""获取扫描报告"""headers={"Authorization":f"Bearer{token}"}# 1. 等待扫描完成(轮询状态)whileTrue:response=requests.get(f"{openvas_url}/tasks/{task_id}",headers=headers,verify=False)task_status=response.json()["status"]iftask_status=="Done":print(f"扫描已完成")breakelse:print(f"扫描中... 状态:{task_status}")time.sleep(30)# 每30秒查询一次# 2. 获取报告IDresponse=requests.get(f"{openvas_url}/tasks/{task_id}",headers=headers,verify=False)report_id=response.json()["last_report"]["id"]# 3. 下载报告(PDF格式)report_url=f"{openvas_url}/reports/{report_id}/download"response=requests.get(report_url,headers=headers,verify=False)report_file=f"/tmp/openvas_report_{task_id}.pdf"withopen(report_file,"wb")asf:f.write(response.content)print(f"扫描报告已下载:{report_file}")returnreport_file# 完整流程示例token=init_openvas_client("https://openvas.company.com","admin","password")iftoken:task_id=create_scan_task(token,"192.168.1.0/24")iftask_id:start_scan_task(token,task_id)report_file=get_scan_report(token,task_id)第二步:自动化补丁管理(Linux - Ansible)
importsubprocessimportjsondefrun_ansible_playbook(playbook_path,inventory_path,extra_vars=None):""" 执行Ansible Playbook(自动化补丁管理) playbook_path: playbook文件路径 inventory_path: inventory文件路径(定义要管理的服务器) extra_vars: 额外变量(如 {"patch_type": "security"}) """print(f"开始执行Ansible Playbook:{playbook_path}")# 1. 构造ansible-playbook命令cmd=["ansible-playbook","-i",inventory_path,# inventory文件playbook_path]ifextra_vars:cmd.extend(["--extra-vars",json.dumps(extra_vars)])try:# 2. 执行playbookresult=subprocess.run(cmd,capture_output=True,text=True,timeout=3600# 最多执行1小时)ifresult.returncode==0:print(f"✅ Playbook执行成功")print(result.stdout)returnTrueelse:print(f"⚠️ Playbook执行失败")print(result.stderr)returnFalseexceptExceptionase:print(f"⚠️ 执行Playbook失败:{e}")returnFalse# Ansible Playbook示例(update_packages.yml)""" --- - name: Update packages on Linux servers hosts: all become: yes # 使用sudo权限 tasks: - name: Update yum cache (CentOS/RHEL) yum: update_cache: yes when: ansible_os_family == "RedHat" - name: Update apt cache (Ubuntu/Debian) apt: update_cache: yes when: ansible_os_family == "Debian" - name: Install security updates (CentOS/RHEL) yum: name: '*' security: yes state: latest when: ansible_os_family == "RedHat" - name: Install security updates (Ubuntu/Debian) apt: upgrade: 'security' when: ansible_os_family == "Debian" - name: Reboot if kernel updated reboot: reboot_timeout: 300 when: kernel_updated | default(false) """# 使用示例success=run_ansible_playbook(playbook_path="/opt/ansible/update_packages.yml",inventory_path="/opt/ansible/inventory/hosts",extra_vars={"patch_type":"security"})第三步:自动化补丁管理(Windows - PowerShell)
importsubprocessdefrun_windows_update(remote_host,username,password):""" 远程执行Windows Update(使用PowerShell) Windows补丁管理需要使用PSWindowsUpdate模块 """print(f"开始执行Windows Update:{remote_host}")# 1. 构造PowerShell脚本(远程执行)ps_script=""" # 安装PSWindowsUpdate模块(如果没装) Install-Module -Name PSWindowsUpdate -Force -AllowClobber # 检查可用更新 Get-WindowsUpdate # 安装所有可用更新(自动重启) Install-WindowsUpdate -AcceptAll -AutoReboot """# 2. 将脚本保存到临时文件importtempfilewithtempfile.NamedTemporaryFile(mode="w",suffix=".ps1",delete=False)asf:f.write(ps_script)ps_script_path=f.name# 3. 使用WinRM远程执行(需要开启WinRM服务)cmd=["python","-m","pywinrm","--host",remote_host,"--username",username,"--password",password,"--script",ps_script_path]try:result=subprocess.run(cmd,capture_output=True,text=True,timeout=3600)ifresult.returncode==0:print(f"✅ Windows Update执行成功")print(result.stdout)returnTrueelse:print(f"⚠️ Windows Update执行失败")print(result.stderr)returnFalseexceptExceptionase:print(f"⚠️ 执行Windows Update失败:{e}")returnFalsefinally:# 删除临时脚本文件os.remove(ps_script_path)# 或者使用Ansible管理Windows补丁(推荐)""" Ansible Playbook for Windows Update(win_update.yml): --- - name: Update Windows servers hosts: windows gather_facts: no tasks: - name: Install all updates win_updates: category_names: - SecurityUpdates - CriticalUpdates reboot: yes reboot_timeout: 1800 """第四步:生成安全合规报告(等保2.0)
defgenerate_security_compliance_report(scan_results,output_file):""" 生成安全合规报告(等保2.0要求) scan_results: 漏洞扫描结果(OpenVAS报告) """importopenpyxlfromopenpyxl.stylesimportFont,Alignmentprint(f"生成安全合规报告:{output_file}")# 1. 创建Excel工作簿wb=openpyxl.Workbook()ws=wb.active ws.title="安全合规报告"# 2. 写入报告头ws["A1"]="安全合规报告(等保2.0)"ws["A1"].font=Font(bold=True,size=14)ws["A2"]=f"生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"# 3. 漏洞汇总ws["A4"]="漏洞汇总"ws["A4"].font=Font(bold=True)ws["A5"]="高危漏洞数量"ws["B5"]=scan_results.get("high_vulns",0)ws["A6"]="中危漏洞数量"ws["B6"]=scan_results.get("medium_vulns",0)ws["A7"]="低危漏洞数量"ws["B7"]=scan_results.get("low_vulns",0)# 4. 补丁状态ws["A9"]="补丁状态"ws["A9"].font=Font(bold=True)ws["A10"]="已安装补丁数"ws["B10"]=scan_results.get("patches_installed",0)ws["A11"]="待安装补丁数"ws["B11"]=scan_results.get("patches_pending",0)# 5. 合规检查项(等保2.0要求)ws["A13"]="等保2.0合规检查"ws["A13"].font=Font(bold=True)compliance_checks=[("身份鉴别","通过"ifscan_results.get("auth_check")else"不通过"),("访问控制","通过"ifscan_results.get("access_control")else"不通过"),("安全审计","通过"ifscan_results.get("audit_check")else"不通过"),("入侵防范","通过"ifscan_results.get("intrusion_prevention")else"不通过"),]fori,(check_item,status)inenumerate(compliance_checks):ws[f"A{14+i}"]=check_item ws[f"B{14+i}"]=status# 不通过的项标红ifstatus=="不通过":ws[f"B{14+i}"].font=Font(color="FF0000")# 6. 保存报告wb.save(output_file)print(f"✅ 报告已生成:{output_file}")returnoutput_file第五步:影刀RPA完整流程编排
【定时触发】每周一凌晨1:00 ↓ 【Python节点】init_openvas_client() → 登录OpenVAS ↓ 【Python节点】create_scan_task() → 创建扫描任务 ↓ 【Python节点】start_scan_task() → 启动扫描 ↓ 【等待】扫描完成(OpenVAS回调或轮询状态) ↓ 【Python节点】get_scan_report() → 获取扫描报告 ↓ 【条件判断】是否有高危漏洞? ├─ 是 → 【企微告警】发送高危漏洞告警 └─ 否 → 继续 ↓ 【Python节点】run_ansible_playbook() → 执行补丁管理 ↓ 【条件判断】补丁安装是否成功? ├─ 否 → 【企微告警】发送补丁安装失败通知 └─ 是 → 继续 ↓ 【Python节点】generate_security_compliance_report() → 生成合规报告 ↓ 【发送邮件】将报告发送给安全团队 ↓ 【生成报告】"安全运维周报.xlsx" → 包含:漏洞数量、补丁状态、合规检查结果有什么坑
坑1:漏洞扫描误报(False Positive)
OpenVAS等工具可能把正常服务误判为漏洞,导致运维人员疲于应对。
解决方案:人工复核 + 建立白名单:
# 建立漏洞白名单(已知误报)VULN_WHITELIST=["TCP Timestamp",# 通常误报"ICMP Timestamp",# 通常误报# ...]deffilter_false_positives(vuln_list):"""过滤误报漏洞"""filtered=[]forvulninvuln_list:ifvuln["name"]notinVULN_WHITELIST:filtered.append(vuln)returnfiltered坑2:补丁安装后需要重启,业务中断
Windows补丁安装后经常需要重启,如果在业务高峰期重启,会导致服务中断。
解决方案:使用维护窗口 + 负载均衡:
# 1. 只在维护窗口执行补丁安装(如凌晨2:00-4:00)# 在Ansible Playbook中加条件判断""" --- - name: Install Windows updates win_updates: category_names: - SecurityUpdates reboot: no # 先不重启 when: ansible_date_time.hour >= 2 and ansible_date_time.hour <= 4 - name: Reboot if needed win_reboot: reboot_timeout: 300 when: ansible_date_time.hour >= 2 and ansible_date_time.hour <= 4 """# 2. 如果使用负载均衡,先摘除节点 → 补丁安装+重启 → 重新加入集群坑3:等保2.0合规检查项很多,手动检查耗时
等保2.0有上百个检查项,手动检查需要几天时间。
TEMU店群矩阵自动化运营核价报活动
解决方案:使用自动化合规检查工具(如Lynis、OpenSCAP):
# 使用Lynis进行自动化安全审计(Linux)wgethttps://downloads.cisofy.com/lynis/lynis.tar.gztarxvf lynis.tar.gzcdlynis ./lynis audit system# 使用OpenSCAP(支持等保2.0基线检查)oscap xccdfeval--profilexccdf_org.ssgproject.content_profile_standard\/usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml坑4:漏洞扫描对生产环境有影响
某些漏洞扫描会发送恶意payload,可能触发WAF/IPS告警,甚至导致服务崩溃。
解决方案:使用被动扫描 + 在测试环境先扫描:
# 1. 先在测试环境扫描(镜像生产环境)create_scan_task(openvas_url,token,"192.168.2.0/24")# 测试环境# 2. 生产环境使用被动扫描(不发送payload,只分析流量)# 使用Nessus的"Passive Vulnerability Scanner"(PVS)总结
| 功能 | 节省时间 | 附加价值 |
|---|---|---|
| 自动化漏洞扫描 | 每周省2小时 | 及时发现漏洞,降低风险 |
| 自动化补丁管理 | 每周省3小时 | 避免人为遗漏,提高安全性 |
| 合规报告生成 | 每次省1小时 | 满足等保2.0要求,避免合规风险 |
| 自动化加固 | — | 提高系统整体安全性 |
实际落地建议:
- 先在测试环境验证:避免扫描/补丁导致生产故障
- 使用维护窗口:在低峰期执行补丁安装
- 做好回滚准备:补丁安装失败时能快速回滚
- 定期审计:每月做一次完整的安全审计
网络安全自动化能为运维/安全团队节省70%以上的日常漏洞管理时间,同时提高系统整体安全性。