1 #settings.py 2 """ 3 Django settings for AutoCmdb project. 4 5 Generated by 'django-admin startproject' using Django 2.0.6. 6 7 For more information on this file, see 8 https://docs.djangoproject.com/en/2.0/topics/settings/ 9 10 For the full list of settings and their values, see 11 https://docs.djangoproject.com/en/2.0/ref/settings/ 12 """ 13 14 import os 15 16 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 17 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 18 19 20 # Quick-start development settings - unsuitable for production 21 # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ 22 23 # SECURITY WARNING: keep the secret key used in production secret! 24 SECRET_KEY = '35d18e6vmo0k*xg#h=&kuer*t3a#@hv09@@kvz@=dd@dzw&!7w' 25 26 # SECURITY WARNING: don't run with debug turned on in production! 27 DEBUG = True 28 29 ALLOWED_HOSTS = [] 30 31 32 # Application definition 33 34 INSTALLED_APPS = [ 35 'django.contrib.admin', 36 'django.contrib.auth', 37 'django.contrib.contenttypes', 38 'django.contrib.sessions', 39 'django.contrib.messages', 40 'django.contrib.staticfiles', 41 'api.apps.ApiConfig', 42 ] 43 44 MIDDLEWARE = [ 45 'django.middleware.security.SecurityMiddleware', 46 'django.contrib.sessions.middleware.SessionMiddleware', 47 'django.middleware.common.CommonMiddleware', 48 'django.middleware.csrf.CsrfViewMiddleware', 49 'django.contrib.auth.middleware.AuthenticationMiddleware', 50 'django.contrib.messages.middleware.MessageMiddleware', 51 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 ] 53 54 ROOT_URLCONF = 'AutoCmdb.urls' 55 56 TEMPLATES = [ 57 { 58 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 'DIRS': [], 60 'APP_DIRS': True, 61 'OPTIONS': { 62 'context_processors': [ 63 'django.template.context_processors.debug', 64 'django.template.context_processors.request', 65 'django.contrib.auth.context_processors.auth', 66 'django.contrib.messages.context_processors.messages', 67 ], 68 }, 69 }, 70 ] 71 72 WSGI_APPLICATION = 'AutoCmdb.wsgi.application' 73 74 75 # Database 76 # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 77 78 DATABASES = { 79 'default': { 80 'ENGINE': 'django.db.backends.sqlite3', 81 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 82 } 83 } 84 85 86 # Password validation 87 # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators 88 89 AUTH_PASSWORD_VALIDATORS = [ 90 { 91 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 92 }, 93 { 94 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 95 }, 96 { 97 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 98 }, 99 { 100 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 101 }, 102 ] 103 104 105 # Internationalization 106 # https://docs.djangoproject.com/en/2.0/topics/i18n/ 107 108 LANGUAGE_CODE = 'en-us' 109 110 TIME_ZONE = 'UTC' 111 112 USE_I18N = True 113 114 USE_L10N = True 115 116 USE_TZ = True 117 118 119 # Static files (CSS, JavaScript, Images) 120 # https://docs.djangoproject.com/en/2.0/howto/static-files/ 121 122 STATIC_URL = '/static/' 123 124 TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),) 125 126 # ————————03CMDB信息安全API接口交互認證———————— 127 ASSET_AUTH_KEY = '299095cc-1330-11e5-b06a-a45e60bec08b' #認證的密碼 128 ASSET_AUTH_TIME = 2 #認證的有效時間 #2秒 129 # ————————03CMDB信息安全API接口交互認證————————
1 # auth.py 2 # ————————03CMDB信息安全API接口交互認證———————— 3 import time #時間模塊 4 import hashlib #哈希值 5 from AutoCmdb.settings import ASSET_AUTH_KEY #認證的密碼 6 from AutoCmdb.settings import ASSET_AUTH_TIME #認證的有效時間 7 from django.http import JsonResponse #這個類是HttpRespon的子類 8 9 ENCRYPT_LIST = [ 10 # {'encrypt': encrypt, 'time': timestamp 11 ] #已認證的密碼列表 12 13 def api_auth_method(request): 14 auth_key = request.META.get('HTTP_AUTH_KEY')#獲取(META)元素 #‘時間密碼’和 時間戳 15 print('‘時間密碼’和 時間戳:',auth_key) 16 if not auth_key: #沒有獲取到值 就 #返回認證不經過 17 return False 18 sp = auth_key.split('|') # split()經過指定分隔符對字符串進行切片 19 if len(sp) != 2: #若是切片後的字符串 是2個 就 #返回認證不經過 20 return False 21 encrypt, timestamp = sp #給切片後的2個字符串 各設置一個變量 22 timestamp = float(timestamp) #float() 函數用於將整數和字符串轉換成浮點數。 23 limit_timestamp = time.time() - ASSET_AUTH_TIME #設定服務器的時間戳 24 print('比較時間戳',limit_timestamp, timestamp) 25 if limit_timestamp > timestamp: #若是服務器的時間戳大於客戶端的時間戳 就 #返回認證不經過 26 return False 27 #和客戶端同樣進行哈希加密 28 ha = hashlib.md5(ASSET_AUTH_KEY.encode('utf-8')) #認證的密碼 29 ha.update(bytes("%s|%f" % (ASSET_AUTH_KEY, timestamp), encoding='utf-8'))#更新認證密碼#密碼+時間戳 30 result = ha.hexdigest() # 對‘時間密碼’進行哈希 31 print('對比認證值:',result,encrypt) 32 if encrypt != result:#比較客戶端哈希後的值和服務器哈希後的值是否是同樣 33 return False#不同就 #返回認證不經過 34 exist = False #是否定證過#標誌位 35 del_keys = [] 36 print('是否定證過,防止黑客:',ENCRYPT_LIST) 37 for k, v in enumerate(ENCRYPT_LIST):#enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合爲一個索引序列,同時列出數據和數據下標,通常用在 for 循環當中。 38 print('下標:',k,'認證過的值和時間:', v) 39 m = v['time'] #已認證的密碼列表 (#客戶端的時間戳) 40 n = v['encrypt'] #已認證的密碼列表( #客戶端哈希後的值) 41 if m < limit_timestamp:#已認證的密碼列表(#客戶端的時間戳) #小於 #服務器的時間戳 42 del_keys.append(k) #添加下標到 del_keys 列表 43 continue #退出循環 44 if n == encrypt: #已認證的密碼列表 #等於#客戶端哈希後的值 45 exist = True#已認證 #標誌位 46 for k in del_keys: #已經判斷過的就刪除 #客戶端哈希後的值#客戶端的時間戳 47 del ENCRYPT_LIST[k] #已認證的密碼列表 #刪除下標對應的值 48 if exist: #已認證 #標誌位 49 return False #返回認證不經過 50 ENCRYPT_LIST.append({'encrypt': encrypt, 'time': timestamp})#客戶端哈希後的值#客戶端的時間戳 51 return True #返回認證經過 52 53 def api_auth(func): 54 def inner(request, *args, **kwargs): 55 if not api_auth_method(request): # 若是 return False #返回認證不經過 56 print("{'code': 1001, 'message': 'API受權失敗'}") 57 return JsonResponse({'code': 1001, 'message': 'API受權失敗'}, json_dumps_params={'ensure_ascii': False}) 58 return func(request, *args, **kwargs) # 若是 return True #返回認證經過 59 return inner #執行#def inner(request, *args, **kwargs): 60 # ————————03CMDB信息安全API接口交互認證————————
1 from django.shortcuts import render 2 3 # Create your views here. 4 5 # views.py 6 # ————————03CMDB信息安全API接口交互認證———————— 7 from utils import auth 8 # ————————03CMDB信息安全API接口交互認證———————— 9 10 # ————————02CMDB將服務器基本信息提交到API接口———————— 11 import json #輕量級的文本數據交換格式 12 from django.views import View 13 from django.views.decorators.csrf import csrf_exempt #和HTML的{% csrf_token %}做用同樣 14 from django.utils.decorators import method_decorator #安全經過 'django.middleware.csrf.CsrfViewMiddleware', 15 from django.http import JsonResponse#這個類是HttpRespon的子類 16 class AssetView(View):# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 17 @method_decorator(csrf_exempt)#和HTML的{% csrf_token %}做用同樣,安全經過 'django.middleware.csrf.CsrfViewMiddleware', 18 def dispatch(self, request, *args, **kwargs): 19 return super(AssetView, self).dispatch(request, *args, **kwargs) 20 21 # ————————03CMDB信息安全API接口交互認證———————— 22 @method_decorator(auth.api_auth) #裝飾器 23 # ————————03CMDB信息安全API接口交互認證———————— 24 def post(self, request, *args, **kwargs):#接受客戶端到信息 25 server_info = json.loads(request.body.decode('utf-8')) 26 print('獲取到的信息: ',type(server_info),server_info) 27 server_info = json.loads(server_info)#把字符串轉換成字典 28 print('轉換後的信息: ',type(server_info),server_info) 29 hostname = server_info['hostname'] 30 print('主機名',hostname) 31 ret = {'code': 1000, 'message': '[%s]更新完成' % hostname}#返回到客戶端到信息 32 print(ret) 33 return JsonResponse(ret)#這個類是HttpRespon的子類 34 # ————————02CMDB將服務器基本信息提交到API接口————————
1 #settings.py 2 # ————————01CMDB獲取服務器基本信息———————— 3 import os 4 5 BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))##當前路徑 6 7 # 採集資產的方式,選項有:agent(默認), salt, ssh 8 MODE = 'agent' 9 10 # ————————01CMDB獲取服務器基本信息———————— 11 12 # ————————02CMDB將服務器基本信息提交到API接口———————— 13 # 資產信息API 14 ASSET_API = "http://127.0.0.1:8000/api/asset" 15 # ————————02CMDB將服務器基本信息提交到API接口———————— 16 17 # ————————03CMDB信息安全API接口交互認證———————— 18 # 用於API認證的KEY 19 KEY = '299095cc-1330-11e5-b06a-a45e60bec08b' #認證的密碼 20 # 用於API認證的請求頭 21 AUTH_KEY_NAME = 'auth-key' 22 # ————————03CMDB信息安全API接口交互認證————————
1 # client.py 2 # ————————01CMDB獲取服務器基本信息———————— 3 from src import plugins #__init__.py 4 from lib.serialize import Json #轉成字符串或者模式 5 6 # ————————02CMDB將服務器基本信息提交到API接口———————— 7 import requests #僞造頁面訪問 8 from config import settings #文件配置 9 # ————————02CMDB將服務器基本信息提交到API接口———————— 10 11 # ————————03CMDB信息安全API接口交互認證———————— 12 import hashlib 13 import time 14 # ————————03CMDB信息安全API接口交互認證———————— 15 16 class AutoBase(object): 17 18 # ————————02CMDB將服務器基本信息提交到API接口———————— 19 def __init__(self): 20 self.asset_api = settings.ASSET_API #ASSET_API = "http://127.0.0.1:8000/api/asset" 21 22 # ————————03CMDB信息安全API接口交互認證———————— 23 self.key = settings.KEY # 用於API認證的KEY#KEY = '299095cc-1330-11e5-b06a-a45e60bec08b' 24 self.key_name = settings.AUTH_KEY_NAME # 'auth-key' API認證的請求頭 25 # ————————03CMDB信息安全API接口交互認證———————— 26 27 # ————————03CMDB信息安全API接口交互認證———————— 28 def auth_key(self):#API接口認證 29 ha = hashlib.md5(self.key.encode('utf-8'))#認證的密碼 30 time_span = time.time() #如今的時間戳 #1529819687.8867188 31 ha.update(bytes("%s|%f" % (self.key, time_span), encoding='utf-8'))#更新認證密碼#密碼+時間戳 32 encryption = ha.hexdigest() # 對‘時間密碼’進行哈希 33 result = "%s|%f" % (encryption, time_span) #把‘時間密碼’和 時間戳(解密用) 做爲 API認證的請求頭 34 print('‘時間密碼’和 時間戳:',result) 35 return {self.key_name: result} # 'auth-key' API認證的請求頭 36 # ————————03CMDB信息安全API接口交互認證———————— 37 38 def post_asset(self, msg):#post方式向API接口提交資產信息 39 status = True#是否獲取到信息 40 try: 41 # ————————03CMDB信息安全API接口交互認證———————— 42 headers = {} 43 headers.update(self.auth_key())##認證的密碼 44 # ————————03CMDB信息安全API接口交互認證———————— 45 response = requests.post( 46 url=self.asset_api, 47 # ————————03CMDB信息安全API接口交互認證———————— 48 headers=headers, 49 # ————————03CMDB信息安全API接口交互認證———————— 50 json=msg 51 ) 52 except Exception as e: 53 response = e 54 status = False #獲取信息時出現錯誤 55 print(response.json()) 56 # ————————02CMDB將服務器基本信息提交到API接口———————— 57 58 def process(self):#派生類須要繼承此方法,用於處理請求的入口 59 raise NotImplementedError('您必須實現過程的方法') 60 61 class AutoAgent(AutoBase): 62 def process(self): 63 server_info = plugins.get_server_info()#獲取本地基本信息 64 server_json = Json.dumps(server_info.data)#json.dumps將 Python 對象編碼成 JSON 字符串 65 print('提交資產信息:',server_json) 66 # ————————01CMDB獲取服務器基本信息———————— 67 68 # ————————02CMDB將服務器基本信息提交到API接口———————— 69 self.post_asset(server_json)# post方式向接口提交資產信息 70 # ————————02CMDB將服務器基本信息提交到API接口————————