实录:公有云环境碰上 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])


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

7611 次点击
所在节点    云计算
86 条回复
nznd
2023-05-10 22:38:56 +08:00
顺带问一下,如果用 frp 转发本地 22 端口到公网服务器的一个高位端口,总是被爆破怎么办,无法使用 fail2ban ,因为源 ip 是 127.0.0.1 ,已经关闭密码登录,只开启 ssh key 登录。设备是树莓派,总是半夜看到硬盘灯一直在亮,上去一看有人在爆破...
MFWT
2023-05-10 22:47:06 +08:00
@nznd #21 建议就是不要直接暴露咯,在公网服务器用 VPN 做鉴权或者 iptables 只允许指定 ip 连接
nznd
2023-05-10 22:49:27 +08:00
@MFWT #22 主要是来给快捷指令 ssh 上去执行 py 脚本的,vpn 、指定 ip 和鉴权都有点难接入
eb0c6551
2023-05-10 22:54:02 +08:00
这就让脚本扫有什么实际影响吗?安全系数本来就由你的密钥强度决定。如果有合理的密钥强度,让扫个几百年也没关系。
shangyu7
2023-05-10 23:00:48 +08:00
挺正常的,你用户名和密码够长一般也没啥问题
Remember
2023-05-10 23:08:44 +08:00
互联网背景噪音而已,几十年来都是这样,用不着大惊小怪的。
cwcc
2023-05-10 23:41:40 +08:00
“互联网背景噪音而已,几十年来都是这样,用不着大惊小怪的。” 说得非常有画面感。

另外,如果闲得慌,还可以弄个假 shell ,就是让那些爆破的人能登录上来,记录他们输入的命令,观察行为,反向渗透( doge ,别问我为什么这么说)。
y1y1
2023-05-10 23:54:26 +08:00
记得之前用 vultr ,每次新开一台过不了多久就开始疯狂尝试登陆
tin3w5
2023-05-10 23:58:38 +08:00
我是自己写的 shell 脚本定期把登录失败超过三次的 ip 打到一个 ipset 里,然后 iptables 干掉这个 ip ,每天条目不少于 300 个。
此外,博客的 web 日志更逗比,一天能有好几百条到一千多条扫描记录,而且是盲扫——没有主机名,只有 IP ,扫不出来还非要继续扫……
leaflxh
2023-05-11 00:01:31 +08:00
据说 ipv4 公网扫一边用不了多久
leaflxh
2023-05-11 00:05:42 +08:00
(大概开 5 万台机器,一共四十三亿个地址,抛开私网地址,一秒一个,一天就能扫完
nuk
2023-05-11 00:08:33 +08:00
看了下,今年已经被尝试 100 多万次密码了,密码设置长一点,不要在其他地方用一样的密码,基本上就没问题了
# cat secure-2023* |gunzip |grep "Failed password" |wc
1029237 15372263 113160720
chesha1
2023-05-11 00:32:16 +08:00
开个 fail2ban 几乎不会有问题,ssh 算是好处理的了,你要是部署其他 web 服务就麻烦得多了
512357301
2023-05-11 00:32:42 +08:00
小白借楼问一句,我在 aws 搞了台免费的 ec2 ,只开了 22 和 60000 以上的高位端口,系统装的 ubuntu20.04 ,登录的话按照官方给的 ssh 方式,用.pem 文件作为密钥登录的,没用密码。
话说这种方式安全吗,还用搞 fail2ban 吗?需不需要做其他的加强?真心求教各位,拱手.jpg
churchmice
2023-05-11 00:52:54 +08:00
@512357301 安全得很,把密钥长度搞成 4096 的或者换成 ecc 就更安全了,他有这能耐破解你的 RSA/ECC,直接去攻击银行好了
lostberryzz
2023-05-11 01:02:07 +08:00
qps 只有不到 1 的扫描,开 fail2ban 我还嫌占资源,个人观点仅限密钥登陆即可,或者懒一点强密码也不是不行吧
billccn
2023-05-11 06:17:35 +08:00
最稳妥是需要 SSH 的时候进控制面板,用网页版控制台给自己 IP 加一个规则。当然这个只对 VPS 有效,独立主机需要自己整。

我还在 22 端口弄了一个蜜罐,把 TCP window 设置成 1 ,浪费攻击者 CPU 。下面准备研究一下 SSH 客户端有没有漏洞,反攻回去。
MFWT
2023-05-11 08:28:22 +08:00
@eb0c6551 #24
@Remember #26

应该说,对我的影响几乎为零,所以题目中的『攻击』确实有失偏颇,调整为『扫描』之类的可能会好些
baobao1270
2023-05-11 08:30:37 +08:00
「这是老子」楼主说话好可爱(

公网环境确实像黑暗森林,到处都是自动扫描的机器人,其实你开了 HTTP 服务器还能看到一堆自动扫 /wp-admin 尝试弱密码的呢。VPS 上天天都有一堆 SSH 登录失败日志,我从来管,只是定期清理防止占用过大。毕竟我已经习惯密钥登录了,我的所有机器都会执行我自己写的脚本来自动从 GitHub 下载我的公钥并配置只允许密钥登录。

「最根本的防止被爆破 SSH 成功的方法只有三个」,其实 1 并不是:IP 来源端口可能被伪造,而自己的 IP 地址也可能会变动。而 2 、3 只要做到一个就行。

最后楼主选择了「 RSA 2048 」的密钥,其实用 ED25519 更好,密钥更短、性能更强的同时也有 RSA 3000bits 左右的强度。
MFWT
2023-05-11 09:16:47 +08:00
@baobao1270 #39 我的 PuTTYGEN 默认设置的是 RSA2048 ,有时间我也试试 25519

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

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

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

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

© 2021 V2EX