如何检查linux服务器是否被入侵

被入侵服务器的症状

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

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

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

检查 1 - 当前都有谁在登陆?bash

你首先要查看当前都有谁登陆在服务器上。发现攻击者登陆到服务器上进行操做并不复杂。服务器

其对应的命令是 w。运行 w 会输出以下结果:网络

  1.  08:32:55 up 98 days,  5:43,  2 users,  load average: 0.05, 0.03, 0.00 
  2. USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT 
  3. root     pts/0    113.174.161.1    08:26    0.00s  0.03s  0.02s ssh root@coopeaa12 
  4. root     pts/1    78.31.109.1      08:26    0.00s  0.01s  0.00s w 

第一个 IP 是英国 IP,而第二个 IP 是越南 IP。这个不是个好兆头。session

停下来作个深呼吸, 不要恐慌之下只是干掉他们的 SSH 链接。除非你可以防止他们再次进入服务器,不然他们会很快进来并踢掉你,以防你再次回去。ssh

请参阅本文最后的“被入侵以后怎么办”这一章节来看找到了被入侵的证据后应该怎么办。curl

whois 命令能够接一个 IP 地址而后告诉你该 IP 所注册的组织的全部信息,固然就包括所在国家的信息。编辑器

检查 2 - 谁曾经登陆过?

Linux 服务器会记录下哪些用户,从哪一个 IP,在何时登陆的以及登陆了多长时间这些信息。使用 last 命令能够查看这些信息。

输出相似这样:

  1. root     pts/1        78.31.109.1      Thu Nov 30 08:26   still logged in 
  2.  
  3. root     pts/0        113.174.161.1    Thu Nov 30 08:26   still logged in 
  4.  
  5. root     pts/1        78.31.109.1      Thu Nov 30 08:24 - 08:26  (00:01) 
  6.  
  7. root     pts/0        113.174.161.1    Wed Nov 29 12:34 - 12:52  (00:18) 
  8.  
  9. 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,而后运行:

  1. strace -p PID 

这会显示出该进程调用的全部系统调用。它产生的内容会不少,但这些信息能告诉你这个进程在作什么。

  1. lsof  -p PID 

这个程序会列出该进程打开的文件。经过查看它访问的文件能够很好的理解它在作的事情。

检查 5 - 检查全部的系统进程

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

你须要检查一下每一个不认识的进程。常常运行 ps (这是个好习惯)能帮助你发现奇怪的进程。

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

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

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

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

lsof 和 netstat 命令都会列出全部的联网进程。我一般会让它们带上下面这些参数:

  1. lsof -i 
  1. 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 中止网络功能。这会关闭全部服务器上的网络链接,这样你就能够慢慢的配置那些防火墙规则了。

重夺服务器的控制权后,也不要觉得就万事大吉了。

不要试着修复这台服务器,而后接着用。你永远不知道攻击者作过什么,所以你也永远没法保证这台服务器仍是安全的。

 

 

 

用户登陆相关日志文件:

utmp、wtmp、btmp文件

Linux用户登陆信息放在三个文件中:

1  /var/run/utmp:记录当前正在登陆系统的用户信息,默认由who和w记录当前登陆用户的信息,uptime记录系统启动时间;

2  /var/log/wtmp:记录当前正在登陆和历史登陆系统的用户信息,默认由last命令查看;

3  /var/log/btmp:记录失败的登陆尝试信息,默认由lastb命令查看。

这三个文件都是二进制数据文件,而且三个文件结构彻底相同,是由/usr/include/bits/utmp.h文件定义了这三个文件的结构体。

默认状况下文件的日志信息会经过logrotate日志管理工具按期清理。logrotate的配置文件是/etc/logrotate.conf,此处是logrotate的缺省设置,一般不须要对它进行修改。日志文件的轮循压缩等设置存放在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下,它会覆盖缺省设置。

若是不想记录相关信息,则能够直接将相关文件删除便可。若是系统不存在该文件,则须要在此路径touch一个文件就能够继续记录相关信息了。

此外:

若是想禁用who命令,则只须要将utmp的可读权限去掉就行,这样非root用户就不能用此命令了;若是是btmp文件,手工建立的话注意权限必须为600,不然不能正确写入信息。 

相关命令:

lastlog、last、lastb、ac、whow、users、utmpdump。

其中last、lastb、who、utmpdump能够经过指定参数而查看三个中的任意一个文件。

 

2.1 lastlog:

列出全部用户最近登陆的信息,或者指定用户的最近登陆信息。lastlog引用的是/var/log/lastlog文件中的信息,包括login-name、port、last login time

复制代码
复制代码
lzx-clone1:/var/log # lastlog
Username                Port     Latest
root                pts/1    Wed Oct 19 14:37:46 +0800 2016
bin                          **Never logged in**
daemon                       **Never logged in**
gdm                          **Never logged in**
admin                        **Never logged in**
lzx                 pts/3    Wed Oct 19 15:15:24 +0800 2016
复制代码
复制代码

 2.2 last

列出当前和曾经登入系统的用户信息,它默认读取的是/var/log/wtmp文件的信息。输出的内容包括:用户名、终端位置、登陆源信息、开始时间、结束时间、持续时间。注意最后一行输出的是wtmp文件起始记录的时间。固然也能够经过last -f参数指定读取文件,能够是/var/log/btmp、/var/run/utmp

复制代码
复制代码
[root@CLMUGR-APP-D-01 log]# last

root     pts/0        10.200.108.92    Tue Oct 18 15:04   still logged in  

root     pts/1        10.200.108.92    Wed Oct 12 17:02   still logged in  

root     pts/0        10.200.108.92    Wed Oct 12 09:20 - 16:58  (07:38)   

root     pts/0        10.200.108.92    Sat Oct  8 10:40 - 14:45  (04:05)   

root     pts/0        10.200.108.92    Wed Aug 31 10:52 - 08:44  (21:52)   

root     pts/0        10.200.108.92    Fri Jul  8 13:08 - 09:41 (25+20:32)

reboot   system boot  2.6.32-431.el6.x Tue Jan 13 19:40 - 19:44  (00:04) 
 

wtmp begins Tue Jan 13 19:40:22 2015 
复制代码
复制代码

2.3 lastb

列出失败尝试的登陆信息,和last命令功能彻底相同,只不过它默认读取的是/var/log/btmp文件的信息。固然也能够经过last -f参数指定读取文件,能够是/var/log/btmp、/var/run/utmp

复制代码
复制代码
[root@CLMUGR-APP-D-01 log]# lastb

root     ssh:notty    10.200.108.92    Wed Oct 19 17:11 - 17:11  (00:00)   

root     ssh:notty    10.200.108.92    Wed Oct 19 17:11 - 17:11  (00:00)   

root     ssh:notty    10.200.108.92    Wed Oct 19 17:10 - 17:10  (00:00)   

root     ssh:notty    10.200.108.92    Wed Oct 19 17:10 - 17:10  (00:00)   
 

btmp begins Wed Oct 19 17:10:12 2016
复制代码
复制代码
lzx-clone1:/var/log # lastb -F -f /var/log/wtmp
root     pts/0        10.200.108.92    Tue Mar  8 11:04:36 2016 - Tue Mar  8 11:04:36 2016  (00:00)    

wtmp begins Tue Mar  8 11:04:36 2016

2.4 ac

输出全部用户总的链接时间,默认单位是小时。因为ac是基于wtmp统计的,因此修改或者删除wtmp文件都会使ac的结果受影响。(Suse默认没有该命令)

[root@cloudexpress ~]# ac

         total     7404.62 

 2.5 who

查看当前登入系统的用户信息。其中who -m等效于who am i。

语法who [OPTION]... [ FILE | ARG1 ARG2 ]。

who命令强大的一点是,它既能够读取utmp文件也能够读取wtmp文件,默认没有指定FILE参数时,who查询的是utmp的内容。固然能够指定FILE参数,好比who -aH /var/log/wtmp,则此时查看的是wtmp文件。

查看当前运行级别

[root@CLMUGR-APP-D-01 log]# who -rH

名称   线路       时间           空闲  进程号 备注

         运行级别 5 2016-07-08 13:01

查看登陆用户和用户数≈users

lzx-clone1:/var/run # who -q

root root root root

# users=4

2.6 w

查看当前登入系统的用户信息及用户当前的进程(而who命令只能看用户不能看进程)。该命令能查看的信息包括字系统当前时间,系统运行时间,登录系统用户总数及系统一、五、10分钟内的平均负载信息。后面的信息是用户,终端,登陆源,login time,idle time,JCPU,PCPU,当前执行的进程等。

w的信息来自两个文件:用户登陆信息来自/var/run/utmp,进程信息来自/proc/.

复制代码
复制代码
lzx-clone1:/var/log # w
 15:26:40 up 12 days, 56 min,  4 users,  load average: 0.14, 0.16, 0.20
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     :0        10Oct16 ?xdm?  43:33   0.69s /usr/bin/gnome-session
root     pts/0     Wed14   40.00s  0.19s  0.00s w
root     pts/1     Wed14   23:01m  0.06s  0.06s -bash
root     pts/2     10Oct16  9days  0.01s  0.01s /bin/bash -l
复制代码
复制代码

2.7 users

显示当前正在登入统的用户名。语法是users [OPTION]... [FILE]。若是未指定FILE参数则默认读取的是/var/run/utmp,固然也能够指定通用相关文件/var/log/wtmp,此时输出的就不是当前用户了。

[root@CLMUGR-APP-D-01 log]# users

root root

 2.8 utmpdump

utmpdump用于转储二进制日志文件到文本格式的文件以便查看,同时也能够修改二进制文件!!包括/var/run/utmp、/var/log/wtmp、/var/log/btmp。语法为:utmpdump [options] [filename]。修改文件实际就能够抹除系统记录,因此必定要设置好权限,防止非法入侵。

例子:修改utmp或wtmp。因为这些都是二进制日志文件,你不能像编辑文件同样来编辑它们。取而代之是,你能够将其内容输出成为文本格式,并修改文本输出内容,而后将修改后的内容导入回二进制日志中。以下: 

utmpdump /var/log/utmp > tmp_output.txt          #导出文件信息

                                                 #<使用文本编辑器修改 tmp_output.txt>

utmpdump -r tmp_output.txt > /var/log/utmp       #导入到源文件中