【51CTO.com快译】本文中所谓的服务器被入侵或者被黑是指,未经授权的人或机器人程序(bot)登录到服务器上,企图用服务器牟取私利,通常不怀好意。
免责声明:如果你的服务器已被像NSA这样的政府组织或严密的犯罪团伙入侵,那么你不会注意到任何问题,下面介绍的这些技术意识不到它们的存在。
然而,中招的服务器大多是由机器人程序(即自动攻击程序)、缺乏经验的攻击者(比如“脚本小子”)或低级的犯罪分子实施攻击的。
一旦这类攻击者有权访问服务器,就会想方设法滥用服务器资源,而且很少采取防范措施来掩藏行踪。
一、服务器中招的症状
服务器被缺乏经验的攻击者或自动攻击程序入侵后,它们通常会消耗100%的资源。这个资源通常是CPU(用于开采加密货币或发送垃圾邮件之类的活动),也可能是带宽(用于发动拒绝服务攻击)。
这意味着,出现问题的第一个迹象是服务器 “变慢了”。这可能表现为网站页面打开慢得多,或者电子邮件花好长时间才能投递或发送。
那么你应该查看那些东西呢?
检查第1步:目前谁登录进去?
你先要查看目前都有谁登录到服务器上。发现攻击者居然登录到服务器上进行操作并不罕见。
这方面的对应命令是 w。运行w会得到下列输出:
- 08:32:55 up 98 days, 5:43, 2 users, load average: 0.05, 0.03, 0.00
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root pts/0 113.174.161.1 08:26 0.00s 0.03s 0.02s ssh root@coopeaa12
- root pts/1 78.31.109.1 08:26 0.00s 0.01s 0.00s w
其中一个IP是英国 IP,第二个IP是越南IP。这恐怕不是好事。
停下来深呼吸, 不用慌张,只要终止其SSH连接。除非你能阻止他们再次进入服务器,否则他们会很快再次进入服务器,很可能会踢走你,阻止你重新进入。
如果你确实发现了已中招的迹象,请参阅本文末尾的“如果我已中招了该怎么办”这个部分。
whois命令可以针对IP 地址来运行,然后显示注册该IP的那家组织的所有信息,包括所在国家。
检查第2步:谁已登录进去?
Linux服务器记录下哪些用户从哪个IP登录、何时登录、登录多久等信息。可使用last命令来查看这些信息。
输出类似这样:
- root pts/1 78.31.109.1 Thu Nov 30 08:26 still logged in
- root pts/0 113.174.161.1 Thu Nov 30 08:26 still logged in
- root pts/1 78.31.109.1 Thu Nov 30 08:24 - 08:26 (00:01)
- root pts/0 113.174.161.1 Wed Nov 29 12:34 - 12:52 (00:18)
- root pts/0 14.176.196.1 Mon Nov 27 13:32 - 13:53 (00:21)
这里出现了我的英国IP和几个越南IP,最上面两个IP仍处于登录状态。如果你看到任何未经授权的 IP,请参阅本文最后部分。
登录历史记录包含在~/.bash_history下的一个文本文件中,因此很容易被删除。攻击者常常会直接删掉该文件,企图掩盖其行踪。因此,如果你运行last,只看见你的当前登录,这是不妙的信号。
如果没有登录历史,要抱着非常怀疑的态度,继续留意攻击的其他迹象。
检查第3步:回顾命令历史
这类层次的攻击者经常不会采取任何防范措施来掩盖命令历史记录,所以运行history 命令可显示他们在搞什么名堂。务必要留意有没有使用wget或curl命令来下载代码库外面的软件,比如垃圾邮件机器人程序或加密货币开采工具。
命令历史存储在~/.bash_history 文件中,所以一些攻击者会删除该文件,以掩盖其行踪。就跟登录历史一样,如果你运行history,但没有看到任何输出结果,那表明历史文件被删除了。这同样是个不妙的信号,你需要很小心地检查服务器。
检查第4步:谁在耗用全部CPU?
你会遇到的那类攻击者通常不会采取太多的防范措施来掩藏其行踪。所以,他们会运行耗用全部CPU的进程,因此很容易发现他们。只要运行top,然后看看耗用CPU最多的那个进程就行。
这还能显示那些未登录进来,但钻你服务器空子的攻击者。比如说,可能有人在使用未受保护的表单-邮件脚本来转发垃圾邮件。
如果你不认识耗用CPU最多的那个进程,可以上网搜索进程名称,或者借助losf和strace分析它在搞什么名堂。
想使用这些工具,先用top拷贝其PID,然后运行:
- strace -p PID
这会显示该进程做出的所有系统调用。这方面有大量信息,但细细查看一遍会让你清楚当前状况。
- lsof -p PID
这个程序会列出该进程拥有的已打开文件。只要查看它在访问哪些文件,你就清楚它在搞什么名堂。
检查第5步:检查所有的系统进程
如果某个未经授权的进程没有耗用足够的CPU,因而没有在top的输出结果中列出来,可以借助ps在完整进程列表中将它列出来。我建议使用的命令是ps auxf,它清楚地显示了最详细的信息。
你应该检查不认识的任何进程。你在服务器上越经常运行ps(这是个好习惯),某个奇怪的进程就会越暴露无遗。
检查第6步:检查各进程的网络使用情况
命令iftop的功能类似top,显示一份经过排序的列表,列出了发送和接收网络数据的进程及其源地址和目的地址。像拒绝服务攻击或垃圾邮件机器人程序这样的进程会立即显示在列表的顶端。
检查第7步:哪些进程在监听网络连接?
攻击者常常会安装一个程序,专门监听网络端口以接受指令。它在等待期间并不消耗CPU和带宽,所以可能会被top之类的命令所忽视。
lsof和netstat这两个命令都可列出所有的网络进程。我使用这些命令时附上下列选项:
- lsof -i
- netstat -plunt
你应该留意那些被列为处于LISTEN或ESTABLISHED状态的进程,因为这些进程要么在等待连接(LISTEN),要么已建立了连接(ESTABLISHED)。如果你不认识这些进程,使用strace或lsof看看它们在搞什么名堂。
二、我中招后该怎么办?
首先不要慌张,攻击者目前已登录时尤其不要慌张。你需要在攻击者察觉到你有所发觉之前夺回系统的控制权。如果他认识到你已有所发觉,很可能会将你锁在服务器外面,然后出于恶意开始破坏任何资产。
如果你技术不太好,只要关闭服务器。直接从服务器上运行shutdown -h now或systemctl poweroff。也可以登录进入到主机服务提供商的控制面板,关闭服务器。关机后,你就可以慢慢改动所需的防火墙规则,咨询提供商的意见。
如果你对自己颇有自信,主机服务提供商又有上游防火墙,那么你可以按这个顺序创建并启用下面两条规则:
- 只允许来自你的 IP地址的SSH流量。
- 阻挡除此之外的任何流量,不仅仅是SSH,还包括每个端口上的每个协议。
这会立即终止攻击者的SSH会话,只允许你访问服务器。
如果你无法访问上游防火墙,那么就要在服务器本身上创建并启用这些防火墙规则,然后防火墙规则生效后,使用kill命令终止攻击者的SSH会话。
最后一种方法是,通过诸如串行控制台之类的带外连接登录进入到服务器,然后使用 systemctl stop network.service终止网络功能。这将完全关闭任何网络连接,然后你就可以慢慢启用防火墙规则了。
一旦你重新控制了服务,别以为可以信任这台服务器了。
别试图修复问题后继续使用该服务器。你永远不知道攻击者干了什么,所以永远不知道这台服务器还是安全的。
唯一合理的办法就是拷贝出你需要的所有数据,开始重新安装。
原文标题:How To Tell If Your Linux Server Has Been Compromised
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】