擦屁股与审计

本贴最后更新于 2512 天前,其中的信息可能已经东海扬尘

Linux 上如何擦屁股与审计

概述

我们知道,当我们登陆到一台 Linux 机器,一顿操作后退出,我们的登陆信息被 last 记录、操作的命令会被 history 记录。但有些时候(机器不是自己的),我们不想这些信息被记录。但还有些时候(机器是自己的),我们希望这些信息记得更详细。

擦屁股

不要纠结为什么叫擦屁股,没上过学,词穷。总之,目的是要做到“事了拂衣去,深藏身与名”。

修改 last 记录

因为 last 记录在/var/log/wtmp 文件中,而且是非文本方式保存的,所以不能用 vim 直接打开编辑。

  1. utmpdump /var/log/wtmp > newdump 将 last 日志(wtmp)转换 ASCII 格式并保存 newdump;
  2. 用 vim 打开 newdump 编辑(当然是删掉你的记录了)。
  3. utmpdump -r newdump > /var/log/wtmp 将修改后的 newdump 文件转换成二进制并替换 wtmp;
  4. last 一下,检查

修改 history 记录

在这之前,也可以再改下/var/log/secure 文件,正常因为这个内容很多,不方便看的,除了排错我很少看它。反正,history 肯定是要最后修改了,不然.......就是智障。

  1. 因为是文本文件,所以直接用 vim 打开.bash_history 修改。
  2. history -r .bash_history 使修改生效,-r 是读的意思了。

如果,在登陆机器之前就知道要删掉记录的话,一上来就一个 cp .bash_history ./aaa,把 history 文件备份了,在退出之前 mv ./aaa .bash_historyrm ./aaahistory -r .bash_history 完美。

以上操作并不唯一,思路大概就这样。

审计

如果机器是自己的,我们可能就需要做审计了,总不能机器被黑了,别人在你机器上干了啥都不知道吧。如果都是 root,到底道高一尺魔高一丈,还是魔高一尺道高一丈真不好说。但是道和魔都是少数,大多数都是普通那个人,即使魔高一尺也不是普通人所能抵挡的。

虽然我说了些什么,但是不用在意我说了些什么。

记录登陆信息

  1. 在/etc/rsyslog.conf 文件中加入 user.notice /var/log/auth.log 一行;
  2. touch /var/log/auth.log 创建这个文件,所以文件是自定义的,与上一行的一致即可;
  3. 在/etc/profile 文件中加入 logger -p user.notice -- time=\"`(date -d now +"%Y-%m-%d %T")`\" src_ip=\"`(who -m|cut -d\( -f2|cut -d\) -f1)`\" 2>/dev/null

原理就是(参考下面的记录 shell 命令),每次登陆系统时必然会执行/etc/profile 文件,文件中利用 logger 产生一条用户自定义的记录,这条记录要保存到哪里,这个在/etc/rsyslog.conf 中指定为/var/log/auth.log,即每次有用户登陆到系统,都会把时间和 ip 记录到/var/log/auth.log 中。当然还可以记录用户名、会话 id 等。但是/var/log/auth.log 是可以被修改的,所以可以在第一步中将/var/log/auth.log 改为@192.168.1.2,即将这条记录发送到其他机器上(查 rsyslog 用法),实时的无法改的。

记录 shell 命令

  1. 在/etc/rsyslog.conf 文件中加入 local1.notice /var/log/history.log 一行;
  2. touch /var/log/hsitory.log 创建这个文件。
  3. 在/etc/profile 文件中加入 export PROMPT_COMMAND='{ cmd=$(history 1 | { read a b; echo "$b"; });msg=$(who am i |awk "{print \$2,\$5}");logger -i -p local1.notice "$msg $USER $PWD # $cmd"; }'

原理跟上面的类似,这里因为要记录所有用户的所有操作,所以不是登陆时产生一条记录就可以的。这里用到了 PROMPT_COMMAND 这个 shell 内置的变量,会在 PS1 之前执行这个变量所代表的命令。这个命令就是用 logger 产生一条记录。

总结

记录 shell 中有个问题,如果别人把命令写到脚本里甚至写到程序里,记录的只是看到执行了一个脚本的名字,里面是什么就不知道了。比如,之前的 redis 漏洞,能通过 redis 写一个 ssh key 到你的机器上,然后直接登陆到主机。这个写 key 的过程是审计不到的,所以这时需要更高级的审计方法。

要审计系统调用,可以用一个内核模块 audit。看起来能满足要求,不过这个我也没用过,没有调查就没有发言权。另外,谁有什么相关的奇技淫巧也可以告诉我。

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    939 引用 • 940 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...