用户行为审计功能:
首先看一下strace命令:(跟踪进程所发生的所有系统调用)这是在本地用的,也就是在指令通过ssh发送之前,将输入内容追踪到,
因为ssh发送过程中都是加密的,在过程中抓包是不行的,所以可以在发送之前进行抓包,就用这个strace(strace跟踪的进程死了,那么strace也是自动关闭的)
跟踪ssh:
我们的程序和远程的机器进行socket通信,是通过操作系统接收的数据,并不是直接从网卡上接收数据,是我们调用操作系统给我们开放的网卡的接口来接收数据,在linux操作系统里面维护了一个像列表似的东西,这个列表存的是所有的当前打开的文件(linux上一切皆文件)的文件句柄,操作系统就是在监控这个列表,哪个句柄有活动了,系统就会返回给相应的应用程序说它的socket来数据了,就拿着对应的文件句柄去接收
每敲一个字母就进行一个select。
所以可以将read筛选出来,就能拿到用户输入的指令了。
uname命令:
获取输入时间:
上下左右键跟踪效果:
没有显示自动补全的内容:只显示了\t,所以发现这个\t就要去ssh.log文件中去找对应的内容。
通过我们自己写的audit.py文件进行匹配并获取相应的内容,来拿到命令。
mv移动命令:
执行以下autid文件:
通过上面的内容已经可以分析出用户做了什么。这是追踪的ssh连接远程的那个进程,这就是在我们的堡垒机上的进程。
但是问题在于,如何在启动连接的同时,启动我们的strace程序进行跟踪:也就是如何拿到这个进程ID:
df && sshpass是不行的。同时开两个线程也是不行的。用subprocess.Popen也不行,因为这样就不会实时交互了,直接就往下进行了,不会进入shell了,只是将命令的结果放到内存文件中去了。
本身subprocess.run()是启动了一个新的进程。并且保持会话,在本身的系统里面是拿不到的,因为这个进程一启动用户就进去操作了,就到了主机的系统。所以只能到用户登陆到的主机的linux系统中去获取这个进程id:
到主机的系统中获取这个进程id:
| awk '{ print $2}':命令
但是面临的问题是:如果别人又用这个用户或者别的用户进行登陆连接了这个主机,那么就会出现两个进程id,即便是将用户名传进来也会有一个用户名两次同时登陆这个主机,该怎么区分呢:
所以要给每个连接加一个唯一的标识符。
但是用ssh连接远程机器的时候,还不能加其他参数,因为ssh不识别,所以好像只能改一下ssh源码,给它加个参数,让它识别:
which和cat命令:
所以要去下载openssh源码:
查看一下下载好的openssh文件:
找到ssh.c文件
下面的意思就是输入-z或者-Z来执行一些内容:
然后将改好的文件压缩并放到我们的linux目录下:
然后unzip解压一下:
然后这个文件时从其他地方拷贝过来的,需要修改权限,它才能执行,才有执行权限:
但是上面的安装会报错,因为:
###安装改过源码的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
加权限:
在进行sudo make install就ok了
现在我们就自己装了一个稍作修改的openssh:
由于上一次make install 安装了上一次的openssh,需要将其删除,在安装我们新修改并编译过的c文件。
然后进行:
在进行sudo make install就ok了
然后在执行我们添加的-Z命令:
然后输入密码之后就连接到远程主机上去了
然后筛选出来这个内容:这个就可以作为唯一连接的标识符了:
保存一下 ,然后exit,然后ctrl+c,断开连接之后,再从新连接并执行一下试试:
查看一下进程,就看到了:
在连接进去之前先sleep几秒钟先拿到这个MD5值然后等待监测下面的连接进程。如果一次拿不到,可以多拿几次,如果多拿几次还是拿不到说明连接进程有问题,没有连接上。
下面学习shell:
进入编辑:
看例子:
然后将带有我们自己生成的那个MD5的字符串作为筛选条件。在将sshpass的进程筛选出去:
在用awk取这一行数据的第二列,就拿到了这个进程的id:
最后:
然后执行:
就开始监测了:
并将用户的行为记录到了我们指定的log文件中。
在对log文件内容进行筛选,去拿到用户的操作。
然后我们要在python中调用这个shell脚本:
首先找到我们写的这个shell脚本:
但是当我们在crazyass用户下通过python去执行的时候报错了:
看个例子:
哪些用户能够执行sudo管理员权限,是在/etc/sudoers文件中配置的。
但是这个sudoers文件是只读的,要修改的话最好查一查
千万不要乱修改这个sudoers文件,不然错了的话就完了,只能在用root用户进去,但是如果root用户的密码忘了的话那就都不能进入这个文件了,只能进入单用户模式去修改。
进入/etc/sudoers文件:编辑
下面这样写完之后,crazyass用户就能执行strace程序了。
然后在回去通过python执行我们的shell脚本:
因为shell脚本中,我们将跟踪结果写到了:
所以:
刚才是启动了strace跟踪进程之后直接就启动了ssh连接的进程,所以能够跟踪到进程id:
但是看下面的情况:
这样的话,就需要去多跟踪几次,几次之后再没有跟踪到就自动退出:
看shell代码:
将我们的shell脚本改成这样:
模拟一下ssh连接耗时较长的情况下进行的跟踪:
先写好日志存放路径:
还有最好是将堡垒机用户和主机用户,还有log日志文件的随机字符串的名称,那这个日志名称就和日志文件有个对应关系了,如果写到一个文件或者文件夹中,那每天这样的日志会有狠多,所以最好是都存到数据库里面,方便查询。
上面的写错了
从外面拷过来的文件,一定要注意这个执行权限的问题,
这些文件的属主权限还是alex的,所以都需要改(其实我们的堡垒机的执行文件包括这个django都是安装在我们的crazyass用户下的,所以本应该没有问题的)
现在是练习,所以注意修改权限,将这个项目的属主权限都改成crazyass的,注意下面少写了个sudo
上面找不到目录的原因是,我们的执行脚本user_enterpoint.py根本就没在这个CrazyAss的项目目录下,而是在当前的crazyass主机用户的.bashrc文件中执行的,所以它找不到django的目录:
通过在session_tracker.sh中加上mkdir -p之后,即便没有这个文件夹,也能够创建目录了:
但是,创建的目录没在我们想要的路径下。:
所以要修改路径:
数据库里面也有了对应的记录:
到目前为止用户行为记录基本搞定,还需要做的就是将日志分析筛选写的更好一些。还差的就是文件的上传和下载,这个功能没有实现,需要考虑完善。
看文件上传下载的记录:目前无法解决,所以就有安全隐患是,如果用户将黑客程序写到文件中,上传进来执行,是看不到的。但是知道它上传了文件,
目前能够想到的解决办法是限制用户输入上传和下载文件的命令,想传文件只能上传到我堡垒机提供的sftp上,再通过我的sftp下载下来,这个过程中将文件备份。限制rz和sz的指令。齐治堡垒机就是这样做的,而且用java写的ssh,比python的写的那个要好,并且敲了什么命令还可以录像。但我们的这个目前没有实现这些。
注意一点,用rz上传文件的时候,有些文件类型或者大一些的文件,rz会出问题,所以最好用sftp上传文件,但是需要下载安装sftp: