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  |