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

2023-05-10 21:33:47 +08:00
 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])


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

9578 次点击
所在节点    云计算
86 条回复
skyrim61
2023-05-11 09:17:22 +08:00
很多系统上 可能还不支持 ed25519
MFWT
2023-05-11 09:22:06 +08:00
@baobao1270 #39

检查 OpenSSH 确定支持之后,换成了 25519 测试了一下,确实登录快了很多
dier
2023-05-11 09:22:57 +08:00
十天才 1.5 万次,前天我有个服务器 75 分钟,同一个 IP 都试了 3.6 万次
lakehylia
2023-05-11 09:43:47 +08:00
找密钥生成器生成够长的密钥呗
peasant
2023-05-11 10:02:30 +08:00
我在境外的机器都是只允许密钥登录,然后有一台国内的机器,境外机器的 22 端口只允许国内机器的 IP 连接,每次都是先连接国内机器再连境外的机器。
MoeMoesakura
2023-05-11 10:10:41 +08:00
纯 codeserver 用途,基本没用 ssh 登陆( ssh 是密钥登录)
root@instance-20*******-2**7 ~/workdir# lastb |wc -l
27705
MoeMoesakura
2023-05-11 10:13:22 +08:00
@cwcc #27 实际上确实可以,22 放一个蜜罐然后别的端口放 ssh (毕竟脚本只会扫 22 )
Bingchunmoli
2023-05-11 10:16:10 +08:00
Fail2Ban 不会配起不起来, 密码登录还是有用的,私钥不可能随时带着
documentzhangx66
2023-05-11 10:30:10 +08:00
说了很多次,公网云主机,管理端口( mstsc 、ssh 等)一定要开 IP 白名单。

开白名单后,直接挡住 99.99% 的攻击。

开白名单的方法很简单,联系运营商客服咨询,以及观察你自己网络在公网上所处网段。

比如电信家宽,如果你的 IP 为 1.2.3.4 ,

那么 IP 白名单开一个 1.2.0.0 / 16 就行了,也就是说对于 1.2.*.* 都允许访问。

然后 Linux 安装 fail2ban ,windows 安装 wail2ban 密码用 16 位复杂密码,直接无敌。
Ally
2023-05-11 10:50:51 +08:00
前端时间开的一个腾讯轻量云,SSH 一直在被人爆破,日志都不停得打印,也没管过。后来不胜其烦,关了密码登录,只用密钥了
enrolls
2023-05-11 12:23:27 +08:00
`journalctl -t sshd` 看看失败的日志

`journalctl --disk-usage` 看看日志的硬盘占用
lifanxi
2023-05-11 12:35:38 +08:00
我用 Port Knocking ,方便和安全平衡。
Deplay
2023-05-11 12:38:06 +08:00
之前有一台,7 天 16 万次
qbqbqbqb
2023-05-11 12:51:20 +08:00
@skyrim61 不支持 25519 的大多数是嵌入式的吧,比如 OpenWRT 官方发行版默认用 Dropbear SSH 服务端,只编译了 RSA 的支持,想要别的得自己编译。

正常的桌面 /服务器 Linux+OpenSSH 很少有不支持的。
luxor
2023-05-11 12:59:02 +08:00
这些爆破攻击基本上都来自蠕虫,改端口是没用的,采用公钥认证即可保证安全。
qbqbqbqb
2023-05-11 13:03:41 +08:00
@Bingchunmoli 私钥随身带着本来就是一个伪需求,一般来说要想安全首先就得用固定的电脑远程登录服务器,随便用别人的电脑远程登录本身就不安全了。如果是用自己的一台服务器(跳板机)登录另一台的话也不必要传输私钥,可以用 agent forwarding 。

另外想要安全地随身带私钥也不是不可以,有 Yubikey 这种硬件 key 。

密码登录唯一的用处就是组织合规,毕竟公司的服务器肯定是统一管理登录权限,不可能让你注册自己的私钥免密码登录,就只能用密码。

如果是个人全权使用的场景,私钥登录绝大多数情况下优于密码登录。
opentrade
2023-05-11 13:09:28 +08:00
看了一下我的 10+台服务,没被攻击,好失落
strp
2023-05-11 13:14:32 +08:00
root@localhost:~# lastb |wc -l
145435
qbqbqbqb
2023-05-11 13:20:26 +08:00
@lwjef 改端口用处不大,v2ex 上就有一个“路由器六万高端口转发 3389”被爆破的例子,还有一个 9022 端口 ssh 树莓派因为用纯数字密码被爆破。而且如果服务器是红帽系( CentOS ,Fedora 等)又没关 SELinux 的话,不清楚情况贸然改端口可能会把自己锁在外面。

一般来说仅密钥登录就足够安全了。要隐藏端口还是得用 VPN ,所有内部服务只开放到内网和 VPN ,禁止公网直连。
tsanie
2023-05-11 13:44:03 +08:00
@qbqbqbqb openwrt 22 中的 dropbear 也支持 ed25519 了

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

https://ex.noerr.eu.org/t/939018

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

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

© 2021 V2EX