为了方便大家保存,www.zhoufengjie.cn上面的文章尽量都会做成pdf文档形式方便大家留存,尽最大方便给大家提供服务,本文文档(word原始文档)下载地址:点击下载
1 前言
做了跳板机之后,发现有的时候有人做了误操作,需要进行查看,因此想起修改ssh的源代码,记录用户的操作日志,本文来自互联网,后面带着大家一步一步进行修改;
2 下载openssh源代码
openssh的官方下载地址(请自己找最新的openssh源码下载):http://www.openssh.com/portable.html
比如:http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz如果大家想一步到位,也可以直接下载我修改完的ssh代码进行编译安装即可,下载地址:
1 |
http://download.zhoufengjie.cn/software/tools/jumpserver/openssh-7.8p1.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(struct ssh *ssh, 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->istate = CHAN_INPUT_OPEN;后面
1 |
c->logfd = -1; |
3.3 修改serverloop.c记录用户操作记录
当用户登陆时,创建一个文件,该文件将是记录用户的操作记录,打开serverloop.c文件。
在serverloop.c中找到server_request_session(void)函数,在上图的位置添加红框部分内容,内容如下[根据上下文做好tab缩进]:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* add by fengjie.zhou for log start*/ time_t t=time(NULL); struct tm *loc_time=localtime(&t); char *dir; char *logfile; asprintf(&dir,"/var/log/.sshlogs/%4i/%.2i/%.2i", 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/%s-%.2i.%.2i.%.2i.log", dir, the_authctxt->user, 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函数【做好tab缩进】。
代码为:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/* 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源文件,修改如下:
在channels.c找到channel_handle_rfd(struct ssh *ssh, Channel *c, fd_set *readset, fd_set *writeset)函数,在上图位置添加红框部分内容,记录用户的操作记录。代码如下【注意自己的tab缩进】:
1 2 3 4 5 6 7 8 9 |
/* remem screen log by fengjie.zhou begin */ write(c->logfd, buf, len); } else { 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 5 6 7 |
/* 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 4 5 |
./configure --prefix=/usr/local/openssh make make install |
执行完这三步后,停止系统自带的sshd进程:/etc/init.d/sshd stop
启用修改后重新编译的openssh: /usr/local/openssh/sbin/sshd
找另外一台登陆一下该服务器,验证一下。
下图是ssh登陆时执行的几个操作: