我们最近调查了一起针对某主机公司管理基础设施的入侵事件。整个过程毫无特别之处:没有零日漏洞,也没有国家级攻击工具。它只是一连串普通习惯的叠加,每一个单独看都无害,合在一起却让攻击者悄无声息地潜伏了一个多星期。下面介绍事件经过、最终如何被发现,以及几乎可以在每一步阻止入侵的八个习惯。
who 中。它一直保持了九天。/tmp 中留下了一个隐藏的 PHP 文件。关闭 SSH 密码登录,为每个人分配各自的密钥。这样即使密码泄露也毫无用处,一个被盗的凭据也绝不会打开所有机器。请参阅 设置 SSH 密钥登录。
跳板机或管理服务器可以访问其他所有机器,因此是最有价值的攻击目标。为它设置独立的凭据、最严格的防火墙和最密切的监控。一旦被入侵,应当重建,而不是清理。
那条隧道能运行九天,是因为没有人收到登录通知。每次 SSH 和面板登录都发送一条 Telegram 消息,陌生 IP 就会立刻暴露。设置大约只需十分钟:审计登录并设置 Telegram 提醒。
除了 who,还要用 ss -tnp 检查来自陌生 IP 的长时间 SSH 连接。隧道和 SFTP 会话在常用命令中是看不到的。
主机面板、计费系统和服务器管理面板掌握着一切的钥匙。请开启两步验证,并尽可能将管理页面限制为已知 IP 访问。宝塔面板请参阅 宝塔面板安全加固指南。
修改时间很容易伪造。排查植入文件时,请使用 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
数据库端口、面板端口和管理路径不应对整个互联网开放。只放行您自己的 IP,将网站放在可隐藏源站的代理后面,并将防火墙默认策略设为拒绝。请参阅 使用 Cloudflare 隐藏源站 IP。
终止活动会话,但在删除任何东西之前,先把日志和可疑文件拷贝到安全的地方。然后更换被入侵机器能接触到的所有密码、密钥和 API 令牌,包括数据库和支付网关凭据。完整的清理清单请参阅 检查 Linux 服务器是否被入侵。
能否控制住局面,取决于您在出事之前就掌握的控制能力。在 IMIDC 独立服务器上,即使您用防火墙封锁了其他所有访问,仍然可以通过 VNC 控制台 访问服务器屏幕;可以启动 救援系统 离线检查硬盘;也可以 重装 您不再信任的服务器。这些都能在客户中心自助完成(请参阅 独立服务器管理面板使用指南)。当您需要有人帮忙把关时,我们的 7×24 小时技术支持团队可以协助审查日志和清理。
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 团队将协助您逐步排查。