上节回顾
ok 我们接着上一步继续改进 上面我们已经能够通过堡垒机成功连接主机了,
现在我们就要去监控运维人员对主机的操作了
我们应该知道我们是通过堡垒机上的ssh 去连接主机的 那在我们的堡垒机上就应该有具体用户的账号,密码以及他管理的主机的信息,
我们在知道Linux中有一个strace命令,用来抓取一个进程的所有操作
那么首先我们要知道我们的程序是运行在那个进程下
我们通过 ps -ef 一下然后找到我们的程序
父进程为2504的真是我们 通过ssh远程连接的命令
我们现在 strace -f -p 2504 -o ssh.log
监控一下这个进程 我们在通过堡垒机连接上的主机去输入一些命令
然后我们打开ssh.log 这个文件 就会发下我们输入的命令
现在我们写一个.py 文件 然后去获取运维人员在这里输入的命令 我们将这个文件写入到backend中
#_*_coding:utf-8_*_ import re class AuditLogHandler(object): '''分析audit log日志''' def __init__(self,log_file): self.log_file_obj = self._get_file(log_file) def _get_file(self,log_file): return open(log_file) def parse(self): cmd_list = [] cmd_str = '' catch_write5_flag = False #for tab complication for line in self.log_file_obj: #print(line.split()) line = line.split() try: pid,time_clock,io_call,char = line[0:4] if io_call.startswith('read(4'): if char == '"\\177",':#回退 char = '[1<-del]' if char == '"\\33OB",': #vim中下箭头 char = '[down 1]' if char == '"\\33OA",': #vim中下箭头 char = '[up 1]' if char == '"\\33OC",': #vim中右移 char = '[->1]' if char == '"\\33OD",': #vim中左移 char = '[1<-]' if char == '"\33[2;2R",': #进入vim模式 continue if char == '"\\33[>1;95;0c",': # 进入vim模式 char = '[----enter vim mode-----]' if char == '"\\33[A",': #命令行向上箭头 char = '[up 1]' catch_write5_flag = True #取到向上按键拿到的历史命令 if char == '"\\33[B",': # 命令行向上箭头 char = '[down 1]' catch_write5_flag = True # 取到向下按键拿到的历史命令 if char == '"\\33[C",': # 命令行向右移动1位 char = '[->1]' if char == '"\\33[D",': # 命令行向左移动1位 char = '[1<-]' cmd_str += char.strip('"",') if char == '"\\t",': catch_write5_flag = True continue if char == '"\\r",': cmd_list.append([time_clock,cmd_str]) cmd_str = '' # 重置 if char == '"':#space cmd_str += ' ' if catch_write5_flag: #to catch tab completion if io_call.startswith('write(5'): if io_call == '"\7",': #空键,不是空格,是回退不了就是这个键 pass else: cmd_str += char.strip('"",') catch_write5_flag = False except ValueError as e: print("\033[031;1mSession log record err,please contact your IT admin,\033[0m",e) #print(cmd_list) for cmd in cmd_list: print(cmd) return cmd_list if __name__ == "__main__": parser = AuditLogHandler('ssh.log') parser.parse()
大家优有没有发现一个问题 emmmmm
哈哈 我们现在是可以记录运维人员的输入的命令 和时间了 但是我们不知道是谁输入的命令,那么我们该怎么办呢
我们这个命令是怎么记录的 我们是通过 抓取进程 然后记录这个进程的操作
我们知道我每当一个用户通过堡垒机去连接主机就会起一个进程 我们就可以通过分析这个进程然后去判断是有那个运维人员去连接的
ok 接下来我们就去分析如何去通过进程去判断是有那个运维人员去连接的
我们是通过ssh去远程连接主机的 那么 就给ssh 连接时 加一个标识符
类似这样 然后我们去分析标识符 去判断是那个运维人员去连接的
那么我就需要修改 ssh 源码 具体操作如下
我么打开 openssh 然后找到ssh.c
ok -Z asdf 就是我们的标识符 哈哈哈 大家记得 在虚拟机上一定要装两个Ubuntu哦 否则本机连本机 标识符 会没有效果
现在将我们的标识符添加到我们的user_loginPoint.py上
然后我们通过堡垒机账号登录成功之后就会发现我们的标识符
现在我们有这个标识符了
我们接下来就写一个shell程序去检测这个标识符
1 #!/bin/bash 2 3 4 5 #echo #print 6 #echo $1 $2 7 md5_str=$1 8 9 for i in $(seq 1 30);do 10 11 ssh_pid=`ps -ef |grep $md5_str |grep -v grep |grep -v session_tracker.sh|grep -v sshpass |awk '{print $2}'` 12 echo "ssh session pid:$ssh_pid" 13 if [ "$ssh_pid" = "" ];then 14 sleep 1 15 continue 16 else 17 today=`date "+%Y_%m_%d"` 18 today_audit_dir="logs/audit/$today" 19 echo "today_audit_dir: $today_audit_dir" 20 if [ -d $today_audit_dir ] 21 then 22 echo " ----start tracking log---- " 23 else 24 echo "dir not exist" 25 echo " today dir: $today_audit_dir" 26 sudo mkdir -p $today_audit_dir 27 fi; 28 echo 123 | sudo -S /usr/bin/strace -ttt -p $ssh_pid -o "$today_audit_dir/$md5_str.log" 29 break 30 fi; 31 32 33 34 done;
在settings中配置调用路径
顺便再配置一个存放日志的目录
然后再在user_loginPoint.py中调用
把这个文件放在backeng目录下
我们梳理一下这个程序的执行过程
切换到root账户下
vim etc/sudoers
如果大家不知道自己的root密码 那就进入Ubuntu的单用户模式去修改
现在运维人员登录堡垒机就操作主机我们就可以对他的操作进行记录了
但是现在我们在日志中只能看见的是时间和操作命令 没有堡垒机用户和主机 但是我们在user_loginPoint中已经获取了 堡垒机用户和主机
首先我们在数据创建一个存储session的表
class SessiongLog(models.Model): """存储session日志""" user = models.ForeignKey("UserProfile",on_delete=True) bind_host = models.ForeignKey("BindHost",on_delete=True) session_tag = models.CharField(max_length=128) data = models.DateTimeField(auto_now_add=True) def __str__(self): return self.session_tag
然后在user_loginPoint.py中去获取并存储session
记得在settings中配置路径
然后改进一下前面写的shell脚本
网上白嫖的 我也看不懂
将这些程序装到我们的linux中后大家会发现
有很多命令不能执行 这是因为 有些命令 权限不够
在shell脚本中的mkdir 需要配置权限 好像是mkdir 创建目录是需要 sudo权限
还有 要将Eat_bee_dung目录的属主权限修改成eat_bee_dung用户的
现在在python中运行 我们的程序 就可以了