情况说明

之前的领导离职后,让我接手阿里云服务器。原有的服务器我是不敢动的,不管它报了多少的警告和待处理事务。昨天更换账号绑定的手机号,试了我的手机号,提示绑定了太多账号了。换成公司行政的手机号,通过了。准备注销登录时,瞄了一眼账户余额,发现只有 100 出头的样子,这让我心生疑惑。

因为上周刚充值了 200 的余额,我计算过所有后付费项每天的开销,一个月的开销也就有在 130 - 140 这样子,怎了可能两天就用了这么多呢,查看费用账单,发现多了一项按需付费的云服务器ECS。云服务器 ESC 一栏找到了这台服务器,8 核 8 G,带宽 50 M,每个小时收费 1.17,难怪余额消耗速度变快了很多。询问了身边所有的小伙伴们,都说不清楚。也就是说这台服务器莫名其妙的被创建了。

问题探究

不能任由这台不知名的服务器继续这样运行下去,那样账户余额支撑不了几天。想明确的知道是谁创建的这台服务器,什么时候创建的。但所有接触服务器的人用的都是同一个账号,唯一能把控的点在异地登录会有手机号验证。前领导说不知情,那么只能从阿里云本身的操作日志入手。因为在我看来,阿里云肯定会有日志的。找了一下,确实有。操作审计下面的历史事件查询有详细的事件时间、用户名、事件名和操作的资源信息。

有两个比较特别的事件名映入我的脑海,CreateInstance 和 ConsoleSignin。从字面意思就能明白,一个表示创建实例,一个表示控制台登录。这两个事件相当重要,创建实例就是创建云服务器,追踪这个事件可以找到创建那台不知名服务器的具体时间和创建 IP;而控制台登录可以追踪最近所有登录到控制台的用户。虽然用户都是 root,但登录的 IP 地址可以区分身份。比如说公司环境登录会有一个固定的 IP 地址,如果通过公司 IP 地址登录并创建的实例,那么两个事件的 IP 地址会相同,都是公司的 IP。如果是其他地址的 IP,也可以通过报警查到具体的地理位置。

展开高级搜索项,在事件名称栏输入 CreateInstance 进行查找,对比实例的 ID, 找到了那条创建记录。

CreateInstance 事件创建记录

后续的几个操作是,分配公网 IP 地址,启动实例,执行命令。点开详情查看操作 IP 地址:147.75.195.122173.244.55.89。用站长之家工具查看 IP 所属地,一个是瑞士,一个是美国。What? Σ(っ °Д °;)っ 完全给整蒙了,这是什么操作?异地登录是需要手机号验证码的,怎么可能会给一个国外的 IP 登录进去呢?难道用的是 VPN?或者说一开始登录的 IP 是常用登录地址,之后切换到了 VPN 之类的网络创建实例?

不清楚情况,以同样的方式继续查找 ConsoleSignin 事件的操作记录,奇了怪了,不知名服务器被创建的那天 4.11 并没有登录记录,往前追溯,最近的登录时间也在 4.7。这不合理。阿里云登录状态是有时间限制的,十几分钟还是默认 24 分钟不清楚,但我经常会挂在那一会儿,再操作登录态就已经过期了。这也是一种安全机制。

一台以国外 IP 在 4.11 凌晨 2-3 点创建并且没有 IP 登录记录的服务器,多么的神奇!我想登录到服务器看看在运行什么内容,但不知道密码,改密码也怕惊动对方,在没搞清楚情况之前,不冒险做任何的操作。当然可以直接把这台服务器直接给删了,但我还是想弄清楚这台服务器到底是谁创建的,又是怎么创建的。自己解决不了,就找客服吧,找了半天智能客服没能解决问题,人工没有通道,只能提交工单了,选择了阿里云账号问题相关,详细说明了不知名服务器的情况,并附上了该服务器的实例 ID。

等了有几十分钟,反馈回来了,售后工程师说是那台服务器是通过 AccessKey 创建的,并附上了 accesskeyID 的前后部分内容以及 AccessKey 的入口。控制台右上角头像一栏 hover 上去,弹出的菜单栏中会有 Accesskey 管理一项,点击去发现,果然里面有一条 AccessKey 的记录,Key 值前后部分与他提供的信息完全一致。小哥哥提示我应该是 AccessKey 泄露了。我想继续查询之前的历史事件记录,因为操作审计的记录只有 90 天的。小哥哥反馈说之前记录已经被覆盖了,那就算了吧!

AccessKey 的获取是需要手机号验证的,那么也就是说,泄露者就是我们自己内部的人。这条泄露的 AccessKey 创建时间是 2019 年 2 月份,而我是最近接手,也没有获取过,那么只能找前领导询问了。他一开始比较有抵触心理,毕竟离职过程不是很愉快,后面也是他提供了线索,最终证实 AccessKey 是之前一位同事发布项目到 github 上而导致泄露的,前领导还收到了警报短信。当时的处理是让那个同事尽快删除泄露 AccessKey 的文件。

到这儿一切都明朗了,阿里云的 AccessKey 泄露,导致控制台权限被窃取,造成了现在莫名其妙多了一台云主机的情况。好在损失不算太大,如果操作者把几台有数据程序运行的服务器给删了或者窃取相关服务器的数据内容,那就麻烦了。现在的处理就是禁用这条 AccessKey,并释放不知名的云主机。好奇心使然,我在释放主机之前改了登录密码进去瞄了一眼,里面什么都没有。好吧,估计操纵者也只是测试一下我们这边反应,还没有想好具体要用这台服务器做些什么。

最后一句忠告:github 有风险,上传代码须谨慎!