问题:
我在异地 Linux/Apache 服务器上丢失了几个目录。我已经从 httpd 错误日志中追踪到它们丢失的时间,并且我有一份该机器的 SSL 登录列表(包括网络地址)。
有几个人可以访问我机器上的帐户,所以我想确认这些文件是被意外删除还是故意删除的。如果我能确定会话来自外部网络地址,那么我就可以肯定这是故意的。否则我将需要更多信息。
问题:
有没有办法确定哪个用户帐户(我的还是 root)、网络会话或进程删除了这些文件?我并不担心恢复它们,因为备份是最近的。
相关问题:
我尝试查看我自己帐户的 bash 历史记录(除 root 之外唯一具有权限的帐户),但它似乎只能追溯到我的 SSL 会话的开始。这是否意味着 bash 历史记录被篡改了,还是这是正常现象?
答案1
默认情况下,不会记录此信息(想象一下日志会变得多大)。您可以使用 auditctl 或 inotify/iwatch 添加日志(有趣的选项,请查看),或者您的控制面板日志或 ftp 日志(通常都在 /var/log 的某个地方)或 bash 历史记录可能会帮助您稍微追踪一下。检查您的 HTTP 访问日志,以防某些 GET 请求设法执行此操作(不太可能,但有可能)
如果您的历史记录不存在,则表示它已被清除。这可以手动完成,也可以使用 .bash_logout 或 .logout 文件中的命令完成。
另外,它是 SSH 而不是 SSL :)
答案2
清理总是很困难。您可以使用的资源:
要确定谁登录以及从哪里登录:
- 最后/最后日志
- /var/log/secure(大多数时候显示成功和失败的登录)
确定当时发生的情况:
- ausearch(假设您正在审计;如果不是,您可能考虑开始)
- sar(确定系统当时是空闲还是繁忙)
如果自事件发生以来没有发生太多变动,目录上的 mtime 可能会有有用的信息(可能没有,但无论如何我通常喜欢收集这类数据)
未来,让每个有权访问机器的人都拥有自己的帐户。你现在拥有的帐户非常愚蠢,因为你刚刚发现了原因;你无法知道谁做了什么。
答案3
仅当您关闭 shell 时才会写入 bash 历史记录(您可以为当前会话停用该 shell)。在正在运行的 bash 会话中,您无法在 bash 历史记录文件中看到在该会话中输入的命令 - 关闭该会话,启动一个新会话,然后您应该能够看到它。
答案4
唯一可靠的方法是运行系统会计(如 sar 或类似程序)。其他方法可能会给你答案,但不能保证:
bash 历史记录无法保证,因为 (a) 存在历史记录限制;(b) 默认情况下不会立即写入;(c) 您必须搜索所有用户帐户的所有 bash 历史记录;(d) 历史记录选项会影响行为;(e) 用户可以清除自己的 bash 历史记录(防止其被写入文件。)
sftp 默认不记录交易,但如果需要,可以在 sftp 服务器上启用此功能。通过 sftp 或 ftp 添加或删除的文件不会记录到 shell 历史记录文件或任何其他地方。
在您的特定情况下,如果您尚未运行会计,那么您唯一的办法就是搜索所有用户帐户的 shell 命令历史记录,希望它能够保留下来。