Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add an example of security #49

Merged
merged 6 commits into from
Mar 5, 2025
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
change as suggested
  • Loading branch information
JiaminL committed Feb 22, 2025
commit ae93bb5c3115967d1012bae66c5849102ed532ee
12 changes: 6 additions & 6 deletions docs/ops/security.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ int main() {

如果攻击者拥有机器的 root 权限,那么这些日志可能会被删除;如果入侵与发现之间距离时间很长,旧的日志也有可能会被 rotate。因此在有必要的情况下,需要定时备份日志,或者利用 `rsyslog` 等工具将日志实时发送到其他服务器上。

此外,如果机器已经被感染,那么执行的命令输出结果可能不可信。例如,攻击者可以修改 `/etc/ld.so.preload` 文件,在所有动态链接的程序执行之前加载自己的恶意代码,或是直接将系统程序替换为有问题的版本;攻击者也可能通过直接注入恶意内核模块的方式干扰所有用户态程序的运行。如果不便使用 LiveCD 等方式加载其他操作系统检查,可以使用静态链接的 busybox 工具初步排查是否存在恶意篡改的问题。一种可以快速判断某个特定文件是否被修改的方式是使用 `stat`(建议在离线环境中)检查文件的 `Change` 时间戳——`Modify` 时间戳(mtime)表示文件内容的最后修改时间,可以被修改,而 `Change` 时间戳(ctime)表示文件元数据(包括 mtime)的最后修改时间,无法被随意修改。
此外,如果机器已经被感染,那么执行的命令输出结果可能不可信。例如,攻击者可以修改 `/etc/ld.so.preload` 文件,在所有动态链接的程序执行之前加载自己的恶意代码,或是直接将系统程序替换为有问题的版本;攻击者也可能通过直接注入恶意内核模块的方式干扰所有用户态程序的运行。如果不便使用 LiveCD 等方式加载其他操作系统检查,可以使用静态链接的 busybox 工具初步排查是否存在恶意篡改的问题。一种可以快速判断某个特定文件是否被修改的方式是使用 `stat` 或 `ls -lc`(建议在离线环境中)检查文件的 `Change` 时间戳——`Modify` 时间戳(mtime)表示文件内容的最后修改时间,可以被修改,而 `Change` 时间戳(ctime)表示文件元数据(包括 mtime)的最后修改时间,无法被随意修改。

在必要的情况下,也可以使用工具 dump 系统的内存镜像或是磁盘镜像到其他机器上,以便进一步分析。磁盘镜像可以使用 `dd` 工具提取,而内存镜像可以使用 [AVML](https://github.com/microsoft/avml) 或者 [LiME](https://github.com/504ensicsLabs/LiME) 提取后,使用 [Volatility](https://volatilityfoundation.org/the-volatility-framework/) 分析。

Expand Down Expand Up @@ -906,11 +906,7 @@ root@lab-server:~# tr \\0 \ < /proc/18790/cmdline

**异常公钥**:查看 root 用户的 `authorized_keys`,发现其中存在一个不属于实验室管理员的 SSH 公钥。进一步排查发现,该公钥也出现在中心节点上 A 同学的 `authorized_keys` 中。

**时间线索**:`stat` 该文件后,我们发现 A 同学的公钥文件的 ctime 为 **10 月 17 日 23:54:11**,而 root 用户的公钥文件 ctime 为 **10 月 18 日 00:00:53**。

!!! note

平时常用的 `ls -l` 命令查看到的文件修改时间是 modify 时间(mtime),而这个时间是可以人为修改的。而 change 时间(ctime,可以通过 `stat` 或 `ls -lc` 查看)记录了文件包括元数据变更在内的任何修改动作的时间,更可靠。
**时间线索**:`stat` 该文件后,我们发现 A 同学的公钥文件的 [ctime](#forensics) 为 **10 月 17 日 23:54:11**,而 root 用户的公钥文件 ctime 为 **10 月 18 日 00:00:53**。

**登录方式**:我们试图通过 `/var/log/auth.log` 查看攻击者的登录记录,但发现该日志已被删除,且 rsyslog 服务被关闭。幸运的是,`auth.log` 每天 0 点会自动 rotate 成为 `auth.log.1`,其中保留了 10 月 18 日前的日志。检查发现,**10 月 17 日晚 23:53:13**,A 同学的账户从先研院某 IP 登录,且使用了 A 同学自己的公钥。A 同学表示,该公钥对应的私钥同时存放在他的电脑和学校的瀚海超算中。17 日晚 22 点后,他回宿舍休息,电脑则留在高新区实验室中未锁屏。此外,瀚海超算在 17 日之前已被黑客入侵。结合这些信息,如果排除掉攻击者进入实验室来拷走 A 同学私钥这种可能性较小的方式,我们推测攻击者很可能是通过瀚海超算获得的 A 同学的私钥。

Expand Down Expand Up @@ -983,6 +979,10 @@ systemd-journald[723]: /var/log/journal/33b5f48274e0432d922e5b5d97fa1071/system.

至此,此次入侵后的事故处理告一段落。

!!! question "思考"

如果未来再次出现了有用户的密钥泄漏的情况,那么应该怎么设计来避免上文的安全问题再次发生?

<!-- markdownlint-disable MD053 -->

[^prompt]: 测试 prompt 内容:`我现在在用 FastAPI+Vue 编写一个网站,Vue 的导航方式为 history,编译后的静态 Vue 网页文件在 dist 目录下,入口文件名为 index.html。现在我要使用 FastAPI 同时作为前端和 API 的 server,API 在 /api/* 路径下,请编写代码,使得 dist 目录下没有对应文件时返回 index.html 的内容,以便即使 Vue 的路径不实际在 dist 目录下时也能正确显示对应的页面。`