实录:公有云环境碰上 SSH 攻击的盛况

356 天前
 MFWT

背景

香港主力加密代理小鸡,系统自带 Fail2Ban 。虽然说密码强度足够,也未泄露,而且机器对外只提供 SSH 登录和酸酸服务,炸了也不心疼
但是,还是感觉心里发毛,于是大约三天前上了密钥登录,关掉了密码登录
干完这件事之后,我一时兴起,决定看看登录日志,看看 SSH 失败登录的情况到底有多严重
不看不知道,一看吓一跳,只能说这机器活到现在,那个复杂的密码真的是辛苦他了.....

简单统计

统计周期:从 4/30 到今天( 5/10 ),也就是十天左右的时间

  1. 服务器记录了八万多行的登录日志,按平均一次登录尝试打 5 条 log 算,这十天遭受了超过 1.5 万次的 SSH 爆破
  2. 用 Python 做了脚本(脚本在文末),简单分析了一下日志,导出并去重之后测出了1644 个尝试用于登录的用户名。这里从文件中列举几个常见的和不常见的:

还是那个日志,统计了连上来的493 个 IP,择取归属地数量前五的如下:

us 99
cn 70
kr 48
au 33
de 25

举两个例子,美国可能是因为 VPS 较为低价,人们大量购买(建站,加密代理之类的),但安全措施没有做足(简单用户名,简单密码,没有 Fail2Ban 等防护软件 —— 至于你说是不是 22 端口,我感觉关系不大,毕竟 SSH 不防主动探测,换个端口,可能消停两天又开始了),导致成为了别人的肉鸡

至于中国 IP ,从具体属地等信息来看,不乏家宽 IP 。推测除了购买家宽代理之外,也有可能是用户电脑由于安装了各种流氓软件等等原因,成为了人家的肉鸡

众生百态

分析日志让人哑然失笑,此处列举几个登陆攻击的行为,与君共赏——

这是不知所云(非 SSH 请求发到了 SSH 端口)

sshd[895175]: error: kex_exchange_identification: banner line contains invalid characters
sshd[895175]: banner exchange: Connection from 213.*.*.98 port 64661: invalid format

这是知难而退(服务器关闭了密码登录)

sshd[894967]: Received disconnect from 134.*.*.178 port 58562:11: Bye Bye [preauth]
sshd[894967]: Disconnected from authenticating user root 134.*.*.178 port 58562 [preauth]
sshd[894969]: Received disconnect from 192.*.*.50 port 51560:11: Bye Bye [preauth]
sshd[894969]: Disconnected from authenticating user root 192.*.*.50 port 51560 [preauth]
sshd[894971]: Received disconnect from 200.*.*.234 port 51036:11: Bye Bye [preauth]
sshd[894971]: Disconnected from authenticating user root 200.*.*.234 port 51036 [preauth]

这是爱如潮水(注意 IP 和时间)

20:00:23 - sshd[895661]: Invalid user dockeradmin from 144.*.*.23 port 40902
20:00:23 - sshd[895666]: Invalid user ubnt from 144.*.*.23 port 40990
20:00:23 - sshd[895673]: Invalid user steam from 144.*.*.23 port 41008
.....
20:00:23 - sshd[895678]: Invalid user postgres from 144.*.*.23 port 40994
......
20:00:23 - sshd[895659]: Connection closed by invalid user devops 144.*.*.23 port 40862 [preauth]
......
20:00:23 - sshd[895668]: Connection closed by invalid user zjw 144.*.*.23 port 41004 [preauth]

这是锲而不舍(同一用户名不同密码多次登录)

sshd[912780]: Disconnecting authenticating user root 59.*.*.186 port 52862: Too many authentication failures [preauth]
sshd[912782]: error: maximum authentication attempts exceeded for root from 59.102.161.186 port 52911 ssh2 [preauth]

这是老子!

sshd[921821]: Accepted publickey for root from 2409:****:****:**** port 6**** ssh2: RSA SHA256:****....
sshd[921821]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
systemd-logind[331]: New session **** of user root.

后日谈

