shell如何记录用户的IP与命令详解
记录输入的命令
history命令可以查看用户输入过的命令,一个典型history命令输出如下:
9802017-05-2920:17:37cd- 9812017-05-2920:17:41catindex.html 9822017-05-2920:20:11vimindex.html 9832017-05-2920:39:18cd- 9842017-05-2920:39:25cd/var/log/nginx/ 9852017-05-2920:39:27vimaccess.log 9862017-05-2920:50:10netstat-ntlp 9872017-05-3111:04:39tmuxa-t0 9882017-05-3111:15:42exit 9892017-05-3112:32:38tmuxa-t0
记录IP
为了记录用户的IP,需要首先获取用户的登录IP。由于在用户登入期间,会话不会断开,所以只需获取一次即可。
获取IP命令:whoami|awk'{print$NF}'|sed-e's/[()]//g'。
接着按照username@ipdatetimecommand的格式记录用户的命令,这需要设置HISTTIMEFORMAT的值。获取IP和设置命令格式结合起来:
IP=`whoami|awk'{print$NF}'|sed-e's/[()]//g'` exportHISTTIMEFORMAT=$USER@$IP%F%T
为了让上述命令对所有用户生效,可将其写到/etc/profile文件中。设置完毕后(可能需要重新登录,或者用source命令重新加载/etc/profile),history命令输出如下类似结果:
412root@8.8.8.82017-06-0222:03:27netstat-nt 414root@8.8.8.82017-06-0222:03:38netstat-ntpl 415root@8.8.8.82017-06-0314:17:09history 416root@8.8.8.82017-06-0314:17:30tmuxls 417root@8.8.8.82017-06-0314:17:34tmux 418root@8.8.8.82017-06-0314:17:49tmuxa-t0
history命令的内容保存在用户的~/.bash_history文件中,用户可随时更改或者清除。为了统一管理用户的命令记录,我们希望用户执行命令后,执行的命令能输出到某个文件内。达到这个目的需要PROMPT_COMMAND环境变量的协助。
设置PROMPT_COMMAND将用户的上一条命令log到syslog里面去:
exportPROMPT_COMMAND="history1|logger-tcmd_log-puser.notice"
logger命令将信息输出到/var/log/messages中。任意输入一个命令,然后打开/var/log/messages,会看到已经记录在案。/var/log/messages文件只有root有权限访问,从而达到了记录用户IP和命令的目的。
如果你熟悉syslog,可以将命令记录输出到单独的文件中。这需要在logger命令的-p选项中指定工具名称和等级,例如local2.notice,然后编辑/etc/rsyslog.conf,将local2的信息输出到单独文件:local2.*/var/log/command.log,最后重启rsyslog服务。
通过如上设定,即可在用户无感知的情况下log用户的IP、时间和操作命令。
对用户来说,如何绕过?可以有两种方式:
- 将命令写到脚本,执行脚本;
- unsetPROMPT_COMMAND变量。
参考
https://askubuntu.com/questions/93566/how-to-log-all-bash-commands-by-all-users-on-a-server
http://moper.me/ssh-audit-chats.html
http://zhu8337797.blog.163.com/blog/static/170617549201222912830483/
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。