Django項目:CMDB(服務器硬件資產自動採集系統)--03--03CMDB信息安全API接口交互認證

 

  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接口交互認證————————
#settings.py

 

 

 

 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接口交互認證————————
# auth.py

 

 

 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接口————————
# views.py

 

 


 

 

 

 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接口交互認證————————
#settings.py

 

 

 

 

 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接口————————
# client.py

 


 

 

 

相關文章
相關標籤/搜索