文章目录
前言
本项目主要目标是为了实现通过本地的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)
配置好远程运行项目测试页面如下所示: