如何判断 Linux 服务器是否被入侵？
=========================

本指南中所谓的服务器被入侵或者说被黑了的意思，是指未经授权的人或程序为了自己的目的登录到服务器上去并使用其计算资源，通常会产生不好的影响。

免责声明：若你的服务器被类似 NSA 这样的国家机关或者某个犯罪集团入侵，那么你并不会注意到有任何问题，这些技术也无法发觉他们的存在。

然而，大多数被攻破的服务器都是被类似自动攻击程序这样的程序或者类似“脚本小子”这样的廉价攻击者，以及蠢蛋罪犯所入侵的。

这类攻击者会在访问服务器的同时滥用服务器资源，并且不怎么会采取措施来隐藏他们正在做的事情。

### 被入侵服务器的症状

当服务器被没有经验攻击者或者自动攻击程序入侵了的话，他们往往会消耗 100% 的资源。他们可能消耗 CPU 资源来进行数字货币的采矿或者发送垃圾邮件，也可能消耗带宽来发动 DoS 攻击。

因此出现问题的第一个表现就是服务器 “变慢了”。这可能表现在网站的页面打开的很慢，或者电子邮件要花很长时间才能发送出去。

那么你应该查看那些东西呢?

#### 检查 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，那么请参阅最后章节。

登录后的历史记录会记录到二进制的 `/var/log/wtmp` 文件中（LCTT 译注：这里作者应该写错了，根据实际情况修改），因此很容易被删除。通常攻击者会直接把这个文件删掉，以掩盖他们的攻击行为。 因此, 若你运行了 `last` 命令却只看得见你的当前登录，那么这就是个不妙的信号。

如果没有登录历史的话，请一定小心，继续留意入侵的其他线索。

#### 检查 3 - 回顾命令历史

这个层次的攻击者通常不会注意掩盖命令的历史记录，因此运行 `history` 命令会显示出他们曾经做过的所有事情。
一定留意有没有用 `wget` 或 `curl` 命令来下载类似垃圾邮件机器人或者挖矿程序之类的非常规软件。

命令历史存储在 `~/.bash_history` 文件中，因此有些攻击者会删除该文件以掩盖他们的所作所为。跟登录历史一样，若你运行 `history` 命令却没有输出任何东西那就表示历史文件被删掉了。这也是个不妙的信号，你需要很小心地检查一下服务器了。（LCTT 译注，如果没有命令历史，也有可能是你的配置错误。）

#### 检查 4 - 哪些进程在消耗 CPU？

你常遇到的这类攻击者通常不怎么会去掩盖他们做的事情。他们会运行一些特别消耗 CPU 的进程。这就很容易发现这些进程了。只需要运行 `top` 然后看最前的那几个进程就行了。

这也能显示出那些未登录进来的攻击者。比如，可能有人在用未受保护的邮件脚本来发送垃圾邮件。

如果你最上面的进程对不了解，那么你可以 Google 一下进程名称，或者通过 `losf` 和 `strace` 来看看它做的事情是什么。

使用这些工具，第一步从 `top` 中拷贝出进程的 PID，然后运行：

```
strace -p PID
```

这会显示出该进程调用的所有系统调用。它产生的内容会很多，但这些信息能告诉你这个进程在做什么。

```
lsof  -p PID
```

这个程序会列出该进程打开的文件。通过查看它访问的文件可以很好的理解它在做的事情。

#### 检查 5 - 检查所有的系统进程

消耗 CPU 不严重的未授权进程可能不会在 `top` 中显露出来，不过它依然可以通过 `ps` 列出来。命令 `ps auxf` 就能显示足够清晰的信息了。

你需要检查一下每个不认识的进程。经常运行 `ps` （这是个好习惯）能帮助你发现奇怪的进程。

#### 检查 6 - 检查进程的网络使用情况

`iftop` 的功能类似 `top`，它会排列显示收发网络数据的进程以及它们的源地址和目的地址。类似 DoS 攻击或垃圾机器人这样的进程很容易显示在列表的最顶端。

#### 检查 7 - 哪些进程在监听网络连接?

通常攻击者会安装一个后门程序专门监听网络端口接受指令。该进程等待期间是不会消耗 CPU 和带宽的，因此也就不容易通过 `top` 之类的命令发现。

`lsof` 和 `netstat` 命令都会列出所有的联网进程。我通常会让它们带上下面这些参数：

```
lsof -i
```

```
netstat -plunt
```

你需要留意那些处于 `LISTEN` 和 `ESTABLISHED` 状态的进程，这些进程要么正在等待连接（LISTEN），要么已经连接（ESTABLISHED）。如果遇到不认识的进程，使用 `strace` 和 `lsof` 来看看它们在做什么东西。

### 被入侵之后该怎么办呢?

首先，不要紧张，尤其当攻击者正处于登录状态时更不能紧张。**你需要在攻击者警觉到你已经发现他之前夺回机器的控制权。**如果他发现你已经发觉到他了，那么他可能会锁死你不让你登陆服务器，然后开始毁尸灭迹。

如果你技术不太好那么就直接关机吧。你可以在服务器上运行 `shutdown -h now` 或者 `systemctl poweroff` 这两条命令之一。也可以登录主机提供商的控制面板中关闭服务器。关机后，你就可以开始配置防火墙或者咨询一下供应商的意见。

如果你对自己颇有自信，而你的主机提供商也有提供上游防火墙，那么你只需要以此创建并启用下面两条规则就行了：

1. 只允许从你的 IP 地址登录 SSH。
2. 封禁除此之外的任何东西，不仅仅是 SSH，还包括任何端口上的任何协议。

这样会立即关闭攻击者的 SSH 会话，而只留下你可以访问服务器。

如果你无法访问上游防火墙，那么你就需要在服务器本身创建并启用这些防火墙策略，然后在防火墙规则起效后使用 `kill` 命令关闭攻击者的 SSH 会话。（LCTT 译注：本地防火墙规则 有可能不会阻止已经建立的 SSH 会话，所以保险起见，你需要手工杀死该会话。）

最后还有一种方法，如果支持的话，就是通过诸如串行控制台之类的带外连接登录服务器，然后通过 `systemctl stop network.service` 停止网络功能。这会关闭所有服务器上的网络连接，这样你就可以慢慢的配置那些防火墙规则了。

重夺服务器的控制权后，也不要以为就万事大吉了。

不要试着修复这台服务器，然后接着用。你永远不知道攻击者做过什么，因此你也永远无法保证这台服务器还是安全的。

最好的方法就是拷贝出所有的数据，然后重装系统。（LCTT 译注：你的程序这时已经不可信了，但是数据一般来说没问题。）

--------------------------------------------------------------------------------

via: https://bash-prompt.net/guides/server-hacked/

作者：[Elliot Cooper][a]
译者：[lujun9972](https://github.com/lujun9972)
校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

[a]:https://bash-prompt.net
