用户行为审计功能:

首先看一下strace命令:(跟踪进程所发生的所有系统调用)这是在本地用的,也就是在指令通过ssh发送之前,将输入内容追踪到,

因为ssh发送过程中都是加密的,在过程中抓包是不行的,所以可以在发送之前进行抓包,就用这个strace(strace跟踪的进程死了,那么strace也是自动关闭的)

堡垒机java做什么 堡垒机常用命令_shell脚本

 

堡垒机java做什么 堡垒机常用命令_堡垒机_02

 

堡垒机java做什么 堡垒机常用命令_堡垒机_03

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_04

 

堡垒机java做什么 堡垒机常用命令_堡垒机_05

 

跟踪ssh:

 

堡垒机java做什么 堡垒机常用命令_堡垒机_06

 

 

 

堡垒机java做什么 堡垒机常用命令_shell脚本_07

 

 

 

堡垒机java做什么 堡垒机常用命令_shell脚本_08

我们的程序和远程的机器进行socket通信,是通过操作系统接收的数据,并不是直接从网卡上接收数据,是我们调用操作系统给我们开放的网卡的接口来接收数据,在linux操作系统里面维护了一个像列表似的东西,这个列表存的是所有的当前打开的文件(linux上一切皆文件)的文件句柄,操作系统就是在监控这个列表,哪个句柄有活动了,系统就会返回给相应的应用程序说它的socket来数据了,就拿着对应的文件句柄去接收

 

堡垒机java做什么 堡垒机常用命令_shell脚本_09

每敲一个字母就进行一个select。

所以可以将read筛选出来,就能拿到用户输入的指令了。

堡垒机java做什么 堡垒机常用命令_堡垒机_10

 

 

堡垒机java做什么 堡垒机常用命令_上传_11

 

 

堡垒机java做什么 堡垒机常用命令_上传_12

 uname命令:

 

堡垒机java做什么 堡垒机常用命令_堡垒机_13

 

 获取输入时间:

堡垒机java做什么 堡垒机常用命令_上传_14

 上下左右键跟踪效果:

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_15

 没有显示自动补全的内容:只显示了\t,所以发现这个\t就要去ssh.log文件中去找对应的内容。

 

堡垒机java做什么 堡垒机常用命令_堡垒机_16

 

 通过我们自己写的audit.py文件进行匹配并获取相应的内容,来拿到命令。

堡垒机java做什么 堡垒机常用命令_shell脚本_17

堡垒机java做什么 堡垒机常用命令_上传_18

 

mv移动命令:

 

堡垒机java做什么 堡垒机常用命令_堡垒机_19

 

执行以下autid文件:

堡垒机java做什么 堡垒机常用命令_堡垒机_20

 

 通过上面的内容已经可以分析出用户做了什么。这是追踪的ssh连接远程的那个进程,这就是在我们的堡垒机上的进程。

但是问题在于,如何在启动连接的同时,启动我们的strace程序进行跟踪:也就是如何拿到这个进程ID:

 df && sshpass是不行的。同时开两个线程也是不行的。用subprocess.Popen也不行,因为这样就不会实时交互了,直接就往下进行了,不会进入shell了,只是将命令的结果放到内存文件中去了。

本身subprocess.run()是启动了一个新的进程。并且保持会话,在本身的系统里面是拿不到的,因为这个进程一启动用户就进去操作了,就到了主机的系统。所以只能到用户登陆到的主机的linux系统中去获取这个进程id:

堡垒机java做什么 堡垒机常用命令_堡垒机_21

 

到主机的系统中获取这个进程id:

堡垒机java做什么 堡垒机常用命令_上传_22

 

 

堡垒机java做什么 堡垒机常用命令_上传_23

 |  awk  '{ print  $2}':命令

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_24

但是面临的问题是:如果别人又用这个用户或者别的用户进行登陆连接了这个主机,那么就会出现两个进程id,即便是将用户名传进来也会有一个用户名两次同时登陆这个主机,该怎么区分呢:

堡垒机java做什么 堡垒机常用命令_shell脚本_25

 

 所以要给每个连接加一个唯一的标识符。

但是用ssh连接远程机器的时候,还不能加其他参数,因为ssh不识别,所以好像只能改一下ssh源码,给它加个参数,让它识别:

堡垒机java做什么 堡垒机常用命令_堡垒机_26

 

which和cat命令:

 

堡垒机java做什么 堡垒机常用命令_堡垒机_27

所以要去下载openssh源码:

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_28

 

 

查看一下下载好的openssh文件:

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_29

 找到ssh.c文件

 

堡垒机java做什么 堡垒机常用命令_shell脚本_30

 

下面的意思就是输入-z或者-Z来执行一些内容:

 

堡垒机java做什么 堡垒机常用命令_上传_31

 

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_32

 

 

 

然后将改好的文件压缩并放到我们的linux目录下:

堡垒机java做什么 堡垒机常用命令_shell脚本_33

 

 然后unzip解压一下:

然后这个文件时从其他地方拷贝过来的,需要修改权限,它才能执行,才有执行权限:

堡垒机java做什么 堡垒机常用命令_上传_34

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_35

 

 但是上面的安装会报错,因为:

###安装改过源码的openssh

  • cd src/openssh-7.3p1/
  • ./configure --prefix=/usr/local/openssh7/注意有可能会报错误configure: error: OpenSSL version header not found.这是因为openssh需要openssl,此时需要安装一下openssl的开发模块`
在ubuntu上安装openssl dev组件(三个都要安装,因为有很多依赖的东西啊接口什么的)
 sudo apt-get install zlib1g
 sudo apt-get install zlib1g-dev
 sudo apt-get install libssl-dev
 
 再重新执行configure就应该没问题了
  • make && make install

 

堡垒机java做什么 堡垒机常用命令_shell脚本_36

 

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_37

 

堡垒机java做什么 堡垒机常用命令_堡垒机_38

 加权限:

 

堡垒机java做什么 堡垒机常用命令_shell脚本_39

在进行sudo make install就ok了

 

现在我们就自己装了一个稍作修改的openssh:

 

 

堡垒机java做什么 堡垒机常用命令_上传_40

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_41

 

 由于上一次make install 安装了上一次的openssh,需要将其删除,在安装我们新修改并编译过的c文件。

堡垒机java做什么 堡垒机常用命令_堡垒机_42

 

 然后进行:

堡垒机java做什么 堡垒机常用命令_上传_43

 

 在进行sudo make install就ok了

 

 然后在执行我们添加的-Z命令:

堡垒机java做什么 堡垒机常用命令_堡垒机_44

 

然后输入密码之后就连接到远程主机上去了

堡垒机java做什么 堡垒机常用命令_上传_45

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_46

然后筛选出来这个内容:这个就可以作为唯一连接的标识符了:

堡垒机java做什么 堡垒机常用命令_上传_47

 

 

堡垒机java做什么 堡垒机常用命令_上传_48

 

 

堡垒机java做什么 堡垒机常用命令_shell脚本_49

 

 

堡垒机java做什么 堡垒机常用命令_上传_50

保存一下 ,然后exit,然后ctrl+c,断开连接之后,再从新连接并执行一下试试:

 查看一下进程,就看到了:

堡垒机java做什么 堡垒机常用命令_堡垒机_51

 

在连接进去之前先sleep几秒钟先拿到这个MD5值然后等待监测下面的连接进程。如果一次拿不到,可以多拿几次,如果多拿几次还是拿不到说明连接进程有问题,没有连接上。

 

堡垒机java做什么 堡垒机常用命令_上传_52

 

 下面学习shell:

进入编辑:

堡垒机java做什么 堡垒机常用命令_上传_53

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_54

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_55

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_56

看例子:

堡垒机java做什么 堡垒机常用命令_堡垒机_57

 

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_58

堡垒机java做什么 堡垒机常用命令_堡垒机_59

 

 

 

堡垒机java做什么 堡垒机常用命令_上传_60

 

然后将带有我们自己生成的那个MD5的字符串作为筛选条件。在将sshpass的进程筛选出去:

堡垒机java做什么 堡垒机常用命令_上传_61

 

 在用awk取这一行数据的第二列,就拿到了这个进程的id:

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_62

 

堡垒机java做什么 堡垒机常用命令_shell脚本_63

 

堡垒机java做什么 堡垒机常用命令_上传_64

 

最后:

堡垒机java做什么 堡垒机常用命令_上传_65

堡垒机java做什么 堡垒机常用命令_堡垒机_66

然后执行:

堡垒机java做什么 堡垒机常用命令_堡垒机_67

就开始监测了:

并将用户的行为记录到了我们指定的log文件中。

在对log文件内容进行筛选,去拿到用户的操作。

 

然后我们要在python中调用这个shell脚本:

首先找到我们写的这个shell脚本:

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_68

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_69

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_70

 

但是当我们在crazyass用户下通过python去执行的时候报错了:

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_71

看个例子:

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_72

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_73

 

哪些用户能够执行sudo管理员权限,是在/etc/sudoers文件中配置的。

 

堡垒机java做什么 堡垒机常用命令_堡垒机_74

 但是这个sudoers文件是只读的,要修改的话最好查一查

堡垒机java做什么 堡垒机常用命令_上传_75

 

千万不要乱修改这个sudoers文件,不然错了的话就完了,只能在用root用户进去,但是如果root用户的密码忘了的话那就都不能进入这个文件了,只能进入单用户模式去修改。

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_76

堡垒机java做什么 堡垒机常用命令_堡垒机_77

 进入/etc/sudoers文件:编辑

 

堡垒机java做什么 堡垒机常用命令_上传_78

下面这样写完之后,crazyass用户就能执行strace程序了。

堡垒机java做什么 堡垒机常用命令_shell脚本_79

 

 然后在回去通过python执行我们的shell脚本:

 因为shell脚本中,我们将跟踪结果写到了:

堡垒机java做什么 堡垒机常用命令_上传_80

所以:

 

堡垒机java做什么 堡垒机常用命令_堡垒机_81

 刚才是启动了strace跟踪进程之后直接就启动了ssh连接的进程,所以能够跟踪到进程id:

 但是看下面的情况:

 

堡垒机java做什么 堡垒机常用命令_堡垒机_82

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_83

 

 这样的话,就需要去多跟踪几次,几次之后再没有跟踪到就自动退出:

看shell代码:

堡垒机java做什么 堡垒机常用命令_shell脚本_84

 将我们的shell脚本改成这样:

 

堡垒机java做什么 堡垒机常用命令_上传_85

 

 

 模拟一下ssh连接耗时较长的情况下进行的跟踪:

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_86

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_87

 

先写好日志存放路径:

堡垒机java做什么 堡垒机常用命令_堡垒机_88

 

 

 还有最好是将堡垒机用户和主机用户,还有log日志文件的随机字符串的名称,那这个日志名称就和日志文件有个对应关系了,如果写到一个文件或者文件夹中,那每天这样的日志会有狠多,所以最好是都存到数据库里面,方便查询。

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_89

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机java做什么_90

 上面的写错了

 

堡垒机java做什么 堡垒机常用命令_堡垒机_91

从外面拷过来的文件,一定要注意这个执行权限的问题,

堡垒机java做什么 堡垒机常用命令_堡垒机_92

 这些文件的属主权限还是alex的,所以都需要改(其实我们的堡垒机的执行文件包括这个django都是安装在我们的crazyass用户下的,所以本应该没有问题的)

现在是练习,所以注意修改权限,将这个项目的属主权限都改成crazyass的,注意下面少写了个sudo

 

堡垒机java做什么 堡垒机常用命令_堡垒机_93

堡垒机java做什么 堡垒机常用命令_堡垒机_94

 

 

 

堡垒机java做什么 堡垒机常用命令_堡垒机_95

上面找不到目录的原因是,我们的执行脚本user_enterpoint.py根本就没在这个CrazyAss的项目目录下,而是在当前的crazyass主机用户的.bashrc文件中执行的,所以它找不到django的目录:

通过在session_tracker.sh中加上mkdir -p之后,即便没有这个文件夹,也能够创建目录了:

 

堡垒机java做什么 堡垒机常用命令_shell脚本_96

 

但是,创建的目录没在我们想要的路径下。:

堡垒机java做什么 堡垒机常用命令_堡垒机_97

 

所以要修改路径:

堡垒机java做什么 堡垒机常用命令_shell脚本_98

 

堡垒机java做什么 堡垒机常用命令_堡垒机_99

 

堡垒机java做什么 堡垒机常用命令_上传_100

 

数据库里面也有了对应的记录: 

 

堡垒机java做什么 堡垒机常用命令_shell脚本_101

 

 到目前为止用户行为记录基本搞定,还需要做的就是将日志分析筛选写的更好一些。还差的就是文件的上传和下载,这个功能没有实现,需要考虑完善。

 

看文件上传下载的记录:目前无法解决,所以就有安全隐患是,如果用户将黑客程序写到文件中,上传进来执行,是看不到的。但是知道它上传了文件,

目前能够想到的解决办法是限制用户输入上传和下载文件的命令,想传文件只能上传到我堡垒机提供的sftp上,再通过我的sftp下载下来,这个过程中将文件备份。限制rz和sz的指令。齐治堡垒机就是这样做的,而且用java写的ssh,比python的写的那个要好,并且敲了什么命令还可以录像。但我们的这个目前没有实现这些。

堡垒机java做什么 堡垒机常用命令_上传_102

 

 注意一点,用rz上传文件的时候,有些文件类型或者大一些的文件,rz会出问题,所以最好用sftp上传文件,但是需要下载安装sftp:

堡垒机java做什么 堡垒机常用命令_上传_103