堡垒机的进一步改进

ε祈祈猫儿з 提交于 2019-11-30 17:05:42

上节回顾

 

 

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()
View Code

 

 大家优有没有发现一个问题  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;
View Code

在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
View Code

 

 

然后在user_loginPoint.py中去获取并存储session

 

 记得在settings中配置路径

 

 然后改进一下前面写的shell脚本 

 

 网上白嫖的   我也看不懂

将这些程序装到我们的linux中后大家会发现

有很多命令不能执行 这是因为  有些命令 权限不够 

在shell脚本中的mkdir 需要配置权限 好像是mkdir 创建目录是需要 sudo权限   

 

 还有 要将Eat_bee_dung目录的属主权限修改成eat_bee_dung用户的 

现在在python中运行 我们的程序 就可以了 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!