基于Django的CMDB自动化资产扫描

前言

本项目主要目标是为了实现通过本地的pycharm实现在远程服务器上搭建项目并能够进行远程调试,同时实现主机存活探测、SSH端口存活扫描、主机登录探测等资产管理探测任务

一、本地Django项目搭建

1、创建本地Django项目cmdb

2、创建子应用scanhost
python manage.py startapp scanhost

3、设置本地化(语言,时区, 安装的应用)
# cmdb/settings.py
INSTALLED_APPS = [
# ......省略已有的应用
'scanhost', # 激活创建的app
]
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

4、应用数据库并创建超级用户
python manage.py migrate
python manage.py createsuperuser

5、启动项目浏览器访问测试
python manage.py runserver
访问:
https://127.0.0.1:8000 
https://127.0.0.1:8000/admin

6、项目代码的管理(requirements.txt, .gitignore文件和README.md文件)
(1)pip freeze > requirements.txt   %生成基本环境配置信息
(2)利用ignore插件生成.ignore文件
(3)编辑README.md文件

7、git的管理
git init   %初始化本地仓库
git add *  %添加所有更改到本地仓库
git commit -m "django project init"  %提交更改到本地仓库
git remote add origin 远程仓库的网址  %和远程仓库进行关联
git push  %提交到远程仓库

二、虚拟机的安装(windows环境下)

安装vmware并创建新的虚拟机(需要提前下载好iso镜像):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、在pycharm中远程部署

1.克隆项目到远程主机

git clone project_url  %git clone项目到远程主机

在这里插入图片描述

2.本地pycharm配置远程部署信息

进入pycharm进行图形化设置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.远程代码调试

远程服务器安装虚拟环境

注意:执行下述指令前要现在远程服务器上配置好软件仓库(可以指定阿里源)
yum install python3 -y
pip3 install virtualenv
virtualenv -p /usr/bin/python3 venv   
source venv/bin/activate   %激活虚拟环境
pip install -r requirements.txt   

配置pycharm的解释器为远程服务器解释器

在这里插入图片描述

运行远程服务器项目

在这里插入图片描述

看到如下页面表示部署成功

在这里插入图片描述

4.配置项目数据库为mysql

安装mysql

yum install mariadb-server -y
systemctl start mariadb
systemctl enable mariadb
mysql
> create database cmdb default charset='utf8';
> create user cmdb@'%' identified by "cmdb";
> grant all on cmdb.* to cmdb@'%';
mysql_secure_installation
mysql -ucmdb -pcmdb -h192.168.42.130   %测试是否配置成功
yum install mariadb-devel.x86_64 -y
yum install python3-devel -y
pip3 install mysqlclient

修改settings配置信息

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cmdb',
        'USER': 'cmdb',
        'PASSWORD': 'cmdb',
        'HOST': '192.168.42.130',
        'PORT': '3306',
    }
}

关闭远程服务器防火墙和selinux

systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

四、远程主机资产管理探测

1.主机存活探测

Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。是一款用于网络发现和安
全审计的网络安全工具。
Nmap的Python操作接口: python-nmap
python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且
可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。
注意:需要在远程主机上yum install nmap安装nmap软件,并且pip install python-nmap安装python-nmap模块(需要安装的时nmap软件和python-nmap模块,因此不能用pip安装nmap)

测试代码如下:
import nmap
def scan_active_hosts(subnet):
    # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
    nm = nmap.PortScanner()
    # 以指定方式扫描指定主机或网段的指定端口
    result = nm.scan(hosts=subnet, arguments='-n -sP')
    # print("扫描结果: ", result)
    # 返回的扫描具体的nmap命令行
    # print("nmap命令行: ", nm.command_line())
    # 返回nmap扫描的主机清单,格式为列表类型 print("主机清单: ", nm.all_hosts())
    # 查看指定主机信息
    # print('172.25.254.197的主机信息: ', nm['172.25.254.197'])
    return nm.all_hosts()
if __name__ == '__main__':
    hosts = scan_active_hosts('192.168.42.0/24')
    print(hosts)

在这里插入图片描述

2.SSH端口存活扫描

使用telnet命令探测主机列表是否属于Linux服务器
在这里插入图片描述

测试代码如下:
import telnetlib
import re
def is_ssh_open(ip):
    """判断ssh的22端口是否打开"""
    try:
        # 实例化对象
        tn = telnetlib.Telnet(host=ip, port=22, timeout=5)
        # read_until读取直到遇到了换行符或超时秒数。默认返回bytes类型,通过decode方法解码为字符 串。
        tn_result = tn.read_until(b"\n", timeout=5).decode('utf-8').lower()
    except Exception as e:
        tn_result = ''
    return True if re.findall('ssh', tn_result) else False

