加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

堡垒机的进一步改进

发布时间:2020-12-14 00:21:01 所属栏目:Linux 来源:网络整理
导读:上节回顾 ? ? ok 我们接着上一步继续改进 上面我们已经能够通过堡垒机成功连接主机了, ? ? ? ? ?现在我们就要去监控运维人员对主机的操作了?? ? 我们应该知道我们是通过堡垒机上的ssh 去连接主机的 那在我们的堡垒机上就应该有具体用户的账号,密码以及他管

上节回顾

?

?

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("33[031;1mSession log record err,please contact your IT admin,33[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中运行 我们的程序 就可以了?

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读