堡垒机的进一步改进

上节回顾

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中运行 我们的程序 就可以了

原文地址:https://www.cnblogs.com/langjitanya/p/11597358.html

时间: 2024-07-30 21:58:52

堡垒机的进一步改进的相关文章

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123') ssh

麒麟堡垒机V1.31d发布

麒麟开源堡垒机 V1.31d 版本发布,本次主要更新: 1.修改了审计管理员的若干BUG 2.修改应用发布的帐号同步服务在某些情况下挂死的BUG 3.修改了LDAP认证支持的不兼容问题 系统简介:麒麟开源堡垒机为可以与商业堡垒机媲美的低成本.高性能 .易用的堡垒机,系统支持所有的运维协议(包括 rdp/x11/vnc),内置动态口令.SSL VPN.网管监控等额外辅助模块.官网地址:http://www.tosec.com.cn 机版本说明:麒麟堡垒机版本共计有四个字段,比如V1.31a,大部分

Python---初识堡垒机

在学习堡垒机之前,我们需要首先了解下Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作. SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.co

主机管理+堡垒机系统开发

本节内容 需求讨论 构架设计 表结构设计 程序开发 1.需求讨论 实现对用户的权限管理,能访问哪些机器,在被访问的机器上有哪些权限 实现可以通过web页面对指定主机列表 进行 批量发布命令.文件 实现对用户操作进行纪录 2.架构设计 3. 表结构设计 参考 http://www.cnblogs.com/alex3714/articles/5286889.html 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,

开源堡垒机对比

teleport 堡垒机 jumpserver 通过添加统一系统账户来操作,支持密码和密钥登陆,堡垒机密钥远程主机的root权限.多个人员使用一个账户来管理感觉不是很好. 通过推送用户+sudo授权的方式,使用密钥+密码登陆授权主机 日志审计:回放录像,命令审计(回放录像做的功能做的比较完善) 日志审计:回放录像,命令审计 使用sftp客户端进行上传下载文件.很方便 lrzsz 上传下载.比较鸡肋 不支持批量操作主机 支持ansible批量执行命令 支持windows服务器 不支持windows

堡垒机--paramiko模块

做堡垒机之前,来了解一下paramiko模块. 实际上底层封装的SSH. SSHclient(1) import paramiko #实例化一个ssh ssh = paramiko.SSHClient() #设置主机不在khost_key中也能连接 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #创建连接 ssh.connect(hostname='192.168.12.100',port=22,username='root'

Python成长笔记 - 基础篇 (十四)--堡垒机

堡垒机架构 堡垒机的主要作用权限控制和用户行为审计,堡垒机就像一个城堡的大门,城堡里的所有建筑就是你不同的业务系统 , 每个想进入城堡的人都必须经过城堡大门并经过大门守卫的授权,每个进入城堡的人必须且只能严格按守卫的分配进入指定的建筑,且每个建筑物还有自己的权限访问控制,不同级别的人可以到建筑物里不同楼层的访问级别也是不一样的.还有就是,每个进入城堡的人的所有行为和足迹都会被严格的监控和纪录下来,一旦发生犯罪事件,城堡管理人员就可以通过这些监控纪录来追踪责任人. 堡垒要想成功完全记到他的作用,只

Python之路第一课Day9--随堂笔记之一(堡垒机实例以及数据库操作)未完待续....

一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.c

堡垒机-麒麟开源堡垒机 v1.31 版本发布

麒麟开源堡垒机团队经过努力,发布了V1.31版本,版本最主要的功能为内嵌了网管监控功能,可以在公司官网下载使用,网管部分代码包含在发布的ISO中. 堡垒机内嵌网管模块可以让管理员在登录堡垒机时即可以看到主机系统运行情况,不需要在登录网管系统查看系统运行状态. V1.31版本网管模块主要功能包括: 1.支持标准的SNMPV2协议,可以对Linux.Unix.Windows.h3c.cisco.华为等系统进行CPU.内存.存贮.网络接口流量进行抓取,并且将数据存贮在RRD图中,任何时候可以查看1小时