怎么知道谁动了我的 Linux 主机?
点击关注公众号,Java干货及时送达
Linux系统下可通过history命令查看用户所有的历史操作记录,在安全应急响应中起着非常重要的作用,但在未进行附加配置情况下,history命令只能查看用户历史操作记录,并不能区分用户以及操作时间,不便于审计分析。
当然,一些不好的操作习惯也可能通过命令历史泄露敏感信息。
下面我们来介绍如何让history日志记录更细化,更便于我们审计分析。
1、命令历史记录中加时间
默认情况下如下图所示,没有命令执行时间,不利于审计分析。
![](https://filescdn.proginn.com/704efc594f37bfd0e043aced4ad75461/402dbadea9de4114cefa2d733cd04170.webp)
通过设置export HISTTIMEFORMAT='%F %T ',让历史记录中带上命令执行时间。
注意”%T”和后面的”’”之间有空格,不然查看历史记录的时候,时间和命令之间没有分割。
要一劳永逸,这个配置可以写在/etc/profile中,当然如果要对指定用户做配置,这个配置可以写在/home/$USER/.bash_profile中。
本文将以/etc/profile为例进行演示。
![](https://filescdn.proginn.com/d7708842abf6dcfb1b1ec39d12b80322/8896438d9f90a58828fa6ff3dac892ea.webp)
要使配置立即生效请执行source /etc/profile,我们再查看history记录,可以看到记录中带上了命令执行时间。
![](https://filescdn.proginn.com/79bc6d344bb43c1c4dd0292bf2269646/81664762419b80265c8df4f6692bdb3f.webp)
如果想要实现更细化的记录,比如登陆过系统的用户、IP地址、操作命令以及操作时间一一对应,可以通过在/etc/profile里面加入以下代码实现
export HISTTIMEFORMAT="%F %Twho -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'``whoami
",注意空格都是必须的。
![](https://filescdn.proginn.com/ab5521a639535a91ab56d070f3ace19c/83c21a55932e024c47c62dc28e1f2149.webp)
修改/etc/profile并加载后,history记录如下,时间、IP、用户及执行的命令都一一对应。
![](https://filescdn.proginn.com/a92cb5bc8d223f18acd8599cb5013950/0cc1fa70fef443cb06c3907daf568966.webp)
通过以上配置,我们基本上可以满足日常的审计工作了,但了解系统的朋友应该很容易看出来,这种方法只是设置了环境变量,攻击者unset掉这个环境变量,或者直接删除命令历史,对于安全应急来说,这无疑是一个灾难。
针对这样的问题,我们应该如何应对,下面才是我们今天的重点,通过修改bash源码,让history记录通过syslog发送到远程logserver中,大大增加了攻击者对history记录完整性破坏的难度。
2、修改bash源码,支持syslog记录
首先下载bash源码,可以从gnu.org下载,这里不做详细说明了,系统需要安装gcc等编译环境。我们用bash4.4版本做演示。
修改源码:bashhist.c
![](https://filescdn.proginn.com/ef1c542773f60c104dbf5601cff9bc1f/7c568ac09cc70fdf623857422f671c24.webp)
修改源码config-top.h,取消/#define SYSLOG_HISTORY/这行的注释
![](https://filescdn.proginn.com/058e228df02ccec595d2da4ca09c1039/50325691c6856d590720874ef613165f.webp)
编译安装,编译过程不做详细说明,本文中使用的编译参数为:./configure --prefix=/usr/local/bash,安装成功后对应目录如下:
![](https://filescdn.proginn.com/181416a3a2a4ddf4d47bc11d4f1a95a2/24c21fc27dbcebdf7ca18f6a3e0f4610.webp)
此时可以修改/etc/passwd中用户shell环境,也可以用编译好的文件直接替换原有的bash二进制文件,但最好对原文件做好备份。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java/ Linux 系列面试题和答案,非常齐全。
替换时要注意两点:
1、一定要给可执行权限,默认是有的,不过有时候下载到windows系统后,再上传就没有可执行权限了,这里一定要确定,不然你会后悔的;
2、替换时原bash被占用,可以修改原用户的bash环境后再进行替换。
查看效果,我们发现history记录已经写到了/var/log/message中。
![](https://filescdn.proginn.com/e1f334255211e2e0feca35aa1a016ed2/8433f9bc623fc11bc1c0ae0845091eb8.webp)
如果要写到远程logserver,需要配置syslog服务,具体配置这里不做详细讲解,大家自己研究,发送到远端logserver效果如下图所示。
![](https://filescdn.proginn.com/394de1d636e9f714074d724d1472a353/de9e822d5657b160984b5b5dedcbd47a.webp)
通过以上手段,可以有效保证history记录的完整性,避免攻击者登录系统后,通过取消环境变量、删除history记录等方式抹掉操作行为,为安全审计、应急响应等提供了完整的原始数据。
最后,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java/ Linux 系列面试题和答案,非常齐全。
来源:悬镜安全实验室
地址:http://lab.xmirror.cn/2017/05/26/sdlwdzj/
![](https://filescdn.proginn.com/f3e1459740e32900cd0d919779f6bff3/aa5bdc63f1d61a8efdaa5e245eff5dad.webp)
![](https://filescdn.proginn.com/2792ec8c0e34838b496529c2c014775c/e2d515c228e51980431fb7e359c69907.webp)
![](https://filescdn.proginn.com/20f12fb67c0a74c666f48e603483aa2f/09a10c547b4cb20f9467e337292a8c4b.webp)
![](https://filescdn.proginn.com/0f3ee9f2384b51c948cef3668a9993dc/e5d23abde371f8eef069b1cd62c5e8d0.webp)
![](https://filescdn.proginn.com/91edc032ab98b5b4493bcb91ce935ae7/a218c06d71b2ef99aef8578be55906a4.webp)
关注Java技术栈看更多干货
![](https://filescdn.proginn.com/b22e542cb0deb8d8ee7a55c073eb1e8e/3a311dcd0bb7e84ae73f4482f7c28f8e.webp)