1 #main.py 2 #本文件寫全部的鏈接交互動做程序 3 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始———————————————— 4 from Fortress import models #數據庫 5 import subprocess#系統交互#subprocess模塊容許咱們建立子進程,鏈接他們的輸入/輸出/錯誤管道,還有得到返回值。 6 import uuid #通用惟一識別碼 7 import os #系統 8 BASE_DIR = os.path.dirname(os.path.abspath(__file__))# 動態路徑,當前文件的父目錄 9 #E:\堡壘機\eye\Fortress\backend 10 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束———————————————— 11 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 12 from django.contrib.auth import authenticate #驗證用戶的證書 13 import getpass#輸入密碼時不顯示密碼 14 #用戶登錄堡壘機後的交互程序 15 class HostManager(object): 16 def __init__(self): 17 self.user = None #當前帳號 18 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始———————————————— 19 def get_session_id(self,bind_host_obj,uuid):#建立應用會話的id 20 print('建立新的會話:',self.user.id,bind_host_obj,uuid) 21 session_obj = models.Session(user_id = self.user.id,bind_host=bind_host_obj,uuid=uuid)#建立數據庫 22 session_obj.save()#會話保存 23 print('新的會話的ID:',session_obj.id) 24 return session_obj#返回會話 25 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束———————————————— 26 def interactive(self):#交互腳本 27 # ————————————————登陸堡壘機 開始———————————————— 28 print("----開始 運行交互腳本----") 29 count = 0 #用戶名密碼試錯的次數 30 while count < 6:#用戶名密碼試錯的次數 31 username = input("請輸入你的用戶名:").strip()#用戶名 32 password = getpass.getpass("請輸入你的密碼:").strip()#密碼 33 user = authenticate(username=username,password=password)#驗證用戶名密碼 34 if user: #驗證成功 35 print("歡迎 %s 登錄使用!".center(50,'-') % user.name ) 36 self.user = user #驗證成功,賦值 37 break #退出無限循環 38 else: 39 print("用戶名或密碼錯誤!") 40 count += 1#用戶名密碼試錯的次數 41 else: 42 print("----結束 運行交互腳本----") 43 exit("用戶名密碼試錯的次數到了,再見。") 44 """ 45 #————從外部調用django的方法 開始———— 46 #注意寫,從外部調用django的方法 E:\堡壘機\eye\fortess_manage.py 47 #注意,到admin後臺配置主機給帳戶 48 # ———————————— 49 #運行 Terminal 50 #E:\堡壘機\eye>python fortess_manage.py 51 #Username:admin@qq.com 52 #Password:admin123456 53 #————從外部調用django的方法 結束———— 54 """ 55 # ————————————————登陸堡壘機 結束———————————————— 56 # ——————————————選擇要鏈接的主機 開始———————————— 57 if self.user: #驗證登陸成功 58 while True: 59 #————————打印當前帳戶全部的能夠登陸主機 開始—————— 60 for index,host_group in enumerate(self.user.host_groups.all()): #select_related() 61 print("%s.\t%s[%s]" %(index,host_group.name, host_group.bind_hosts.count())) 62 print("z.\t未分組主機[%s]" %(self.user.bind_hosts.count())) 63 #————————打印當前帳戶全部的能夠登陸主機 結束—————— 64 # ————————開始選擇分組 開始—————— 65 choice = input("%s>>:"% self.user).strip()#輸入選擇 66 if len(choice) == 0:#長度等於0 67 continue#跳過此次循環 68 selected_host_group = None #選擇分組 69 if choice.isdigit():#檢測字符串是否只由數字組成 70 choice = int(choice)#轉成整數 71 if choice >=0 and choice <= index: #判斷輸入的選項是否合法 72 selected_host_group = self.user.host_groups.all()[choice]#迭代選擇分組 73 elif choice == 'z':#未分組 74 selected_host_group = self.user 75 # ————————開始選擇分組 結束—————— 76 # ————————開始選擇主機 開始—————— 77 if selected_host_group: #選擇分組後選擇主機 78 while True: 79 print("當前選擇的分組: %s ".center(50,'-') %selected_host_group) 80 # ————————打印分組裏的全部主機 開始—————— 81 for index, bind_host in enumerate(selected_host_group.bind_hosts.all()): 82 print("%s.\t%s" % (index, bind_host)) 83 print("返回上級菜單,請按 b ") 84 # ————————打印分組裏的全部主機 結束—————— 85 # ————————選擇分組裏的主機 開始—————— 86 choice = input("%s>>>:" % self.user).strip()#輸入選擇 87 if choice.isdigit():#檢測字符串是否只由數字組成 88 choice = int(choice)#轉成整數 89 if choice >= 0 and choice <= index:#判斷輸入的選項是否合法 90 bind_host = selected_host_group.bind_hosts.all()[choice]#迭代選擇主機 91 print("準備登陸 %s 主機".center(50,'-') %bind_host) 92 # ————————選擇分組裏的主機 結束—————— 93 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始———————————————— 94 if bind_host.host.enabled:#是否啓用了此主機 95 ssh_uuid = uuid.uuid4() # 惟一標識 96 session_obj = self.get_session_id(bind_host, ssh_uuid) # 建立應用會話的id 97 print("建立會話審計記錄,用ID關聯shell腳本建立的文件名:", session_obj) 98 # ————————在Linux系統下打開新進程的shell監控腳本 開始———————— 99 monitor_script = subprocess.Popen("sh %s/session_tracker.sh %s %s" 100 % (BASE_DIR, # 動態路徑,當前文件的父目錄 101 ssh_uuid, # 惟一標識 102 session_obj.id),#新的會話的ID 103 shell=True,#若是把shell設置成True,指定的命令會在shell裏解釋執行。 104 stdout=subprocess.PIPE, # subprocess 實現管道( pipe )交互操做讀/寫通訊 105 stderr=subprocess.PIPE) # stdout, stdin, stderr的中文名字分別是標準輸出,標準輸入和標準錯誤。 106 print('監控執行的腳本:', monitor_script) 107 # print('讀取標準錯誤,很慢,測試時才用:',monitor_script.stderr.read()) 108 # ————————在Linux系統下打開新進程的shell監控腳本 結束———————— 109 # ————————只能在Linux系統下運行 開始———————— 110 print('準備鏈接遠程主機......') 111 cmd_str = "sshpass -p %s ssh -p %s %s@%s -E %s -o StrictHostKeyChecking=no" % ( 112 bind_host.remote_user.password, # 登陸的密碼 113 bind_host.host.port, # 登陸的IP端口 114 bind_host.remote_user.username, # 登陸的帳號 115 bind_host.host.ip_addr, # 登陸的IP地址 116 ssh_uuid) # 惟一標識 117 # sshpass 能夠在命令行直接使用密碼來進行遠程鏈接和遠程拉取文件。只能在Linux系統下運行。 118 # -E 臨時文件名 -o StrictHostKeyChecking=no 忽略登錄確認提示 119 print('要執行的命令:', cmd_str)#實際生產時關閉 120 # 要執行的命令: sshpass -p 123456 ssh -p 22 root@192.192.168.127 -E a1255ca0-2ed8-4a56-866b-758e96d871d5 -o StrictHostKeyChecking=no 121 subprocess.run(cmd_str, shell=True) # 只能在Linux系統下運行 122 # ————————只能在Linux系統下運行 結束———————— 123 else: 124 print('此主機未啓用,請聯繫管理員!!') 125 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束———————————————— 126 elif choice == 'b':#退出 127 break #終止無限循環 128 # ————————開始選擇主機 結束—————— 129 # ——————————————選擇要鏈接的主機 結束———————————— 130 #————————————————02堡壘機設計後臺交互程序 結束———————————————— 131 132 133 134 """ 135 ————————安裝django 開始———————— 136 login as: root 137 root@192.192.168.126's password: 123456 138 [root@localhost ~]# python3 139 >>> import django 140 >>> exit() 141 [root@localhost ~]# pip3 install --upgrade pip 142 [root@localhost ~]# pip3 install --default-timeout=1000 Django==2.1.4 143 [root@localhost ~]# python3 144 >>> import django 145 >>> print(django.get_version()) 146 2.1.4 147 >>> exit() 148 ————————安裝django 結束———————— 149 """#安裝django 150 """ 151 ————————安裝strace跟蹤線程 開始———————— 152 [root@localhost ~]# yum -y install strace 153 [root@localhost ~]# ssh root@192.192.168.110 | 154 root@192.192.168.110's password:123456 | 155 | [root@localhost ~]# ps -ef 156 | UID PID PPID C STIME TTY TIME CMD 157 | root 5999 5936 0 08:06 pts/2 00:00:00 ssh root@192.192.168.110 158 | [root@localhost ~]# sudo strace -p 5999 159 [root@localhost ~]# l | read(4, "l", 16384) = 1 160 | [root@localhost ~]# sudo strace -p 5999 -o eye.log 161 [root@localhost ~]# A | 162 | [root@localhost ~]# cat eye.log 163 | [root@localhost ~]# cat eye.log |grep 'read(4' 164 | read(4, "A", 16384) = 1 165 ————————安裝strace跟蹤線程 結束———————— 166 """#安裝strace跟蹤線程 167 """ 168 ————————sshpass能夠在命令行直接使用密碼來進行遠程鏈接和遠程拉取文件 開始———————— 169 [root@localhost ~]# yum -y install sshpass 170 [root@localhost ~]# sshpass -p 123456 ssh -p 22 root@192.192.168.110 171 [root@localhost ~]# ip addr 172 ————————用python調用sshpass 開始———————— 173 [root@localhost ~]# python3 174 >>> import subprocess 175 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -o StrictHostKeyChecking=no",shell=True) 176 ————————另啓一個會話查看———————— 177 [root@localhost ~]# ps -ef 178 UID PID PPID C STIME TTY TIME CMD 179 root 5147 5146 0 09:41 pts/8 00:00:00 ssh root@192.192.168.110 -o StrictHostKeyCh 180 [root@localhost ~]# sudo strace -fp 5147 -t -o eye.log 181 [root@localhost ~]# cat eye.log 182 ————獲取進程號 開始———— 183 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' 184 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh 185 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass 186 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass | awk '{ print $2 }' 187 ————獲取進程號 結束———— 188 ————————用python調用sshpass 結束———————— 189 ————————sshpass能夠在命令行直接使用密碼來進行遠程鏈接和遠程拉取文件 結束———————— 190 """#sshpass 191 """ 192 ————————獲取進程號,惟一標識 開始———————— 193 [root@localhost ~]# python3 194 >>> import subprocess 195 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs123 -o StrictHostKeyChecking=no",shell=True) 196 ————————另啓一個登錄會話———————— 197 [root@localhost ~]# python3 198 >>> import subprocess 199 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs456 -o StrictHostKeyChecking=no",shell=True) 200 ————————另啓一個會話查看———————— 201 [root@localhost ~]# ps -ef | grep 'root@192.192.168.110' | grep ssh | grep -v sshpass | grep wybs123 | awk '{ print $2 }' 202 [root@localhost ~]# ps -ef | grep wybs123 | grep ssh | grep -v sshpass | awk '{ print $2 }' 203 ————————獲取進程號,惟一標識 結束———————— 204 """#獲取進程號 205 """ 206 E:\堡壘機\eye\Fortress\backend\session_tracker.sh 複製到 CentOS-7 的 /home/ 目錄下 207 ————————SH腳本測試 開始———————— 208 [root@localhost ~]# sh /home/session_tracker.sh 209 [root@localhost ~]# sh /home/session_tracker.sh wybs123 99 210 ————————SH腳本測試 結束———————— 211 ————————用python3測試SH腳本 開始———————— 212 [root@localhost ~]# python3 213 >>> import subprocess 214 >>> subprocess.run("sshpass -p 123456 ssh root@192.192.168.110 -E wybs123 -o StrictHostKeyChecking=no",shell=True) 215 ————————另啓一個會話查看———————— 216 [root@localhost ~]# ps -ef | grep wybs123 | grep ssh | grep -v sshpass | awk '{ print $2 }' 217 [root@localhost ~]# sh /home/session_tracker.sh wybs123 99 218 ————————用python3測試SH腳本 結束———————— 219 """#SH腳本測試 220 """ 221 ————————建立跳板機的獨立用戶 開始———————— 222 [root@localhost ~]# useradd jump |#新建用戶(跳) 223 [root@localhost ~]# passwd jump |#修改用戶(跳)的密碼 224 新的 密碼:admineye 225 從新輸入新的 密碼:admineye 226 ————————建立跳板機的獨立用戶 結束———————— 227 ————————測試獨立用戶Django使用權限 開始———————— 228 [root@localhost ~] su jump 229 [jump@localhost root]$ python3 230 >>> import django 231 >>> print(django.get_version()) 232 2.1.4 233 >>> exit() 234 [jump@localhost root]$ su root 235 密碼:123456 236 ————————測試獨立用戶Django使用權限 結束———————— 237 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 開始——site-packages—————— 238 [root@localhost ~]# python3 239 >>> import sys 240 >>> sys.path 241 >>> exit() 242 [root@localhost ~]# sudo cp -rp /usr/lib64/anacnda3/lib/python3.6/site-packages/* /home/jump/.local/lib/python3.6/site-packages/ 243 [root@localhost ~]# cd /home/jump/.local/lib/python3.6/site-packages/ 244 [root@localhost ~]# sudo chown -R jump.jump * 245 [root@localhost ~]# ll 246 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 結束——site-packages—————— 247 """#獨立用戶 248 """ 249 E:\堡壘機\eye 將項目複製到 CentOS-7 的 /home/jump/ 目錄下 250 ———————複製Python代碼到服務用戶目錄下 開始————————— 251 注意:修改settings中的設置,使其容許全部網段訪問: ALLOWED_HOSTS = ['*'] 252 [root@localhost ~]# cd /home/jump/eye 253 [root@localhost eye]# ls 254 [root@localhost eye]# python3 manage.py runserver 0.0.0.0:9000 |#運行服務時使用0.0.0.0:9000做爲IP和端口,執行命令 255 [root@localhost ~]# systemctl stop firewalld.service |#注意:關閉防火牆 256 ———————複製Python代碼到服務用戶目錄下 結束————————— 257 258 ———————測試項目交互腳本 開始————————— 259 [root@localhost ~]# python3 /home/jump/eye/fortess_manage.py 260 [root@localhost ~]# chmod -R 777 /home/jump |#修改權限,複製python項目文件到Luxin系統後注意從新賦值權限 261 ———————測試項目交互腳本 結束————————— 262 """#啓動服務 263 """ 264 ———————Windows系統測試 開始————————— 265 瀏覽器訪問:http://192.192.168.143:9000/admin/ 266 ————putty測試 開始———— 267 login as: jump 268 jump@192.192.168.143's password:admineye 269 ----開始 運行交互腳本。。。---- 270 Username:admin@qq.com 271 Password:admin123456 272 ----------------------歡迎 admin----------------------- 273 0. 測試組[1] 274 z. 未分組主機[1] 275 admin>>: 276 ————putty測試 結束———— 277 ———————Windows系統測試 結束————————— 278 """#Windows系統測試 279 """ 280 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 開始—————————— 281 [root@localhost ~]# vim /etc/sudoers 282 ———————進入vim文本編輯操做 開始————————— 283 | i |#進入插入文本模式 284 _______到底部插入 開始_______ 285 %jump ALL=NOPASSWD:ALL #/use/bin/strace,/usr/bin/python3 286 _______到底部插入 結束_______ 287 | Esc |#退出插入文本模式 288 | Shift + Q |#進行EX操做模式 289 | wq! |#保存#退出vim文本編輯操做 290 ———————進入vim文本編輯操做 結束————————— 291 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 結束—————————— 292 """#建立日誌 293 """ 294 ————————配置獨立用戶啓動項 開始———————— 295 [root@localhost ~]# cd /home/jump 296 [root@localhost jump]# ls -a 297 . .. .bash_logout .bash_profile .bashrc 298 [root@localhost eye]# vim .bashrc 299 ————若是vim打開錯誤 開始———— 300 [root@localhost conf]# rpm -qa|grep vim |#若是vim打開錯誤 301 [root@localhost conf]# yum -y install vim* |#安裝vim 302 ————若是vim打開錯誤 結束———— 303 ————進入vim文本編輯操做 開始———— 304 | i |#進入插入文本模式 305 _____原有的內容 開始_____ 306 if [ -f /etc/bashrc ]; then 307 . /etc/bashrc 308 fi 309 _____原有的內容 結束_____ 310 _____插入的內容 開始_____ 311 python3 /home/jump/eye/fortess_manage.py 312 logout 313 _____插入的內容 結束_____ 314 | Esc |#退出插入文本模式 315 | Shift + Q |#進行EX操做模式 316 | w |#保存vim文本編輯操做 317 | q |#退出vim 318 ————進入vim文本編輯操做 結束———— 319 ————————配置獨立用戶啓動項 結束———————— 320 """#啓動項 321 """ 322 ———————複製Python代碼,後快速啓動服務 開始————————— 323 [root@localhost ~]# chmod -R 777 /home/jump |#修改權限,複製python項目文件到Luxin系統後注意從新賦值權限 324 [root@localhost ~]# python3 /home/jump/eye/manage.py runserver 0.0.0.0:9000 325 ———————複製Python代碼,後快速啓動服務 結束————————— 326 """#快速啓動服務
1 #models.py 2 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 3 from django.db import models #模型 4 from django.contrib.auth.models import BaseUserManager,AbstractBaseUser,PermissionsMixin#DJANGO帳戶繼承重寫 5 #重寫DJAGO帳號表 6 class UserProfileManager(BaseUserManager): 7 def create_user(self, email, name, password=None):#建立並保存一個普通用戶給定的郵箱地址,密碼。 8 if not email: 9 raise ValueError('用戶必須有一個電子郵箱地址') 10 user = self.model(email=self.normalize_email(email),#驗證郵箱格式 11 name=name,)#建立一條普通用戶記錄 12 user.set_password(password)#對密碼加密 13 user.save(using=self._db)#從臨時文件讀取出來數據,進行保存。 14 return user 15 def create_superuser(self, email,name,password):#建立並保存一個超級用戶給定的郵箱地址,密碼。 16 user = self.create_user(email,name=name,password=password)#建立一條超級用戶記錄 17 user.is_admin = True#管理員 18 user.save(using=self._db)#從臨時文件讀取出來數據,進行保存。 19 return user 20 #重寫DJAGO帳號表 21 class UserProfile(AbstractBaseUser,PermissionsMixin): 22 # ————#DJANGO帳號必需要有的字段 開始———— 23 email = models.EmailField( max_length=255,unique=True,verbose_name='郵箱地址') 24 name = models.CharField(max_length=32,verbose_name='暱稱') 25 is_active = models.BooleanField(default=True,verbose_name='是否啓用') 26 is_admin = models.BooleanField(default=False,verbose_name='管理員',help_text='指定用戶是否能夠登陸管理網站而且擁有所有權限',) 27 is_staff = models.BooleanField(default=True,verbose_name='員工狀態',help_text='指定用戶是否能夠登陸管理網站',) 28 # ————#DJANGO帳號必需要有的字段 結束———— 29 30 # ————————————————02堡壘機設計後臺交互程序 開始———————————————— 31 bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="關聯的主機") 32 host_groups = models.ManyToManyField('HostGroups',blank=True,verbose_name="關聯的分組") 33 # ————————————————02堡壘機設計後臺交互程序 結束———————————————— 34 35 #————#建立用戶記錄 開始———— 36 objects = UserProfileManager()#建立用戶記錄,固定的變量名(objects) 37 USERNAME_FIELD = 'email' #用於登陸的字段 38 REQUIRED_FIELDS = ['name']#必須填寫 39 # ————#建立用戶記錄 結束———— 40 # ————#DJANGO帳號必需要有的方法 開始———— 41 def get_full_name(self):#用戶確認的電子郵件地址 42 return self.email 43 def get_short_name(self):#用戶確認的電子郵件地址 44 return self.email 45 # ————#DJANGO帳號必需要有的方法 結束———— 46 def __str__(self):# __unicode__ on Python 2 47 return self.email 48 # ————#DJANGO帳號權限 開始———— 49 def has_perm(self, perm, obj=None):#權限#用戶有一個特定的許可嗎? 50 return True 51 def has_module_perms(self, app_label):#用戶有權限查看應用名稱嗎? 52 return True 53 # ————#DJANGO帳號權限 結束———— 54 class Meta: 55 verbose_name_plural='00帳戶' 56 # ————自定製admin 開始———— 57 #到admin.py裏給DJANGO帳戶註冊顯示 #E:\堡壘機\eye\Fortress\admin.py 58 # ————自定製admin 結束———— 59 # ————註冊到配置文件 開始———— 60 #到配置文件裏給DJANGO帳戶指定模型 #E:\堡壘機\eye\eye\settings.py 61 #AUTH_USER_MODEL = 'web.UserProfile' 62 # ————註冊到配置文件 結束———— 63 #————————————————01堡壘機重寫DJANGO帳戶表 結束———————————————— 64 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 65 #01標籤 66 class Tag(models.Model): 67 name = models.CharField(max_length=64,unique=True) #標籤名#CharField定長文本#最長度=64字節#不能夠重複 68 class Meta:#經過一個內嵌類 "class Meta" 給你的 model 定義元數據 69 verbose_name_plural = "01標籤" #verbose_name_plural給你的模型類起一個更可讀的名字 70 def __str__(self): # __str__()是Python的一個「魔幻」方法,這個方法定義了當object調用str()時應該返回的值。 71 return self.name # 返回 #標籤名 72 #02機房 73 class IDC(models.Model): 74 name = models.CharField(max_length=64, unique=True,verbose_name="機房名") 75 address=models.CharField(max_length=256,blank=True,null=True,verbose_name="機房地址") 76 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="機房的備註") 77 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 78 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 79 class Meta: 80 verbose_name_plural='02機房' 81 def __str__(self): 82 return self.name 83 #03主機 84 class Host(models.Model): 85 hostname = models.CharField(max_length=64,unique=True,verbose_name="主機名") 86 ip_addr = models.GenericIPAddressField(verbose_name="主機IP地址") 87 port = models.SmallIntegerField(default=22,verbose_name="主機端口") 88 idc = models.ForeignKey('IDC',blank=True,null=True,on_delete=models.CASCADE,verbose_name="主機所在的機房") 89 system_type_choices = ((0,'Linux'),(1,'Windows')) 90 system_type = models.SmallIntegerField(choices=system_type_choices,default=0,verbose_name="操做系統類型") 91 enabled = models.BooleanField(default=1,verbose_name="是否啓用本機") 92 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主機的備註") 93 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 94 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 95 class Meta: 96 verbose_name_plural='03主機' 97 unique_together = ('ip_addr','port') 98 def __str__(self): 99 return "%s(%s)" % (self.hostname, self.ip_addr) 100 #04帳號密碼 101 class RemoteUser(models.Model): 102 auth_type_choices =((0,'ssh-password'), (1,'ssh-key')) 103 auth_type = models.SmallIntegerField(choices=auth_type_choices,default=0,verbose_name="鏈接方式,密碼或者密鑰") 104 userlevel=models.CharField(max_length=128,blank=True,null=True,verbose_name="用戶等級") 105 username = models.CharField(max_length=128,verbose_name="用戶名") 106 password = models.CharField(max_length=256,verbose_name="密碼或者密鑰",help_text="若是鏈接方式選擇爲ssh-key,那此處就應該是key的路徑") 107 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="帳號密碼的備註") 108 host_prompt=models.ManyToManyField("Host",blank=True,verbose_name="可關聯的主機",help_text="關聯主機與帳號密碼提示") 109 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 110 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 111 class Meta: 112 verbose_name_plural='04帳號密碼' 113 unique_together = ('auth_type', 'username', 'password') # 聯合惟一 114 def __str__(self): 115 return "%s:%s:%s" %(self.id,self.username,self.memo) 116 #05關聯主機與帳號密碼 117 class BindHost(models.Model): 118 host = models.ForeignKey('Host',on_delete=models.CASCADE,verbose_name="遠程主機名") 119 remote_user = models.ForeignKey('RemoteUser',on_delete=models.CASCADE,verbose_name="遠程用戶名") 120 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="關聯的備註") 121 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 122 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 123 class Meta: 124 verbose_name_plural = '05關聯主機與帳號密碼' 125 unique_together = ('host', 'remote_user')#聯合惟一 126 def __str__(self): 127 return "<%s:%s:%s>" %(self.host.id,self.host.hostname,self.remote_user.username) 128 #06主機分組 129 class HostGroups(models.Model): 130 name = models.CharField(max_length=64,unique=True,verbose_name="分組名稱") 131 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="主機分組的備註") 132 bind_hosts = models.ManyToManyField('BindHost',blank=True,verbose_name="遠程主機") 133 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 134 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 135 class Meta: 136 verbose_name_plural='06主機分組' 137 def __str__(self): 138 return self.name 139 #————————————————02堡壘機設計後臺交互程序 結束———————————————— 140 #————————————————03堡壘機在Linux系統裏記錄會話日誌 開始———————————————— 141 #07會話日誌 142 class Session(models.Model): 143 user = models.ForeignKey('UserProfile',on_delete=models.CASCADE,verbose_name='堡壘機帳號') 144 bind_host = models.ForeignKey('BindHost',on_delete=models.CASCADE,verbose_name='遠程主機') 145 uuid = models.CharField(max_length=128,default='n/a',verbose_name='惟一標識,進程ID') 146 cmd_count = models.IntegerField(default=0,verbose_name='命令執行數量') 147 stay_time = models.IntegerField(default=0,verbose_name="停留時長(秒)" ,help_text="每次刷新自動計算停留時間") 148 closed = models.BooleanField(default=False,verbose_name='是否關閉這條會話記錄') 149 memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="會話日誌的備註") 150 tag = models.ManyToManyField("Tag",blank=True,verbose_name="標籤")#多對多關聯到 標籤表 151 date = models.DateTimeField(auto_now_add=True,verbose_name='建立時間') 152 def __str__(self): 153 return '<id:%s user:%s bind_host:%s>' % (self.id,self.user.email,self.bind_host.host) 154 class Meta: 155 verbose_name_plural = '07會話日誌' 156 #————————————————03堡壘機在Linux系統裏記錄會話日誌 結束———————————————— 157 158 """ 159 # ————————————————Django中使用中國時區和中文 開始———————————————— 160 到settings.py裏修改#E:\堡壘機\eye\eye\settings.py 161 LANGUAGE_CODE = 'zh-Hans' 162 TIME_ZONE = 'Asia/Shanghai' 163 若是須要全局配置默認時區和語言,可在django下的conf模塊下的global_settings.py中進行配置 164 全部可選的語言選項可經過python輸入如下代碼查看: 165 from django.conf.locale import LANG_INFO 166 {key: LANG_INFO[key]['name_local'] for key in LANG_INFO if 'name_local' in LANG_INFO[key]} 167 # ————————時間擴展 開始———————— 168 USE_TZ = True 169 當設置了 USE_TZ 爲 True 時,Django 與其餘系統或服務的交流將強制使用 UTC 時間。 170 1.保證存儲到數據庫中的是 UTC 時間; 171 2.在函數之間傳遞時間參數時,確保時間已經轉換成 UTC 時間; 172 # ——Django中跨時區 開始—— 173 通常不跨時區的應用,能夠不使用時區,即在settings.py設置 174 USE_TZ = False 175 這樣存儲的時間就是無時區的時間。 176 # ——Django中跨時區 結束—— 177 # ————————時間擴展 結束———————— 178 # ————————————————Django中使用中國時區和中文 結束———————————————— 179 """#Django中使用中國時區和中文 180 """ 181 # ————————————————Django數據庫生成 開始———————————————— 182 運行 Terminal 183 生成 數據表 184 E:\堡壘機\eye>python manage.py makemigrations 185 數據表 遷移 186 E:\堡壘機\eye>python manage.py migrate 187 # ————————————————Django數據庫生成 結束———————————————— 188 """#Django數據庫生成 189 """ 190 # ————————————————重寫Django帳號表後的建立方法 開始———————————————— 191 E:\堡壘機\eye>python manage.py createsuperuser 192 郵箱地址: admin@qq.com 193 暱稱: admin 194 Password: admin123456 195 Password (again): admin123456 196 Superuser created successfully. 197 # ————————————————重寫Django帳號表後的建立方法 結束———————————————— 198 #啓動 DJANGO 服務 199 E:\堡壘機\eye>python manage.py runserver 127.0.0.1:8000 200 """#重寫Django帳號表後的建立方法
1 #admin.py 2 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 3 #————————同目錄下能夠用 . 開始———————— 4 #from Fortress import models#數據庫 #重寫DJAGO帳號表 5 from . import models#數據庫 #重寫DJAGO帳號表 6 #————————同目錄下能夠用 . 結束———————— 7 from django import forms #django的字段驗證 8 from django.contrib.auth.admin import UserAdmin as BaseUserAdmin ##表單添加和更改用戶實例 9 from django.contrib.auth.forms import ReadOnlyPasswordHashField#只讀密碼散列字段 10 from django.contrib import admin #註冊類到admin 11 #建立新用戶 12 class UserCreationForm(forms.ModelForm): 13 password1 = forms.CharField(label='設置密碼', widget=forms.PasswordInput)#密碼 14 password2 = forms.CharField(label='確認密碼', widget=forms.PasswordInput)#確認密碼 15 class Meta: 16 model = models.UserProfile 17 fields = ['email', 'name'] 18 def clean_password2(self): #檢查兩個密碼條目是否同樣(匹配) 19 password1 = self.cleaned_data.get("password1") 20 password2 = self.cleaned_data.get("password2") 21 if password1 and password2 and password1 != password2: 22 raise forms.ValidationError("密碼不匹配") 23 return password2 24 def save(self, commit=True): #保存密碼(散列的格式提供) 25 user = super(UserCreationForm, self).save(commit=False) 26 user.set_password(self.cleaned_data["password1"]) 27 if commit: 28 user.save()#保存 29 return user 30 # 修改用戶密碼 31 class UserChangeForm(forms.ModelForm): 32 password = ReadOnlyPasswordHashField(label="修改密碼", 33 help_text=("原始密碼不存儲,因此沒有辦法看到" 34 "這個用戶的密碼,可是你能夠改變密碼 " 35 "使用 <a href=\"../password/\">修改密碼</a>."))#哈值#只讀密碼散列字段 36 class Meta: 37 model = models.UserProfile 38 fields = ['email', 'password', 'name', 'is_active', 'is_admin'] 39 def clean_password(self):#無論用戶提供什麼,返回初始值。 40 return self.initial["password"] 41 42 #表單添加和更改用戶實例 43 class UserProfileAdmin(BaseUserAdmin): 44 form = UserChangeForm #修改 45 add_form = UserCreationForm#建立 46 # 字段用於顯示用戶模型。 47 # 這些覆蓋定義UserAdmin固定在底座上 48 # auth.User參考特定字段。 49 list_display = ['email', 'name','is_staff', 'is_admin']#後臺顯示的字段 50 list_filter = ['is_admin','is_staff']#後臺過濾的字段 51 fieldsets = (('帳號密碼', {'fields': ('email', 'password')}), 52 ('我的信息', {'fields': ('name',)}), 53 # ————————————————02堡壘機設計後臺交互程序 開始———————————————— 54 ('堡壘機主機受權', {'fields': ('bind_hosts', 'host_groups')}), 55 # ————————————————02堡壘機設計後臺交互程序 結束———————————————— 56 ('權限', {'fields': ('is_admin','is_staff','user_permissions','groups')}),) 57 #添加帳戶時顯示要填寫的字段 58 add_fieldsets = (('添加帳戶', {'classes': ('wide',),#wide(寬屏樣式) 59 'fields': ('email', 'name', 'password1', 'password2')}),) 60 search_fields = ['email']#後臺搜索的字段 61 ordering = ['email']#後臺排序的字段 62 filter_horizontal =['user_permissions','groups',#必須覆蓋的變量#後臺複選框的字段 63 # ————————————————02堡壘機設計後臺交互程序 開始———————————————— 64 'bind_hosts', 'host_groups', 65 # ————————————————02堡壘機設計後臺交互程序 結束———————————————— 66 ] 67 admin.site.register(models.UserProfile, UserProfileAdmin)#如今註冊這個新UserProfileAdmin 68 # ——可選——使用Django的內置權限 開始———— 69 #from django.contrib.auth.models import Group #權限組 70 #admin.site.unregister(Group)#權限組#由於咱們不使用Django的內置權限, 71 # ——可選——使用Django的內置權限 結束———— 72 #————————————————01堡壘機重寫DJANGO帳戶表 結束———————————————— 73 74 75 #————————————————02堡壘機設計後臺交互程序 開始———————————————— 76 #01標籤 77 class TagAdmin(admin.ModelAdmin): 78 list_display = ['id','name'] #顯示字段表頭 79 list_editable = ['name'] #可編輯 80 search_fields = ['name'] #搜索 81 admin.site.register(models.Tag, TagAdmin) 82 #02機房 83 class IDCAdmin(admin.ModelAdmin): 84 list_display = ['id','name','address','memo','date'] #顯示字段表頭 85 list_editable = ['name','address', 'memo'] #可編輯 86 search_fields = ['name','tag'] #搜索 87 filter_horizontal = ['tag'] #複選框 88 admin.site.register(models.IDC, IDCAdmin) 89 #03主機 90 class HostAdmin(admin.ModelAdmin): 91 list_display = ['id','hostname','ip_addr','port','memo','enabled','date'] #顯示字段表頭 92 list_editable = ['hostname','ip_addr','port','memo','enabled'] #可編輯 93 search_fields = ['hostname','ip_addr','port','tag'] #搜索 94 filter_horizontal = ['tag'] #複選框 95 admin.site.register(models.Host, HostAdmin) 96 #04帳號密碼 97 class RemoteUserAdmin(admin.ModelAdmin): 98 list_display = ['id','userlevel','username','memo','date'] #顯示字段表頭 99 list_editable = ['memo'] #可編輯 100 search_fields = ['userlevel','username','tag'] #搜索 101 filter_horizontal = ['host_prompt','tag'] #複選框 102 admin.site.register(models.RemoteUser,RemoteUserAdmin) 103 #05關聯主機與帳號密碼 104 class BindHostAdmin(admin.ModelAdmin): 105 list_display = ['id','host','remote_user','memo','date']#顯示字段表頭 106 list_editable = ['host','remote_user','memo'] #可編輯 107 search_fields = ['host','remote_user','tag'] #搜索 108 filter_horizontal = ['tag'] #複選框 109 ordering = ['host','remote_user'] #自定義排序 110 admin.site.register(models.BindHost,BindHostAdmin) 111 #06主機分組 112 class HostGroupsAdmin(admin.ModelAdmin): 113 list_display = ['id','name','memo','date']#顯示字段表頭 114 list_editable = ['name','memo'] #可編輯 115 search_fields = ['name','tag'] #搜索 116 filter_horizontal = ['bind_hosts','tag'] #複選框 117 admin.site.register(models.HostGroups, HostGroupsAdmin) 118 #————————————————02堡壘機設計後臺交互程序 結束———————————————— 119 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始———————————————— 120 #07會話日誌 121 class SessionAdmin(admin.ModelAdmin): 122 list_display = ['id','user','bind_host','cmd_count','stay_time','closed','memo','date']#顯示字段表頭 123 list_editable = ['closed','memo'] #可編輯 124 search_fields = ['user','bind_host','memo','tag'] #搜索 125 filter_horizontal = ['tag'] #複選框 126 admin.site.register(models.Session, SessionAdmin) 127 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束————————————————
1 #settings.py 2 3 """ 4 Django settings for eye project. 5 6 Generated by 'django-admin startproject' using Django 2.1.4. 7 8 For more information on this file, see 9 https://docs.djangoproject.com/en/2.1/topics/settings/ 10 11 For the full list of settings and their values, see 12 https://docs.djangoproject.com/en/2.1/ref/settings/ 13 """ 14 15 import os 16 17 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 18 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 19 20 21 # Quick-start development settings - unsuitable for production 22 # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ 23 24 # SECURITY WARNING: keep the secret key used in production secret! 25 SECRET_KEY = 'r35s$()7lli1hw-!6%llp0uu$!m!e#nnlxu+&!6$(g*6f0=@2#' 26 27 # SECURITY WARNING: don't run with debug turned on in production! 28 DEBUG = True 29 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 開始———————————————— 30 # ALLOWED_HOSTS = [] 31 ALLOWED_HOSTS = ['*'] 32 # ————————————————03堡壘機在Linux系統裏記錄會話日誌 結束———————————————— 33 # Application definition 34 35 INSTALLED_APPS = [ 36 'django.contrib.admin', 37 'django.contrib.auth', 38 'django.contrib.contenttypes', 39 'django.contrib.sessions', 40 'django.contrib.messages', 41 'django.contrib.staticfiles', 42 'Fortress.apps.FortressConfig', 43 ] 44 45 MIDDLEWARE = [ 46 'django.middleware.security.SecurityMiddleware', 47 'django.contrib.sessions.middleware.SessionMiddleware', 48 'django.middleware.common.CommonMiddleware', 49 'django.middleware.csrf.CsrfViewMiddleware', 50 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 'django.contrib.messages.middleware.MessageMiddleware', 52 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 ] 54 55 ROOT_URLCONF = 'eye.urls' 56 57 TEMPLATES = [ 58 { 59 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 'DIRS': [os.path.join(BASE_DIR, 'templates')] 61 , 62 'APP_DIRS': True, 63 'OPTIONS': { 64 'context_processors': [ 65 'django.template.context_processors.debug', 66 'django.template.context_processors.request', 67 'django.contrib.auth.context_processors.auth', 68 'django.contrib.messages.context_processors.messages', 69 ], 70 }, 71 }, 72 ] 73 74 WSGI_APPLICATION = 'eye.wsgi.application' 75 76 77 # Database 78 # https://docs.djangoproject.com/en/2.1/ref/settings/#databases 79 80 DATABASES = { 81 'default': { 82 'ENGINE': 'django.db.backends.sqlite3', 83 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 84 } 85 } 86 87 88 # Password validation 89 # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators 90 91 AUTH_PASSWORD_VALIDATORS = [ 92 { 93 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 94 }, 95 { 96 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 97 }, 98 { 99 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 100 }, 101 { 102 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 103 }, 104 ] 105 106 107 # Internationalization 108 # https://docs.djangoproject.com/en/2.1/topics/i18n/ 109 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 110 # ————Django中使用中國時區和中文 開始———— 111 #LANGUAGE_CODE = 'en-us' 112 #TIME_ZONE = 'UTC' 113 LANGUAGE_CODE = 'zh-Hans' 114 TIME_ZONE = 'Asia/Shanghai' 115 # ————Django中使用中國時區和中文 結束———— 116 #————————————————01堡壘機重寫DJANGO帳戶表 結束———————————————— 117 USE_I18N = True 118 119 USE_L10N = True 120 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 121 # ————Django中跨時區 開始———— 122 # USE_TZ = True 123 USE_TZ = False 124 # ————Django中跨時區 結束———— 125 #————————————————01堡壘機重寫DJANGO帳戶表 結束———————————————— 126 # Static files (CSS, JavaScript, Images) 127 # https://docs.djangoproject.com/en/2.1/howto/static-files/ 128 129 STATIC_URL = '/static/' 130 131 #————————————————01堡壘機重寫DJANGO帳戶表 開始———————————————— 132 AUTH_USER_MODEL = 'Fortress.UserProfile' 133 #————————————————01堡壘機重寫DJANGO帳戶表 結束————————————————
1 """ 2 ————————建立跳板機的獨立用戶 開始———————— 3 [root@localhost ~]# useradd jump |#新建用戶(跳) 4 [root@localhost ~]# passwd jump |#修改用戶(跳)的密碼 5 新的 密碼:admineye 6 從新輸入新的 密碼:admineye 7 ————————建立跳板機的獨立用戶 結束———————— 8 ————————測試獨立用戶Django使用權限 開始———————— 9 [root@localhost ~] su jump 10 [jump@localhost root]$ python3 11 >>> import django 12 >>> print(django.get_version()) 13 2.1.4 14 >>> exit() 15 [jump@localhost root]$ su root 16 密碼:123456 17 ————————測試獨立用戶Django使用權限 結束———————— 18 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 開始——site-packages—————— 19 [root@localhost ~]# python3 20 >>> import sys 21 >>> sys.path 22 >>> exit() 23 [root@localhost ~]# sudo cp -rp /usr/lib64/anacnda3/lib/python3.6/site-packages/* /home/jump/.local/lib/python3.6/site-packages/ 24 [root@localhost ~]# cd /home/jump/.local/lib/python3.6/site-packages/ 25 [root@localhost ~]# sudo chown -R jump.jump * 26 [root@localhost ~]# ll 27 ——虛擬機不用——————Luxin系統給獨立用戶Django使用權限 結束——site-packages—————— 28 """#獨立用戶
1 """ 2 E:\堡壘機\eye 將項目複製到 CentOS-7 的 /home/jump/ 目錄下 3 ———————複製Python代碼到服務用戶目錄下 開始————————— 4 注意:修改settings中的設置,使其容許全部網段訪問: ALLOWED_HOSTS = ['*'] 5 [root@localhost ~]# cd /home/jump/eye 6 [root@localhost eye]# ls 7 [root@localhost eye]# python3 manage.py runserver 0.0.0.0:9000 |#運行服務時使用0.0.0.0:9000做爲IP和端口,執行命令 8 [root@localhost ~]# systemctl stop firewalld.service |#注意:關閉防火牆 9 ———————複製Python代碼到服務用戶目錄下 結束————————— 10 11 ———————測試項目交互腳本 開始————————— 12 [root@localhost ~]# python3 /home/jump/eye/fortess_manage.py 13 [root@localhost ~]# chmod -R 777 /home/jump |#修改權限,複製python項目文件到Luxin系統後注意從新賦值權限 14 ———————測試項目交互腳本 結束————————— 15 """#啓動服務
1 """ 2 ———————Windows系統測試 開始————————— 3 瀏覽器訪問:http://192.192.168.143:9000/admin/ 4 ————putty測試 開始———— 5 login as: jump 6 jump@192.192.168.143's password:admineye 7 ----開始 運行交互腳本。。。---- 8 Username:admin@qq.com 9 Password:admin123456 10 ----------------------歡迎 admin----------------------- 11 0. 測試組[1] 12 z. 未分組主機[1] 13 admin>>: 14 ————putty測試 結束———— 15 ———————Windows系統測試 結束————————— 16 """#Windows系統測試
1 """ 2 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 開始—————————— 3 [root@localhost ~]# vim /etc/sudoers 4 ———————進入vim文本編輯操做 開始————————— 5 | i |#進入插入文本模式 6 _______到底部插入 開始_______ 7 %jump ALL=NOPASSWD:ALL #/use/bin/strace,/usr/bin/python3 8 _______到底部插入 結束_______ 9 | Esc |#退出插入文本模式 10 | Shift + Q |#進行EX操做模式 11 | wq! |#保存#退出vim文本編輯操做 12 ———————進入vim文本編輯操做 結束————————— 13 ——————————session_tracker.sh給獨立用戶jump權限,建立日誌免密碼 結束—————————— 14 """#建立日誌
1 """ 2 ————————配置獨立用戶啓動項 開始———————— 3 [root@localhost ~]# cd /home/jump 4 [root@localhost jump]# ls -a 5 . .. .bash_logout .bash_profile .bashrc 6 [root@localhost eye]# vim .bashrc 7 ————若是vim打開錯誤 開始———— 8 [root@localhost conf]# rpm -qa|grep vim |#若是vim打開錯誤 9 [root@localhost conf]# yum -y install vim* |#安裝vim 10 ————若是vim打開錯誤 結束———— 11 ————進入vim文本編輯操做 開始———— 12 | i |#進入插入文本模式 13 _____原有的內容 開始_____ 14 if [ -f /etc/bashrc ]; then 15 . /etc/bashrc 16 fi 17 _____原有的內容 結束_____ 18 _____插入的內容 開始_____ 19 python3 /home/jump/eye/fortess_manage.py 20 logout 21 _____插入的內容 結束_____ 22 | Esc |#退出插入文本模式 23 | Shift + Q |#進行EX操做模式 24 | w |#保存vim文本編輯操做 25 | q |#退出vim 26 ————進入vim文本編輯操做 結束———— 27 ————————配置獨立用戶啓動項 結束———————— 28 """#啓動項