这篇文章翻译自Analysing nefarious ssh access attempts,非核心内容有删改。

维护我自己的服务器让我在过去的若干年里面学会了很多事情。也让我对那些勇敢的同时维护多个服务器的系统管理员抱有更高的敬意。这篇文章将会讲述我在维护自己的服务器的过程中经常发生的一些奇怪的事情。

1 Analysing IP addresses

更准确地而言,我们在这里是要寻找对我们的服务器发出的恶意ssh访问请求。这里,恶意的访问请求是指使用无效的ssh密码来尝试访问服务器。由于我管理服务器上所有的用户都使用公钥来访问服务器,因此无效密码这个评价指标是非常站得住脚的。首先让我们收集一点证据。所有的认证请求都会被记录在/var/log/auth.log文件中(或者历史版本)。这个文件的结构非常简单:

1
2
Feb 25 00:07:21 myrddin sshd[22071]: Failed password for root from X.X.X.X port 493 ssh2
Feb 25 00:07:28 myrddin sshd[22075]: Invalid user ftpadmin from X.X.X.X port 567

这个文件中不只存储了sshd的认证请求,其他的,例如sudo的认证信息也在这个文件夹

注意到日志条目对于访问者是使用已有用户名还是不存在的用户名上,采用了不同的记录方式。作者用一个python脚本过滤枚举了所有的连接请求,并按照IP排序。一共有983892条记录(大概在一个月的时间里),其中大约17%可能与恶意访问有关。事实上在统计这个数字的时候已经忽略了无效密码【~这里的无效密码应该指不符合格式要求的密码,而非指错误的密码】和无效用户名的情况,所以17%这个数字其实是偏低的。

在进一步检查了IP来源之后我觉得更有意思了。大约3个独特的IP地址,占了所有无效密码请求的25%。为了隐私问题,这里不列举具体的IP了,不过可以说的是这三个IP地址的ISP都来自中国。其中两个是中国电信,另一个是中国联通,尽管这两个ISP都列出了投诉的邮件,不过作者怀疑举报了也不会有什么卵用。

接下来我尝试用nmap搜集更多的消息:

1
sudo nmap -O -Pn X.X.X.X

对于两个中国电信的IP地址,对方只开放了一个端口可以访问,为端口25。尽管这个端口我没法访问,不过nmap命令反映出对方可能是FreeBSD 6.2-Release系统【~这很可能指向的只是一个路由网关,而非实际的服务器】。不过对于第三个中国联通的IP地址,nmap挖掘出来的结果要更有意思一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Nmap scan report for X.X.X.X
Host is up (0.18s latency).
Not shown: 977 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp filtered http
111/tcp filtered rpcbind
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
199/tcp filtered smux
445/tcp filtered microsoft-ds
593/tcp filtered http-rpc-epmap
901/tcp filtered samba-swat
1025/tcp filtered NFS-or-IIS
1034/tcp filtered zincite-a
1068/tcp filtered instl_bootc
1434/tcp filtered ms-sql-m
3128/tcp filtered squid-http
4444/tcp filtered krb524
5800/tcp filtered vnc-http
5900/tcp filtered vnc
6006/tcp open X11:6
6129/tcp filtered unknown
6667/tcp filtered irc
6669/tcp filtered irc
8080/tcp filtered http-proxy
Device type: general purpose|WAP|storage-misc|broadband router
Running (JUST GUESSING): Linux 3.X|4.X|2.6.X|2.4.X (95%), Asus embedded (92%), HP embedded (91%)
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel cpe:/h:asus:rt-ac66u cpe:/h:hp:p2000_g3 cpe:/o:linux:linux_kernel:3.4 cpe:/o:linux:linux_kernel:2.6.22 cpe:/o:linux:linux_kernel:2.4
Aggressive OS guesses: Linux 3.10 - 4.11 (95%), Linux 3.13 (95%), Linux 3.13 or 4.2 (95%), Linux 4.2 (95%), Linux 4.4 (95%), Linux 3.16 (94%), Linux 3.16 - 4.6 (94%), Linux 3.12 (93%), Linux 3.2 - 4.9 (93%), Linux 3.8 - 3.11 (93%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 16 hops

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 58.88 seconds

这里显示服务器是使用的OpenSSH_6.9p1 Ubuntu-2 pat,可以使用密码或者秘钥登录。所以理论上我可以以其人之道还治其人之身。

2 Analysing User Names

让我们分析一下所有的恶意请求中使用的有效用户名的比例:

  1. root (98.42%)
  2. backup (0.29%)
  3. www-data (0.14%)
  4. ghost (0.11%)
  5. nobody (0.08%)

很明显绝大多数恶意请求的目标都是root。不过这些用户其实都不允许通过ssh登录的,攻击者不知道这点。对于使用无效用户名的登录请求,其分布就比较分散了。比例最高的10个我们列出如下:

  1. admin (4.57%)
  2. test (3.81%)
  3. user (3.07%)
  4. ubuntu (2.64%)
  5. ftpuser (2.40%)
  6. postgres (1.19%)
  7. oracle (1.10%)
  8. nagios (1.08%)
  9. git (0.92%)
  10. teamspeak (0.89%)

3 Analysis Countries

最后我想可视化地呈现以下恶意访问的来源情况。最后选定的可视化工具是plotly

这里我们可以看到最容易被攻击的还是root账户。禁止root账户使用ssh登录可以让你免疫绝大多数ssh攻击。禁止的方法参考:Security Tip: Disable Root SSH Login on Linux