Linux history
history 命令来查看命令历史记录,但是实际上 history 命令并非只有这个功能,history 还有很多有用的功能。尤其是 Bash 版本的 history 命令,它所提供的功能比所有其他的 Linux Shell history 命令所提供的都要多。
Bash 的历史悠久,是一个古老的 Shell ,并且它还有一个更古老的前身 the Bourne Shell (sh) 。因此,Bash 的 history 命令是所有的 Linux Shell history 命令中功能最丰富的。Bash 版本的 history 命令不仅支持反向搜索、快速调用,还支持重写历史记录等等功能。
善用 Bash history 命令以上的这些功能都可以提高工作效率, Bash history 命令以及它常用的功能:

history 是内置的命令

history 命令与许多其他的命令不同。可能习惯于命令都作为可执行文件放置在常见的系统级的位置,例如 /usr/bin/usr/local/bin〜/ bin。但是,内置的 history 命令并不在环境变量 PATH 保存的路径中的。
实际上,history 命令并没有保存在物理位置中:

  1. which history
  2. /usr/bin/which: no history

image.png
history 其实是 Shell 本身的一个内置函数:

  1. [root@iZuligp6e1dyzfZ ~ 09:16]# type history
  2. history is a shell builtin
  3. [root@iZuligp6e1dyzfZ ~ 09:17]# help history

image.png
由于 history 是 Shell 的内置函数,所以每种 Shell 的 history 函数都是独一无二的。因此,在 Bash 中能使用的功能可能无法在 Tcsh,Fish 或 Dash 中使用,同样的,在 Tcsh,Fish 或 Dash 中能使用的功能也可能无法在 Bash 中使用。

查看Bash 命令历史记录

history 命令最基本,最频繁的用法就是查看Shell 会话的命令历史记录:

  1. history

image.png

事件提示符(命令回放)

事件提示符 (!) 是按事件搜索历史记录的。这里的事件,指的是每一条记录在历史记录里的命令。换句话说,它就是一行命令,并被数字索引标记着以供引用。
要重新运行历史记录中的一个命令,用 ! 直接加上 (无空格) 想要运行的命令前面的索引数字即可。例如,假设历史记录中的第一条指令是 echo Fcant ,然后想重新运行它:

  1. [root@iZuligp6e1dyzfZ ~ 09:22]# !1002

image.png
还可以通过从历史记录中的当前位置开始提供负数的行来使用相对定位。例如,返回历史记录中倒数第3条命令:

  1. 1002 echo "Fcant"
  2. 1003 ll
  3. 1004 cd /
  4. 1005 ll
  5. 1006 history -3
  6. 1007 history
  7. [root@iZuligp6e1dyzfZ / 09:24]# !-6
  8. echo "Fcant"
  9. Fcant

image.png
只想返回上一条命令,可以使用简写 !! 来替代 !-1。这整整节省了一次按键的时间

  1. [root@iZuligp6e1dyzfZ / 09:24]# !!

image.png

字符串搜索

:::danger 若是历史记录中包含目标字符串的命令不止一条,则它只会执行符合条件的命令中最后的一条 :::

命令的精确搜索

也可以通过特定的字符串来搜索历史记录中的命令并运行它。
若是想要搜索以特定字符串开头的命令,就用 ! 直接加上 (无空格) 想要搜索的字符串:

  1. [root@iZuligp6e1dyzfZ / 09:25]# !echo
  2. echo "Fcant"
  3. Fcant

image.png

命令的模糊查询

还可以搜索在任意位置包含特定字符串的命令。要做到这点,只需要用 ! 直接加上前后两端都被 ? 包围的特定字符串即可,像这样:

  1. [root@iZuligp6e1dyzfZ / 09:27]# !?Fcant?
  2. echo "Fcant"
  3. Fcant

image.png

命令的匹配搜索(向后匹配)

  1. [root@iZuligp6e1dyzfZ / 09:27]# !?Fcant
  2. echo "Fcant"
  3. Fcant

image.png

不支持向前匹配搜索

image.png

字符串替换