if __name__ == '__main__':
    for host in hosts:
        if is_ssh_open(host):
           print(f'{host}的22端口打开')

在这里插入图片描述

3.主机登录探测

SSH常用来远程登录到远程机器,有两种常用的方法:
第一种便是账号密码登录。
第二种就是公钥私钥无密码登录。
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操
作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远
程服务器的连接。
指定豆瓣源安装该模块:pip install -i https://pypi.douban.com/simple paramiko

基于paramiko实现ssh客户端密码远程登录

测试代码如下:
import paramiko
def login_ssh(host, user, passwd=None, pkey=None, cmd='hostname'):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(host, 22, user, passwd)
    stdin, stdout, stderr = client.exec_command(cmd)
    return stdout.read().decode('utf-8')

if __name__ == '__main__':
    res = login_ssh('server1', 'root', 'westos', cmd='free -m')
    print(res)

在这里插入图片描述

基于paramiko实现ssh客户端密钥远程登录

注意:要提前在远程服务器中做好生成密钥并做好本地的免密连接;要将私钥放置在指定项目目录下

测试代码如下:
import paramiko
def login_ssh(host, user, passwd=None, pkey=None, cmd='hostname'):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    if pkey:
        private = paramiko.RSAKey.from_private_key_file(pkey)
        client.connect(host, 22, user, pkey=private)
    if passwd:
        client.connect(host, 22, user, passwd)
    stdin, stdout, stderr = client.exec_command(cmd)
    return stdout.read().decode('utf-8')

if __name__ == '__main__':
    pkey = '/root/cmdb/scanhost/id_rsa'
    res = login_ssh('server1', 'root', pkey=pkey, cmd='free -m')
    print(res)

在这里插入图片描述

五、远程系统信息获取

1.数据库模型设计

from django.db import models

# Create your models here.
class Server(models.Model):
    """服务器设备"""
    sub_asset_type_choice = (
        (0, 'PC服务器'),
        (1, '刀片机'),
        (2, '小型机'),
    )
    created_by_choice = (
        ('auto', '自动添加'),
        ('manual', '手工录入'),
    )

    sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice, default=0, verbose_name="服务器类型")
    created_by = models.CharField(choices=created_by_choice, max_length=32, default='auto', verbose_name="添加方式")
    IP = models.CharField('IP地址', max_length=30, default='')
    MAC  = models.CharField('Mac地址', max_length=200, default='')
    model = models.CharField(max_length=128, null=True, blank=True, verbose_name='服务器型号')
    hostname = models.CharField(max_length=128, null=True, blank=True, verbose_name="主机名")
    os_type = models.CharField('操作系统类型', max_length=64, blank=True, null=True)
    os_distribution = models.CharField('发行商', max_length=64, blank=True, null=True)
    os_release = models.CharField('操作系统版本', max_length=64, blank=True, null=True)

    def __str__(self):
        return '%s-%s' % (self.id, self.hostname)

    class Meta:
        verbose_name = '服务器'
        verbose_name_plural = "服务器"

注意:更改数据库模型后一定要记得生成迁移脚本并写入数据库
在这里插入图片描述

2.配置文件更改

scanhosts = [
    '192.168.42.0/24']
commands = {
    'hostname': 'hostname',
    'os_type': 'uname',
    'os_distribution': 'dmidecode  -s  system-manufacturer',
    'os_release': 'cat /etc/redhat-release',
    'MAC': 'cat /sys/class/net/`[^vtlsb]`*/address',
}

在这里插入图片描述

3.视图函数更改

from cmdb.settings import *
from utils import  *
from models import Server

# 定时任务,定时扫描
def scan_hosts():
    # 访问所有要扫描的网段/IP
    for host in scanhosts:
        print("正在扫描%s......" %(host))
        # 获取所有可以ping通的主机IP
        active_hosts = scan_active_hosts(host)
        # 一次遍历判断ssh服务是否开启
        for active_host in active_hosts:
            if is_ssh_open(active_host):
                server = Server()
                # 设置IP地址
                server.IP = active_host
                # 执行指令
                for attr, command in commands.items():
                    # attr ='hostname' , command = 'hostname'
                    # 存储主机名、操作系统.....指令执行的结果
                    result = login_ssh(active_host, 'root', 'westos', cmd =command)
                    setattr(server, attr, result)
                server.save()

在这里插入图片描述

4.路由配置与后台admin管理

路由配置:
urlpatterns = [
    path('admin/', admin.site.urls),
]

后台管理:
from scanhost.models import Server
admin.site.register(Server)

在这里插入图片描述
在这里插入图片描述
配置好远程运行项目测试页面如下所示:
在这里插入图片描述

gitee项目地址:https://gitee.com/lrl-debug/cmdb.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值