Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

Posted 颜言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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     # ————————

以上是关于Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证的主要内容,如果未能解决你的问题,请参考以下文章

Django项目:CMDB(服务器硬件资产自动采集系统)--09--06CMDB测试Linux系统采集硬件数据的命令04

Django项目:CMDB(服务器硬件资产自动采集系统)--10--06CMDB测试Linux系统采集硬件数据的命令05

Django项目:CMDB(服务器硬件资产自动采集系统)--01--01CMDB获取服务器基本信息

Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

Django项目:CMDB(服务器硬件资产自动采集系统)--02--02CMDB将服务器基本信息提交到API接口

硬件资产管理系统总结