可以搜索一个特定的字符串并用新字符串替换它,从而更改命令:

  1. [root@iZuligp6e1dyzfZ / 09:46]# echo 'Fcant'
  2. Fcant
  3. [root@iZuligp6e1dyzfZ / 09:47]# ^Fcant^Hello
  4. echo 'Hello '
  5. Hello

image.png
但是它只能替换第一次出现的目标字符串,若是命令中出现两次目标字符串,则只有第一次出现的会被替换,像这样:

  1. [root@iZuligp6e1dyzfZ / 09:48]# echo 'Hello Fc Fc'
  2. Hello Fc Fc
  3. [root@iZuligp6e1dyzfZ / 09:48]# ^Fc^Fcant
  4. echo 'Hello Fcant Fc'
  5. Hello Fcant Fc

image.png
与字符串搜索一样,当历史记录中包含目标字符串的命令不止一条时,只替换并执行最后一条:

  1. [root@iZuligp6e1dyzfZ / 09:48]# echo 'Hello Fcant Fc'
  2. Hello Fcant Fc
  3. [root@iZuligp6e1dyzfZ / 09:49]# echo 'Hello'
  4. Hello
  5. [root@iZuligp6e1dyzfZ / 09:49]# ^Hello^World
  6. echo 'World'
  7. World

image.png

HISTORY命令配置记录时间

Linux系统下可通过history命令查看用户所有的历史操作记录,在安全应急响应中起着非常重要的作用,但在未进行附加配置情况下,history命令只能查看用户历史操作记录,并不能区分用户以及操作时间,不便于审计分析。
当然,一些不好的操作习惯也可能通过命令历史泄露敏感信息。

1、命令历史记录中加时间

默认情况下没有命令执行时间,不利于审计分析。
通过设置export HISTTIMEFORMAT='%F %T ',让历史记录中带上命令执行时间。
注意“%T”和后面的“'”之间有空格,不然查看历史记录的时候,时间和命令之间没有分割。
要一劳永逸,这个配置可以写在/etc/profile中,当然如果要对指定用户做配置,这个配置可以写在/home/$USER/.bash_profile中。
要使配置立即生效请执行source /etc/profile,再查看history记录,可以看到记录中带上了命令执行时间。
如果想要实现更细化的记录,比如登陆过系统的用户、IP地址、操作命令以及操作时间一一对应,可以通过在/etc/profile里面加入以下代码实现
export HISTTIMEFORMAT="%F %T who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'``whoami ",注意空格都是必须的。
修改/etc/profile并加载后,history记录如下,时间、IP、用户及执行的命令都一一对应。
通过以上配置,基本上可以满足日常的审计工作了,但了解系统的朋友应该很容易看出来,这种方法只是设置了环境变量,攻击者unset掉这个环境变量,或者直接删除命令历史,对于安全应急来说,这无疑是一个灾难。
针对这样的问题,应该如何应对,下面才是重点,通过修改bash源码,让history记录通过syslog发送到远程logserver中,大大增加了攻击者对history记录完整性破坏的难度。

2、修改bash源码,支持syslog记录

首先下载bash源码,可以从gnu.org下载,系统需要安装gcc等编译环境。这里下载的是bash4.4版本。
修改源码:bashhist.c
修改源码config-top.h,取消/#define SYSLOG_HISTORY/这行的注释
编译安装,编译参数为:./configure --prefix=/usr/local/bash,安装成功后.
此时可以修改/etc/passwd中用户Shell环境,也可以用编译好的文件直接替换原有的bash二进制文件,但最好对原文件做好备份。
替换时要注意两点:
1、一定要给可执行权限,默认是有的,不过有时候下载到Windows系统后,再上传就没有可执行权限了,这里一定要确定,不然会后悔的;
2、替换时原bash被占用,可以修改原用户的bash环境后再进行替换。
查看效果,可以发现history记录已经写到了/var/log/message中。
如果要写到远程logserver,需要配置syslog服务。
通过以上手段,可以有效保证history记录的完整性,避免攻击者登录系统后,通过取消环境变量、删除history记录等方式抹掉操作行为,为安全审计、应急响应等提供了完整的原始数据。