项目实战: CMDB自动化资产扫描(1)(项目流程介绍及用到的基本工具)

1.项目介绍

本项目通过KVM虚拟化搭建Linux系统集群,使用 Ansible实现Linux集群下的批量部署与自动化管理,实现Web形式的自动化运维系统,集中批量控制服务器, 最终实现能支撑1000台实例的环境提供管理和自动化任务, 提高运维工程师的工作质量和效率。 项目基于HTTP实现自动化任务接受和响应接口设计,基于MySQL用作的关系型数据存取, 基于Redis的任务锁机制和消息队列, 基于MongoDB的事件日志记录, 最终实现邮件通知功能、敏感数据加密功能、日志事件记录功能。这个文档主要目标是实现自动化资产扫描, 扫描指定网段的服务器资产信息。

2.项目技术分析

(1)基本技能
DevOPS构建之路;Python基础语法;Django框架
(2)自动化资产扫描发现
资产扫描的作用;nmap的作用;telnetlib端口扫描;pexpect登录探测;paramiko登录探测;Docker容器扫描;KVM虚拟机扫描
snmp网络设备扫描;SDK调用扫描ESXI资产信息
(3)Ansible自动化任务
Ansible的安装与配置;Python与Ansible的操作;Ansible adhoc;Ansible playbook;核心类调用;API 接口的封装;方法的改写
Redis消息存储;Mongo事件日志。

(4)整体工程设计

资产的自动化扫描发现:用Python程序扫描发现企业内部的所有资产(服务器资产),当资产出现变动时能自动及时的发现并完成资产变更(eg: 服务器IP变更、机器集体报废)。
Ansible的自动化任务执行:用Ansible的ad-hoc和playbook实现批量主机的自动化任务。

3. 项目环境搭建(后续完善)

4.资产管理

(1)资产管理探测流程

存活探测: 获取局域网内存活的IP列表
主机探测: 获取系统版本(SN、版本、MAC地址)
主机关系探测: 识别宿主主机和虚拟机的关系
网络设备的探测: 探测网络设备信息(SN、设备名等),使用snmp协议

其他设备的探测:

(2)主机存活探测模块和工具

1.Nmap探测工具

Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。是一款用于网络发现和安
全审计的网络安全工具。

主机发现:

# 使用-sP开关(Arp ping)执行PING命令,与windows / linux ping命令类似。
$ ping -c1 -w1 172.25.254.197
# 探测主机IP是否存活, &>/dev/null并将所有的输入重定向到垃圾箱
# && 如果前面的指令执行成功, 做什么操作(echo ok)
# || 如果前面的指令执行失败, 做什么操作(echo fail)
$ ping -c1 -w1 172.25.254.250 &>/dev/null && echo ok || echo fail
# 使用nmap命令, 如果报错-bash: nmap: command not found, 则yum 安装nmap安装包
$ nmap -n -sP 172.25.254.197
$ nmap -n -sP 172.25.254.0/24

端口扫描 - 枚举目标主机上的开放端口。

# Nmap默认端口的扫描范围1-10000
$ nmap -n -p 172.25.254.197
# 具体指定要扫描的端口为50-80
$ nmap -n -p50-80 172.25.254.197
# 具体指定要扫描的端口为22和80
$ nmap -n -p22,80 172.25.254.197

查看172.25.254.20这台 主机是否开启?

nmap -PS -PE 172.25.254.20

2.Nmap的Python操作接口: python-nmap

python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。使用前需安装该模块

import nmap
nm = nmap.PortScanner()
result = nm.scan(host='172.25.254.0/24',arguments='-n -SP')
print("扫描结果: ", result)
print("nmap命令行: ", nm.command_line())
print("主机清单: ", nm.all_hosts())
print('172.25.254.20的主机信息: ', nm['172.25.254.20'])

3.SSH端口存活扫描

使用telnet命令探测主机列表是否属于Linux服务器。

4.Python的SSH登录模块paramiko

Python的SSH登录模块paramiko。
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

使用豆瓣的镜像源, 安装paramiko模块并指定安装版本为2.6.0.
$ pip install -i https://pypi.douban.com/simple paramiko==2.6.0
paramiko核心组件
paramiko包含两个核心组件:SSHClient和SFTPClient(sftp=ssh file transfer protocol)。
SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输
(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操
作,如文件上传、下载、修改文件权限等操作。
项目代码: 基于paramiko实现ssh客户端密码远程登录

SSHClient代码如下:

import paramiko
def login_ssh_key(hostname='172.25.254.20',port=22,username='root',
                  private_key='id_rsa',command='df -h'):
    pkey = paramiko.RSAKey.from_private_key_file(private_key)
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname,port,username,pkey=pkey)
    stdin, stdout, stderr = client.exec_command(command)
    return stdout.read().decode('utf-8')
if __name__ == '__main__':
    result = login_ssh_key()
    print(result)

SFTPClient代码如下:

import paramiko
def paramiko_sftp(hostname='172.25.254.20',port=22,username='root',password='123',
                  local_file='/etc/passwd',remote_file='/mnt/westos1'):
    tran = paramiko.Transport((hostname,port))
    tran.connect(username=username,password=password)
    client = paramiko.SFTPClient.from_transport(tran)
    client.put(local_file,remote_file)
    print('file upload success')


result = paramiko_sftp()
print(result)

(3)系统信息获取

猜你喜欢

转载自blog.csdn.net/weixin_43215948/article/details/107608738