1 前言
做了跳板机之后,发现有的时候有人做了误操作,需要进行查看,因此想起修改ssh的源代码,记录用户的操作日志,本文来自互联网,后面带着大家一步一步进行修改;[请大家下载word文档进行操作点击下载],当前最新版本的openssh是:openssh-7.5p1新版本的在文章最后面
2 下载openssh源代码
openssh的官方下载地址(请自己找最新的openssh源码下载):http://www.openssh.com/portable.html
比如:http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-6.7p1.tar.gz
如果大家想一步到位,也可以直接下载我修改完的ssh代码进行编译安装即可,下载地址:
http://download.zhoufengjie.cn/software/tools/jumpserver/openssh-6.7p2.tar.gz
3 修改代码
本文修改的文件就涉及到两个文件:channels.c和serverloop.c
3.1 修改channels.h文件声明logfd描述符
在channels.h找到struct Chanel结构体,新添加一行(可以加在105行int sock后面),目的是新建一个文件描述符,在用户登陆时,打开一个文件,赋值给该文件描述符;(图片见文尾下在文档)
1 |
int logfd; |
3.2 修改channels.c初始化上面新建的logfd
找到channel_new(char *ctype, int type, int rfd, int wfd, int efd, u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock)这个函数,添加上面一行内容,初始该logfd为- 1可以放到此函数内c->flags = 0;后面(图片见文尾下在文档)
1 |
c->logfd = -1; |
3.3 修改serverloop.c记录用户操作记录
当用户登陆时,创建一个文件,该文件将是记录用户的操作记录,打开serverloop.c文件。
在serverloop.c中找到server_request_session(void)函数,在上图(图片见文尾下在文档)的位置添加红框部分内容,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/* add by fengjie.zhou for log start*/ time_t t=time(NULL); struct tm *loc_time=localtime(&t); char *dir; char *logfile; asprintf(&dir,"/data/proclog/log/.sshlogs/%s/%4i/%.2i/%.2i", the_authctxt->user, loc_time->tm_year+1900, loc_time->tm_mon+1, loc_time->tm_mday); if (access(dir, F_OK) != 0){ if (createdir(dir) != 0) debug("mkdir error: %s",dir); } asprintf(&logfile,"%s/%.2i.%.2i.%.2i.log", dir, loc_time->tm_hour, loc_time->tm_min, loc_time->tm_sec); if ((c->logfd=open(logfile, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) == -1 ){ c->logfd=-1; debug("can not open file: %s", logfile); } free(logfile); free(dir); /* add by fengjie.zhou for log end*/ |
当然这里面有一个自己写的函数creatdir,按日期建目录,可以放在server_request_session(void)上面,如下图就是createdir函数(图片见文尾下在文档)。
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/* add by fengjie.zhou for log dir creat start */ static int createdir(const char *sPathName) { char DirName[256]; strcpy(DirName, sPathName); int i,len = strlen(DirName); if(DirName[len-1]!='/') strcat(DirName,"/"); for(i=1; i<=len; i++) { if(DirName[i]=='/') { DirName[i] = 0; if(access(DirName, F_OK)!=0) { if(mkdir(DirName, S_IRWXU)==-1) { return -1; } } DirName[i] = '/'; } } return 0; } /* add by fengjie.zhou for log dir creat end */ |
3.4 修改channels.c记录用户屏幕输出
记录用户的屏幕输出,打开channels.c源文件,修改如下:
在channel.c找到channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)函数,在上图(图片见文尾下在文档)位置添加红框部分内容,记录用户的操作记录。代码如下:
1 2 3 4 5 |
/* remem screen log by fengjie.zhou start */ if (c->logfd != -1) { write(c->logfd, buf, len); } /* remem screen log by fengjie.zhou end */ |
3.5 修改channels.c用户登出时关闭文件
用户登出时关闭记录文件,打开channels.c:
在channel.c中找到channel_free(Channel *c)函数,在上图(图片见文尾下在文档)位置添加红框部分,目的是用户logout时关闭日录文件,代码如下:
1 2 3 4 |
/* add by fengjie.zhou for free log remember start */ if (c->logfd != -1) close(c->logfd); /* add by fengjie.zhou for free log remember end */ |
4 安装测试
最后编译安装,为了不影响系统自带的openssh,可以安装在/usr/local/openssh中,等测试没有问题了再覆盖安装,如下
1 2 3 |
./configure --prefix=/usr/local/openssh make make install |
执行完这三步后,停止系统自带的sshd进程:/etc/init.d/sshd stop
启用修改后重新编译的openssh: /usr/local/openssh/sbin/sshd
找另外一台登陆一下该服务器,验证一下。
下图是ssh登陆时执行的几个操作:
为了方便大家保存,www.zhoufengjie.cn上面的文章尽量都会做成pdf文档形式方便大家留存,尽最大方便给大家提供服务,本文文档(word原始文档)下载地址:点击下载
##############更新版本:openssh-7.5p1##########
下载代码(也可以从官网上下),下载地址【浏览器下载】:
https://download.zhoufengjie.cn/software/tools/jumpserver/openssh-7.5p1.tar.gz
下载patch包,下载地址【浏览器下载】:
https://download.zhoufengjie.cn/software/tools/jumpserver/openssh-7.5p1.sshlog.patch
然后解压打path包
1 2 3 |
tar zxvf openssh-7.5p1.tar.gz cd openssh-7.5p1 patch -p1 < ../openssh-7.5p1.patch |
剩下的就是编译安装了,或者做rpm包也可以,如下方法做好rpm,然后就安装啦
1 2 3 |
yum install rpm-build -y cd contrib/redhat rpmbuild -ba openssh.spec |