我感觉,最根本的防止被爆破 SSH 成功的方法只有三个:

  1. 不允许非授权的 IP 连接
  2. 使用足够长的私钥(比如 4096Bit )代替密码进行验证
  3. 不开放 SSH 登录端口(比如,通过 VPN 连入内网环境后再登录)

虽然说这台机器只是酸酸机,但是鬼知道被爆破后会不会变成下一台肉鸡? 世事难料,不如小心行船,方得万年平安
又或许,我可以允许任意用户名通过,然后连上来的用户都用 ASCII 播放一遍鸡你太美?

后附统计脚本


filename = 'auth.log'

for line in open(filename, "r"):

    if(line.find('sshd') == -1):
        #非 SSHD 日志,跳过
        continue

    if(line.find('Invalid user') != -1):
        #空格分隔后的日志,第五和第七位是用户名和 IP 信息
        #实际检测请根据实际情况修改截断格式
        print(line.split(" ")[5] + "," + line.split(" ")[7])


深山踏红叶,耳畔闻鹿鸣
全文完,感谢阅读

7550 次点击
所在节点    云计算
86 条回复
mikewang
356 天前
看了下我的 fail2ban ,哪天来兴趣了分析一下...

Status for the jail: sshd
|- Filter
| |- Currently failed: 13
| |- Total failed: 130963
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 16095
|- Total banned: 29418
`- Banned IP list: ...
dode
356 天前
好麻烦,终究还是搞了白名单 ssh_ip
lwjef
356 天前
先把 22 换个高位,先把端口扫出来再说吧。😬
hefish
356 天前
只是用工具和字典 挂那儿跑。 并不是真的在尝试登录。 基本上只要公网上开端口,用不了多久总有人来扫。没办法的。
swsh007
356 天前
密钥是必须,高位随便扫,其实用那些套了一层防火墙的直接闭了就是,需要用再开最彻底。
realJamespond
356 天前
为啥不禁密码登录?
chinni
356 天前
根本无所谓 直接 只允许 key 登录就好了 其他没啥用
MFWT
356 天前
@hefish #4

对啊,所以我用的是盛况一词
公网开服务,没有动静那才叫怪
MFWT
356 天前
@realJamespond #6 大哥你要不看看我第二行写的啥....
Soo0
356 天前
改端口 白名单,密码关了 开密钥登录 ,实在不行直接关了,自己要用的时候在开,用完关了
showgood163
356 天前
个人在 VPS 上采用的防护策略

防火墙关闭未使用端口
高位 SSH 端口
SSH 强账号密码
3 次登录失败直接 BAN IP ,封禁时间长达一年的的 fail2ban

下面是积攒小半年的结果

```
Status for the jail: sshd
|- Filter
| |- Currently failed: 201
| |- Total failed: 1421
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 5483
|- Total banned: 5483
```
SFJ4MEGabMk2
356 天前
SSH 只开在 IPv6 地址上
est
356 天前
可以试试做一个蜜罐。无论你输入什么账号密码都能进入一个啥命令都干不了的假 shell 。
LittleState
356 天前
@showgood163 #11 啊,都这样了还有这么多吗,话说我只允许密钥登陆应该没啥因患了吧?
zydxn
356 天前
噗,这是老子笑死
MFWT
356 天前
@est #13 真男人从不回头用蜜罐,直接 sshd (
showgood163
356 天前
@LittleState

只允许密钥登录的安全系数,比我做的几件事加起来都高

前提是密钥没泄露
mikespook
356 天前
所以,之前是 root 挂密码在跑?这和过个浴巾裸奔有什么区别?
现在是 root 用 key pair 的话,大约也就是穿个泳衣逛街了……
MFWT
356 天前
@mikespook #18 泳衣逛街总比只挂浴巾来得好
f165af34d4830eeb
356 天前
首先不建议直接通过 ssh 登录 root 用户

其次建议考虑使用 ssh over vpn 的方式使用(比如 zerotier ),比直接暴露在公网上安全很多

如果有必要可以允许白名单 ip 在公网直接访问 ssh ,作为 vpn 失效时的 fallback 手段。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/939018

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX