行业洞察

一次真实服务器入侵的教训:保障主机基础设施安全的 8 个习惯

4 个步骤 5 分钟阅读 10 次阅读 0
本文目录

我们最近调查了一起针对某主机公司管理基础设施的入侵事件。整个过程毫无特别之处:没有零日漏洞,也没有国家级攻击工具。它只是一连串普通习惯的叠加,每一个单独看都无害,合在一起却让攻击者悄无声息地潜伏了一个多星期。下面介绍事件经过、最终如何被发现,以及几乎可以在每一步阻止入侵的八个习惯。

入侵经过

  1. 共用 root 密码。包括一台管理服务器和一台跳板机在内的多台服务器使用相同的 root 密码,并且允许通过 SSH 密码登录。
  2. 悄无声息的首次登录。攻击者用这个密码登录了一次,并留下一条 SSH 隧道。隧道不会打开终端,因此从未出现在 who 中。它一直保持了九天。
  3. 动静很大的第二阶段。一个多星期后,多个 IP 使用同一个密码登录,添加了自己的 SSH 密钥,创建了 systemd 服务和计划任务,并在网站中植入了 webshell。
  4. 掩盖痕迹。攻击者将文件修改时间回调了一周,让新文件看起来像旧文件;使用了一次性、执行后自删除的 webshell;并在 /tmp 中留下了一个隐藏的 PHP 文件。
  5. 被发现。之所以被发现,是因为业主申请了一次例行安全检查,登录日志显示有来自无人认识的 IP 的 root 密码登录。

阻断攻击链的 8 个习惯

1. 只用密钥登录,任何地方都不重复使用密码

关闭 SSH 密码登录,为每个人分配各自的密钥。这样即使密码泄露也毫无用处,一个被盗的凭据也绝不会打开所有机器。请参阅 设置 SSH 密钥登录。

2. 把跳板机和管理服务器当作最核心的资产

跳板机或管理服务器可以访问其他所有机器,因此是最有价值的攻击目标。为它设置独立的凭据、最严格的防火墙和最密切的监控。一旦被入侵,应当重建,而不是清理。

3. 每次登录都收到提醒

那条隧道能运行九天,是因为没有人收到登录通知。每次 SSH 和面板登录都发送一条 Telegram 消息,陌生 IP 就会立刻暴露。设置大约只需十分钟:审计登录并设置 Telegram 提醒。

4. 检查连接,而不只是会话

除了 who,还要用 ss -tnp 检查来自陌生 IP 的长时间 SSH 连接。隧道和 SFTP 会话在常用命令中是看不到的。

5. 所有面板都开启双因素认证

主机面板、计费系统和服务器管理面板掌握着一切的钥匙。请开启两步验证,并尽可能将管理页面限制为已知 IP 访问。宝塔面板请参阅 宝塔面板安全加固指南。

6. 不要相信文件日期

修改时间很容易伪造。排查植入文件时,请使用 change time(状态变更时间)和 birth time(创建时间),普通用户态进程无法将其回调:

find /var/www /tmp /dev/shm -newerct "-14 days" -type f 2>/dev/null
stat /path/to/suspicious.php    # compare Modify with Change and Birth

7. 关闭不需要开放的端口

数据库端口、面板端口和管理路径不应对整个互联网开放。只放行您自己的 IP,将网站放在可隐藏源站的代理后面,并将防火墙默认策略设为拒绝。请参阅 使用 Cloudflare 隐藏源站 IP。

8. 事件发生后,更换所有凭据并保留证据

终止活动会话,但在删除任何东西之前,先把日志和可疑文件拷贝到安全的地方。然后更换被入侵机器能接触到的所有密码、密钥和 API 令牌,包括数据库和支付网关凭据。完整的清理清单请参阅 检查 Linux 服务器是否被入侵。

出问题时,好的基础设施能为您提供什么

能否控制住局面,取决于您在出事之前就掌握的控制能力。在 IMIDC 独立服务器上,即使您用防火墙封锁了其他所有访问,仍然可以通过 VNC 控制台 访问服务器屏幕;可以启动 救援系统 离线检查硬盘;也可以 重装 您不再信任的服务器。这些都能在客户中心自助完成(请参阅 独立服务器管理面板使用指南)。当您需要有人帮忙把关时,我们的 7×24 小时技术支持团队可以协助审查日志和清理。

10 分钟自查

grep "Accepted password" /var/log/auth.log* | tail     # any password logins?
ssh-keygen -lf /root/.ssh/authorized_keys              # do you know every key?
ss -tnp | grep sshd                                    # unknown long-lived connections?
crontab -l; ls /etc/cron.d /etc/systemd/system         # anything you did not add?
find /tmp /var/tmp /dev/shm -name ".*" -type f         # hidden files in temp dirs?

如果发现任何陌生的内容,请先停下来调查,再做进一步修改。提交工单,IMIDC 团队将协助您逐步排查。

相关文章

这篇文章有帮助吗?

相关教程